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