12 #include <linux/slab.h>
23 #define line6_rawmidi_substream_midi(substream) \
24 ((struct snd_line6_midi *)((substream)->rmidi->private_data))
26 static int send_midi_async(
struct usb_line6 *line6,
unsigned char *
data,
62 #ifdef CONFIG_LINE6_USB_DUMP_MIDI
63 line6_write_hexdump(line6,
's', chunk, done);
79 send_midi_async(line6, chunk, done);
82 spin_unlock_irqrestore(&line6->
line6midi->midi_transmit_lock, flags);
88 static void midi_sent(
struct urb *
urb)
96 kfree(urb->transfer_buffer);
103 num = --line6->
line6midi->num_active_send_urbs;
106 line6_midi_transmit(line6->
line6midi->substream_transmit);
107 num = line6->
line6midi->num_active_send_urbs;
113 spin_unlock_irqrestore(&line6->
line6midi->send_urb_lock, flags);
121 static int send_midi_async(
struct usb_line6 *line6,
unsigned char *
data,
134 #ifdef CONFIG_LINE6_USB_DUMP_CTRL
135 line6_write_hexdump(line6,
'S', data, length);
140 if (transfer_buffer ==
NULL) {
146 usb_fill_int_urb(urb, line6->
usbdev,
147 usb_sndbulkpipe(line6->
usbdev,
149 transfer_buffer, length, midi_sent, line6,
151 urb->actual_length = 0;
160 ++line6->
line6midi->num_active_send_urbs;
162 switch (line6->
usbdev->descriptor.idProduct) {
203 line6->
line6midi->substream_transmit = substream;
206 if (line6->
line6midi->num_active_send_urbs == 0)
207 line6_midi_transmit(substream);
209 spin_unlock_irqrestore(&line6->
line6midi->send_urb_lock, flags);
238 line6->
line6midi->substream_receive = substream;
244 .open = line6_midi_output_open,
245 .close = line6_midi_output_close,
246 .trigger = line6_midi_output_trigger,
247 .drain = line6_midi_output_drain,
251 .open = line6_midi_input_open,
252 .close = line6_midi_input_close,
253 .trigger = line6_midi_input_trigger,
259 static void line6_cleanup_midi(
struct snd_rawmidi *rmidi)
284 &line6_midi_output_ops);
286 &line6_midi_input_ops);
311 unsigned short value;
325 static ssize_t midi_get_midi_mask_receive(
struct device *dev,
337 static ssize_t midi_set_midi_mask_receive(
struct device *dev,
339 const char *buf,
size_t count)
343 unsigned short value;
355 midi_get_midi_mask_transmit, midi_set_midi_mask_transmit);
357 midi_get_midi_mask_receive, midi_set_midi_mask_receive);
364 &dev_attr_midi_mask_transmit);
366 &dev_attr_midi_mask_receive);
391 if (line6midi ==
NULL)
430 err = snd_line6_new_midi(line6midi);