xref: /openbmc/linux/sound/usb/line6/midi.h (revision 61864d844c296933d40c02683252bbea5193b101)
1*61864d84STakashi Iwai /*
2*61864d84STakashi Iwai  * Line6 Linux USB driver - 0.9.1beta
3*61864d84STakashi Iwai  *
4*61864d84STakashi Iwai  * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
5*61864d84STakashi Iwai  *
6*61864d84STakashi Iwai  *	This program is free software; you can redistribute it and/or
7*61864d84STakashi Iwai  *	modify it under the terms of the GNU General Public License as
8*61864d84STakashi Iwai  *	published by the Free Software Foundation, version 2.
9*61864d84STakashi Iwai  *
10*61864d84STakashi Iwai  */
11*61864d84STakashi Iwai 
12*61864d84STakashi Iwai #ifndef MIDI_H
13*61864d84STakashi Iwai #define MIDI_H
14*61864d84STakashi Iwai 
15*61864d84STakashi Iwai #include <sound/rawmidi.h>
16*61864d84STakashi Iwai 
17*61864d84STakashi Iwai #include "midibuf.h"
18*61864d84STakashi Iwai 
19*61864d84STakashi Iwai #define MIDI_BUFFER_SIZE 1024
20*61864d84STakashi Iwai 
21*61864d84STakashi Iwai struct snd_line6_midi {
22*61864d84STakashi Iwai 	/**
23*61864d84STakashi Iwai 		 Pointer back to the Line6 driver data structure.
24*61864d84STakashi Iwai 	*/
25*61864d84STakashi Iwai 	struct usb_line6 *line6;
26*61864d84STakashi Iwai 
27*61864d84STakashi Iwai 	/**
28*61864d84STakashi Iwai 		 MIDI substream for receiving (or NULL if not active).
29*61864d84STakashi Iwai 	*/
30*61864d84STakashi Iwai 	struct snd_rawmidi_substream *substream_receive;
31*61864d84STakashi Iwai 
32*61864d84STakashi Iwai 	/**
33*61864d84STakashi Iwai 		 MIDI substream for transmitting (or NULL if not active).
34*61864d84STakashi Iwai 	*/
35*61864d84STakashi Iwai 	struct snd_rawmidi_substream *substream_transmit;
36*61864d84STakashi Iwai 
37*61864d84STakashi Iwai 	/**
38*61864d84STakashi Iwai 		 Number of currently active MIDI send URBs.
39*61864d84STakashi Iwai 	*/
40*61864d84STakashi Iwai 	int num_active_send_urbs;
41*61864d84STakashi Iwai 
42*61864d84STakashi Iwai 	/**
43*61864d84STakashi Iwai 		 Spin lock to protect updates of send_urb.
44*61864d84STakashi Iwai 	*/
45*61864d84STakashi Iwai 	spinlock_t send_urb_lock;
46*61864d84STakashi Iwai 
47*61864d84STakashi Iwai 	/**
48*61864d84STakashi Iwai 		 Spin lock to protect MIDI buffer handling.
49*61864d84STakashi Iwai 	*/
50*61864d84STakashi Iwai 	spinlock_t midi_transmit_lock;
51*61864d84STakashi Iwai 
52*61864d84STakashi Iwai 	/**
53*61864d84STakashi Iwai 		 Wait queue for MIDI transmission.
54*61864d84STakashi Iwai 	*/
55*61864d84STakashi Iwai 	wait_queue_head_t send_wait;
56*61864d84STakashi Iwai 
57*61864d84STakashi Iwai 	/**
58*61864d84STakashi Iwai 		 Buffer for incoming MIDI stream.
59*61864d84STakashi Iwai 	*/
60*61864d84STakashi Iwai 	struct midi_buffer midibuf_in;
61*61864d84STakashi Iwai 
62*61864d84STakashi Iwai 	/**
63*61864d84STakashi Iwai 		 Buffer for outgoing MIDI stream.
64*61864d84STakashi Iwai 	*/
65*61864d84STakashi Iwai 	struct midi_buffer midibuf_out;
66*61864d84STakashi Iwai };
67*61864d84STakashi Iwai 
68*61864d84STakashi Iwai extern int line6_init_midi(struct usb_line6 *line6);
69*61864d84STakashi Iwai extern void line6_midi_receive(struct usb_line6 *line6, unsigned char *data,
70*61864d84STakashi Iwai 			       int length);
71*61864d84STakashi Iwai 
72*61864d84STakashi Iwai #endif
73