xref: /openbmc/linux/sound/usb/line6/midi.h (revision c078a4aac2944cb9cac5cdb4e9a482623435578b)
161864d84STakashi Iwai /*
2*c078a4aaSChris Rorvick  * Line 6 Linux USB driver
361864d84STakashi Iwai  *
461864d84STakashi Iwai  * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
561864d84STakashi Iwai  *
661864d84STakashi Iwai  *	This program is free software; you can redistribute it and/or
761864d84STakashi Iwai  *	modify it under the terms of the GNU General Public License as
861864d84STakashi Iwai  *	published by the Free Software Foundation, version 2.
961864d84STakashi Iwai  *
1061864d84STakashi Iwai  */
1161864d84STakashi Iwai 
1261864d84STakashi Iwai #ifndef MIDI_H
1361864d84STakashi Iwai #define MIDI_H
1461864d84STakashi Iwai 
1561864d84STakashi Iwai #include <sound/rawmidi.h>
1661864d84STakashi Iwai 
1761864d84STakashi Iwai #include "midibuf.h"
1861864d84STakashi Iwai 
1961864d84STakashi Iwai #define MIDI_BUFFER_SIZE 1024
2061864d84STakashi Iwai 
2161864d84STakashi Iwai struct snd_line6_midi {
2261864d84STakashi Iwai 	/**
2361864d84STakashi Iwai 		 Pointer back to the Line 6 driver data structure.
2461864d84STakashi Iwai 	*/
2561864d84STakashi Iwai 	struct usb_line6 *line6;
2661864d84STakashi Iwai 
2761864d84STakashi Iwai 	/**
2861864d84STakashi Iwai 		 MIDI substream for receiving (or NULL if not active).
2961864d84STakashi Iwai 	*/
3061864d84STakashi Iwai 	struct snd_rawmidi_substream *substream_receive;
3161864d84STakashi Iwai 
3261864d84STakashi Iwai 	/**
3361864d84STakashi Iwai 		 MIDI substream for transmitting (or NULL if not active).
3461864d84STakashi Iwai 	*/
3561864d84STakashi Iwai 	struct snd_rawmidi_substream *substream_transmit;
3661864d84STakashi Iwai 
3761864d84STakashi Iwai 	/**
3861864d84STakashi Iwai 		 Number of currently active MIDI send URBs.
3961864d84STakashi Iwai 	*/
4061864d84STakashi Iwai 	int num_active_send_urbs;
4161864d84STakashi Iwai 
4261864d84STakashi Iwai 	/**
4361864d84STakashi Iwai 		 Spin lock to protect updates of send_urb.
4461864d84STakashi Iwai 	*/
4561864d84STakashi Iwai 	spinlock_t send_urb_lock;
4661864d84STakashi Iwai 
4761864d84STakashi Iwai 	/**
4861864d84STakashi Iwai 		 Spin lock to protect MIDI buffer handling.
4961864d84STakashi Iwai 	*/
5061864d84STakashi Iwai 	spinlock_t midi_transmit_lock;
5161864d84STakashi Iwai 
5261864d84STakashi Iwai 	/**
5361864d84STakashi Iwai 		 Wait queue for MIDI transmission.
5461864d84STakashi Iwai 	*/
5561864d84STakashi Iwai 	wait_queue_head_t send_wait;
5661864d84STakashi Iwai 
5761864d84STakashi Iwai 	/**
5861864d84STakashi Iwai 		 Buffer for incoming MIDI stream.
5961864d84STakashi Iwai 	*/
6061864d84STakashi Iwai 	struct midi_buffer midibuf_in;
6161864d84STakashi Iwai 
6261864d84STakashi Iwai 	/**
6361864d84STakashi Iwai 		 Buffer for outgoing MIDI stream.
6461864d84STakashi Iwai 	*/
6561864d84STakashi Iwai 	struct midi_buffer midibuf_out;
6661864d84STakashi Iwai };
6761864d84STakashi Iwai 
6861864d84STakashi Iwai extern int line6_init_midi(struct usb_line6 *line6);
6961864d84STakashi Iwai extern void line6_midi_receive(struct usb_line6 *line6, unsigned char *data,
7061864d84STakashi Iwai 			       int length);
7161864d84STakashi Iwai 
7261864d84STakashi Iwai #endif
73