midi.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. /*
  2. * Line6 Linux USB driver - 0.9.1beta
  3. *
  4. * Copyright (C) 2004-2010 Markus Grabner (grabner@icg.tugraz.at)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License as
  8. * published by the Free Software Foundation, version 2.
  9. *
  10. */
  11. #include <linux/slab.h>
  12. #include <linux/usb.h>
  13. #include <sound/core.h>
  14. #include <sound/rawmidi.h>
  15. #include "audio.h"
  16. #include "driver.h"
  17. #include "midi.h"
  18. #include "pod.h"
  19. #include "usbdefs.h"
  20. #define line6_rawmidi_substream_midi(substream) \
  21. ((struct snd_line6_midi *)((substream)->rmidi->private_data))
  22. static int send_midi_async(struct usb_line6 *line6, unsigned char *data,
  23. int length);
  24. /*
  25. Pass data received via USB to MIDI.
  26. */
  27. void line6_midi_receive(struct usb_line6 *line6, unsigned char *data,
  28. int length)
  29. {
  30. if (line6->line6midi->substream_receive)
  31. snd_rawmidi_receive(line6->line6midi->substream_receive,
  32. data, length);
  33. }
  34. /*
  35. Read data from MIDI buffer and transmit them via USB.
  36. */
  37. static void line6_midi_transmit(struct snd_rawmidi_substream *substream)
  38. {
  39. struct usb_line6 *line6 =
  40. line6_rawmidi_substream_midi(substream)->line6;
  41. struct snd_line6_midi *line6midi = line6->line6midi;
  42. struct midi_buffer *mb = &line6midi->midibuf_out;
  43. unsigned long flags;
  44. unsigned char chunk[LINE6_FALLBACK_MAXPACKETSIZE];
  45. int req, done;
  46. spin_lock_irqsave(&line6->line6midi->midi_transmit_lock, flags);
  47. for (;;) {
  48. req = min(line6_midibuf_bytes_free(mb), line6->max_packet_size);
  49. done = snd_rawmidi_transmit_peek(substream, chunk, req);
  50. if (done == 0)
  51. break;
  52. line6_midibuf_write(mb, chunk, done);
  53. snd_rawmidi_transmit_ack(substream, done);
  54. }
  55. for (;;) {
  56. done = line6_midibuf_read(mb, chunk,
  57. LINE6_FALLBACK_MAXPACKETSIZE);
  58. if (done == 0)
  59. break;
  60. send_midi_async(line6, chunk, done);
  61. }
  62. spin_unlock_irqrestore(&line6->line6midi->midi_transmit_lock, flags);
  63. }
  64. /*
  65. Notification of completion of MIDI transmission.
  66. */
  67. static void midi_sent(struct urb *urb)
  68. {
  69. unsigned long flags;
  70. int status;
  71. int num;
  72. struct usb_line6 *line6 = (struct usb_line6 *)urb->context;
  73. status = urb->status;
  74. kfree(urb->transfer_buffer);
  75. usb_free_urb(urb);
  76. if (status == -ESHUTDOWN)
  77. return;
  78. spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags);
  79. num = --line6->line6midi->num_active_send_urbs;
  80. if (num == 0) {
  81. line6_midi_transmit(line6->line6midi->substream_transmit);
  82. num = line6->line6midi->num_active_send_urbs;
  83. }
  84. if (num == 0)
  85. wake_up(&line6->line6midi->send_wait);
  86. spin_unlock_irqrestore(&line6->line6midi->send_urb_lock, flags);
  87. }
  88. /*
  89. Send an asynchronous MIDI message.
  90. Assumes that line6->line6midi->send_urb_lock is held
  91. (i.e., this function is serialized).
  92. */
  93. static int send_midi_async(struct usb_line6 *line6, unsigned char *data,
  94. int length)
  95. {
  96. struct urb *urb;
  97. int retval;
  98. unsigned char *transfer_buffer;
  99. urb = usb_alloc_urb(0, GFP_ATOMIC);
  100. if (urb == NULL) {
  101. dev_err(line6->ifcdev, "Out of memory\n");
  102. return -ENOMEM;
  103. }
  104. transfer_buffer = kmemdup(data, length, GFP_ATOMIC);
  105. if (transfer_buffer == NULL) {
  106. usb_free_urb(urb);
  107. dev_err(line6->ifcdev, "Out of memory\n");
  108. return -ENOMEM;
  109. }
  110. usb_fill_int_urb(urb, line6->usbdev,
  111. usb_sndbulkpipe(line6->usbdev,
  112. line6->ep_control_write),
  113. transfer_buffer, length, midi_sent, line6,
  114. line6->interval);
  115. urb->actual_length = 0;
  116. retval = usb_submit_urb(urb, GFP_ATOMIC);
  117. if (retval < 0) {
  118. dev_err(line6->ifcdev, "usb_submit_urb failed\n");
  119. usb_free_urb(urb);
  120. return retval;
  121. }
  122. ++line6->line6midi->num_active_send_urbs;
  123. return 0;
  124. }
  125. static int line6_midi_output_open(struct snd_rawmidi_substream *substream)
  126. {
  127. return 0;
  128. }
  129. static int line6_midi_output_close(struct snd_rawmidi_substream *substream)
  130. {
  131. return 0;
  132. }
  133. static void line6_midi_output_trigger(struct snd_rawmidi_substream *substream,
  134. int up)
  135. {
  136. unsigned long flags;
  137. struct usb_line6 *line6 =
  138. line6_rawmidi_substream_midi(substream)->line6;
  139. line6->line6midi->substream_transmit = substream;
  140. spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags);
  141. if (line6->line6midi->num_active_send_urbs == 0)
  142. line6_midi_transmit(substream);
  143. spin_unlock_irqrestore(&line6->line6midi->send_urb_lock, flags);
  144. }
  145. static void line6_midi_output_drain(struct snd_rawmidi_substream *substream)
  146. {
  147. struct usb_line6 *line6 =
  148. line6_rawmidi_substream_midi(substream)->line6;
  149. struct snd_line6_midi *midi = line6->line6midi;
  150. wait_event_interruptible(midi->send_wait,
  151. midi->num_active_send_urbs == 0);
  152. }
  153. static int line6_midi_input_open(struct snd_rawmidi_substream *substream)
  154. {
  155. return 0;
  156. }
  157. static int line6_midi_input_close(struct snd_rawmidi_substream *substream)
  158. {
  159. return 0;
  160. }
  161. static void line6_midi_input_trigger(struct snd_rawmidi_substream *substream,
  162. int up)
  163. {
  164. struct usb_line6 *line6 =
  165. line6_rawmidi_substream_midi(substream)->line6;
  166. if (up)
  167. line6->line6midi->substream_receive = substream;
  168. else
  169. line6->line6midi->substream_receive = NULL;
  170. }
  171. static struct snd_rawmidi_ops line6_midi_output_ops = {
  172. .open = line6_midi_output_open,
  173. .close = line6_midi_output_close,
  174. .trigger = line6_midi_output_trigger,
  175. .drain = line6_midi_output_drain,
  176. };
  177. static struct snd_rawmidi_ops line6_midi_input_ops = {
  178. .open = line6_midi_input_open,
  179. .close = line6_midi_input_close,
  180. .trigger = line6_midi_input_trigger,
  181. };
  182. /*
  183. Cleanup the Line6 MIDI device.
  184. */
  185. static void line6_cleanup_midi(struct snd_rawmidi *rmidi)
  186. {
  187. }
  188. /* Create a MIDI device */
  189. static int snd_line6_new_midi(struct snd_line6_midi *line6midi)
  190. {
  191. struct snd_rawmidi *rmidi;
  192. int err;
  193. err = snd_rawmidi_new(line6midi->line6->card, "Line6 MIDI", 0, 1, 1,
  194. &rmidi);
  195. if (err < 0)
  196. return err;
  197. rmidi->private_data = line6midi;
  198. rmidi->private_free = line6_cleanup_midi;
  199. strcpy(rmidi->id, line6midi->line6->properties->id);
  200. strcpy(rmidi->name, line6midi->line6->properties->name);
  201. rmidi->info_flags =
  202. SNDRV_RAWMIDI_INFO_OUTPUT |
  203. SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_DUPLEX;
  204. snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
  205. &line6_midi_output_ops);
  206. snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT,
  207. &line6_midi_input_ops);
  208. return 0;
  209. }
  210. /* MIDI device destructor */
  211. static int snd_line6_midi_free(struct snd_device *device)
  212. {
  213. struct snd_line6_midi *line6midi = device->device_data;
  214. line6_midibuf_destroy(&line6midi->midibuf_in);
  215. line6_midibuf_destroy(&line6midi->midibuf_out);
  216. return 0;
  217. }
  218. /*
  219. Initialize the Line6 MIDI subsystem.
  220. */
  221. int line6_init_midi(struct usb_line6 *line6)
  222. {
  223. static struct snd_device_ops midi_ops = {
  224. .dev_free = snd_line6_midi_free,
  225. };
  226. int err;
  227. struct snd_line6_midi *line6midi;
  228. if (!(line6->properties->capabilities & LINE6_BIT_CONTROL)) {
  229. /* skip MIDI initialization and report success */
  230. return 0;
  231. }
  232. line6midi = kzalloc(sizeof(struct snd_line6_midi), GFP_KERNEL);
  233. if (line6midi == NULL)
  234. return -ENOMEM;
  235. err = line6_midibuf_init(&line6midi->midibuf_in, MIDI_BUFFER_SIZE, 0);
  236. if (err < 0) {
  237. kfree(line6midi);
  238. return err;
  239. }
  240. err = line6_midibuf_init(&line6midi->midibuf_out, MIDI_BUFFER_SIZE, 1);
  241. if (err < 0) {
  242. kfree(line6midi->midibuf_in.buf);
  243. kfree(line6midi);
  244. return err;
  245. }
  246. line6midi->line6 = line6;
  247. line6->line6midi = line6midi;
  248. err = snd_device_new(line6->card, SNDRV_DEV_RAWMIDI, line6midi,
  249. &midi_ops);
  250. if (err < 0)
  251. return err;
  252. err = snd_line6_new_midi(line6midi);
  253. if (err < 0)
  254. return err;
  255. init_waitqueue_head(&line6midi->send_wait);
  256. spin_lock_init(&line6midi->send_urb_lock);
  257. spin_lock_init(&line6midi->midi_transmit_lock);
  258. return 0;
  259. }