midi.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. /*
  2. **********************************************************************
  3. * midi.c - /dev/midi interface for emu10k1 driver
  4. * Copyright 1999, 2000 Creative Labs, Inc.
  5. *
  6. **********************************************************************
  7. *
  8. * Date Author Summary of changes
  9. * ---- ------ ------------------
  10. * October 20, 1999 Bertrand Lee base code release
  11. *
  12. **********************************************************************
  13. *
  14. * This program is free software; you can redistribute it and/or
  15. * modify it under the terms of the GNU General Public License as
  16. * published by the Free Software Foundation; either version 2 of
  17. * the License, or (at your option) any later version.
  18. *
  19. * This program is distributed in the hope that it will be useful,
  20. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. * GNU General Public License for more details.
  23. *
  24. * You should have received a copy of the GNU General Public
  25. * License along with this program; if not, write to the Free
  26. * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  27. * USA.
  28. *
  29. **********************************************************************
  30. */
  31. #include <linux/module.h>
  32. #include <linux/poll.h>
  33. #include <linux/slab.h>
  34. #include <linux/sched.h>
  35. #include <linux/smp_lock.h>
  36. #include <asm/uaccess.h>
  37. #include "hwaccess.h"
  38. #include "cardmo.h"
  39. #include "cardmi.h"
  40. #include "midi.h"
  41. #ifdef EMU10K1_SEQUENCER
  42. #include "../sound_config.h"
  43. #endif
  44. static DEFINE_SPINLOCK(midi_spinlock __attribute((unused)));
  45. static void init_midi_hdr(struct midi_hdr *midihdr)
  46. {
  47. midihdr->bufferlength = MIDIIN_BUFLEN;
  48. midihdr->bytesrecorded = 0;
  49. midihdr->flags = 0;
  50. }
  51. static int midiin_add_buffer(struct emu10k1_mididevice *midi_dev, struct midi_hdr **midihdrptr)
  52. {
  53. struct midi_hdr *midihdr;
  54. if ((midihdr = (struct midi_hdr *) kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL) {
  55. ERROR();
  56. return -EINVAL;
  57. }
  58. init_midi_hdr(midihdr);
  59. if ((midihdr->data = (u8 *) kmalloc(MIDIIN_BUFLEN, GFP_KERNEL)) == NULL) {
  60. ERROR();
  61. kfree(midihdr);
  62. return -1;
  63. }
  64. if (emu10k1_mpuin_add_buffer(midi_dev->card->mpuin, midihdr) < 0) {
  65. ERROR();
  66. kfree(midihdr->data);
  67. kfree(midihdr);
  68. return -1;
  69. }
  70. *midihdrptr = midihdr;
  71. list_add_tail(&midihdr->list, &midi_dev->mid_hdrs);
  72. return 0;
  73. }
  74. static int emu10k1_midi_open(struct inode *inode, struct file *file)
  75. {
  76. int minor = iminor(inode);
  77. struct emu10k1_card *card = NULL;
  78. struct emu10k1_mididevice *midi_dev;
  79. struct list_head *entry;
  80. DPF(2, "emu10k1_midi_open()\n");
  81. /* Check for correct device to open */
  82. list_for_each(entry, &emu10k1_devs) {
  83. card = list_entry(entry, struct emu10k1_card, list);
  84. if (card->midi_dev == minor)
  85. goto match;
  86. }
  87. return -ENODEV;
  88. match:
  89. #ifdef EMU10K1_SEQUENCER
  90. if (card->seq_mididev) /* card is opened by sequencer */
  91. return -EBUSY;
  92. #endif
  93. /* Wait for device to become free */
  94. down(&card->open_sem);
  95. while (card->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) {
  96. if (file->f_flags & O_NONBLOCK) {
  97. up(&card->open_sem);
  98. return -EBUSY;
  99. }
  100. up(&card->open_sem);
  101. interruptible_sleep_on(&card->open_wait);
  102. if (signal_pending(current)) {
  103. return -ERESTARTSYS;
  104. }
  105. down(&card->open_sem);
  106. }
  107. if ((midi_dev = (struct emu10k1_mididevice *) kmalloc(sizeof(*midi_dev), GFP_KERNEL)) == NULL)
  108. return -EINVAL;
  109. midi_dev->card = card;
  110. midi_dev->mistate = MIDIIN_STATE_STOPPED;
  111. init_waitqueue_head(&midi_dev->oWait);
  112. init_waitqueue_head(&midi_dev->iWait);
  113. midi_dev->ird = 0;
  114. midi_dev->iwr = 0;
  115. midi_dev->icnt = 0;
  116. INIT_LIST_HEAD(&midi_dev->mid_hdrs);
  117. if (file->f_mode & FMODE_READ) {
  118. struct midi_openinfo dsCardMidiOpenInfo;
  119. struct midi_hdr *midihdr1;
  120. struct midi_hdr *midihdr2;
  121. dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
  122. if (emu10k1_mpuin_open(card, &dsCardMidiOpenInfo) < 0) {
  123. ERROR();
  124. kfree(midi_dev);
  125. return -ENODEV;
  126. }
  127. /* Add two buffers to receive sysex buffer */
  128. if (midiin_add_buffer(midi_dev, &midihdr1) < 0) {
  129. kfree(midi_dev);
  130. return -ENODEV;
  131. }
  132. if (midiin_add_buffer(midi_dev, &midihdr2) < 0) {
  133. list_del(&midihdr1->list);
  134. kfree(midihdr1->data);
  135. kfree(midihdr1);
  136. kfree(midi_dev);
  137. return -ENODEV;
  138. }
  139. }
  140. if (file->f_mode & FMODE_WRITE) {
  141. struct midi_openinfo dsCardMidiOpenInfo;
  142. dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
  143. if (emu10k1_mpuout_open(card, &dsCardMidiOpenInfo) < 0) {
  144. ERROR();
  145. kfree(midi_dev);
  146. return -ENODEV;
  147. }
  148. }
  149. file->private_data = (void *) midi_dev;
  150. card->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE);
  151. up(&card->open_sem);
  152. return nonseekable_open(inode, file);
  153. }
  154. static int emu10k1_midi_release(struct inode *inode, struct file *file)
  155. {
  156. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  157. struct emu10k1_card *card;
  158. lock_kernel();
  159. card = midi_dev->card;
  160. DPF(2, "emu10k1_midi_release()\n");
  161. if (file->f_mode & FMODE_WRITE) {
  162. if (!(file->f_flags & O_NONBLOCK)) {
  163. while (!signal_pending(current) && (card->mpuout->firstmidiq != NULL)) {
  164. DPF(4, "Cannot close - buffers not empty\n");
  165. interruptible_sleep_on(&midi_dev->oWait);
  166. }
  167. }
  168. emu10k1_mpuout_close(card);
  169. }
  170. if (file->f_mode & FMODE_READ) {
  171. struct midi_hdr *midihdr;
  172. if (midi_dev->mistate == MIDIIN_STATE_STARTED) {
  173. emu10k1_mpuin_stop(card);
  174. midi_dev->mistate = MIDIIN_STATE_STOPPED;
  175. }
  176. emu10k1_mpuin_reset(card);
  177. emu10k1_mpuin_close(card);
  178. while (!list_empty(&midi_dev->mid_hdrs)) {
  179. midihdr = list_entry(midi_dev->mid_hdrs.next, struct midi_hdr, list);
  180. list_del(midi_dev->mid_hdrs.next);
  181. kfree(midihdr->data);
  182. kfree(midihdr);
  183. }
  184. }
  185. kfree(midi_dev);
  186. down(&card->open_sem);
  187. card->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE));
  188. up(&card->open_sem);
  189. wake_up_interruptible(&card->open_wait);
  190. unlock_kernel();
  191. return 0;
  192. }
  193. static ssize_t emu10k1_midi_read(struct file *file, char __user *buffer, size_t count, loff_t * pos)
  194. {
  195. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  196. ssize_t ret = 0;
  197. u16 cnt;
  198. unsigned long flags;
  199. DPD(4, "emu10k1_midi_read(), count %#x\n", (u32) count);
  200. if (!access_ok(VERIFY_WRITE, buffer, count))
  201. return -EFAULT;
  202. if (midi_dev->mistate == MIDIIN_STATE_STOPPED) {
  203. if (emu10k1_mpuin_start(midi_dev->card) < 0) {
  204. ERROR();
  205. return -EINVAL;
  206. }
  207. midi_dev->mistate = MIDIIN_STATE_STARTED;
  208. }
  209. while (count > 0) {
  210. cnt = MIDIIN_BUFLEN - midi_dev->ird;
  211. spin_lock_irqsave(&midi_spinlock, flags);
  212. if (midi_dev->icnt < cnt)
  213. cnt = midi_dev->icnt;
  214. spin_unlock_irqrestore(&midi_spinlock, flags);
  215. if (cnt > count)
  216. cnt = count;
  217. if (cnt <= 0) {
  218. if (file->f_flags & O_NONBLOCK)
  219. return ret ? ret : -EAGAIN;
  220. DPF(2, " Go to sleep...\n");
  221. interruptible_sleep_on(&midi_dev->iWait);
  222. if (signal_pending(current))
  223. return ret ? ret : -ERESTARTSYS;
  224. continue;
  225. }
  226. if (copy_to_user(buffer, midi_dev->iBuf + midi_dev->ird, cnt)) {
  227. ERROR();
  228. return ret ? ret : -EFAULT;
  229. }
  230. midi_dev->ird += cnt;
  231. midi_dev->ird %= MIDIIN_BUFLEN;
  232. spin_lock_irqsave(&midi_spinlock, flags);
  233. midi_dev->icnt -= cnt;
  234. spin_unlock_irqrestore(&midi_spinlock, flags);
  235. count -= cnt;
  236. buffer += cnt;
  237. ret += cnt;
  238. if (midi_dev->icnt == 0)
  239. break;
  240. }
  241. return ret;
  242. }
  243. static ssize_t emu10k1_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t * pos)
  244. {
  245. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  246. struct midi_hdr *midihdr;
  247. unsigned long flags;
  248. DPD(4, "emu10k1_midi_write(), count=%#x\n", (u32) count);
  249. if (!access_ok(VERIFY_READ, buffer, count))
  250. return -EFAULT;
  251. if ((midihdr = (struct midi_hdr *) kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL)
  252. return -EINVAL;
  253. midihdr->bufferlength = count;
  254. midihdr->bytesrecorded = 0;
  255. midihdr->flags = 0;
  256. if ((midihdr->data = (u8 *) kmalloc(count, GFP_KERNEL)) == NULL) {
  257. ERROR();
  258. kfree(midihdr);
  259. return -EINVAL;
  260. }
  261. if (copy_from_user(midihdr->data, buffer, count)) {
  262. kfree(midihdr->data);
  263. kfree(midihdr);
  264. return -EFAULT;
  265. }
  266. spin_lock_irqsave(&midi_spinlock, flags);
  267. if (emu10k1_mpuout_add_buffer(midi_dev->card, midihdr) < 0) {
  268. ERROR();
  269. kfree(midihdr->data);
  270. kfree(midihdr);
  271. spin_unlock_irqrestore(&midi_spinlock, flags);
  272. return -EINVAL;
  273. }
  274. spin_unlock_irqrestore(&midi_spinlock, flags);
  275. return count;
  276. }
  277. static unsigned int emu10k1_midi_poll(struct file *file, struct poll_table_struct *wait)
  278. {
  279. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  280. unsigned long flags;
  281. unsigned int mask = 0;
  282. DPF(4, "emu10k1_midi_poll() called\n");
  283. if (file->f_mode & FMODE_WRITE)
  284. poll_wait(file, &midi_dev->oWait, wait);
  285. if (file->f_mode & FMODE_READ)
  286. poll_wait(file, &midi_dev->iWait, wait);
  287. spin_lock_irqsave(&midi_spinlock, flags);
  288. if (file->f_mode & FMODE_WRITE)
  289. mask |= POLLOUT | POLLWRNORM;
  290. if (file->f_mode & FMODE_READ) {
  291. if (midi_dev->mistate == MIDIIN_STATE_STARTED)
  292. if (midi_dev->icnt > 0)
  293. mask |= POLLIN | POLLRDNORM;
  294. }
  295. spin_unlock_irqrestore(&midi_spinlock, flags);
  296. return mask;
  297. }
  298. int emu10k1_midi_callback(unsigned long msg, unsigned long refdata, unsigned long *pmsg)
  299. {
  300. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) refdata;
  301. struct midi_hdr *midihdr = NULL;
  302. unsigned long flags;
  303. int i;
  304. DPF(4, "emu10k1_midi_callback()\n");
  305. spin_lock_irqsave(&midi_spinlock, flags);
  306. switch (msg) {
  307. case ICARDMIDI_OUTLONGDATA:
  308. midihdr = (struct midi_hdr *) pmsg[2];
  309. kfree(midihdr->data);
  310. kfree(midihdr);
  311. wake_up_interruptible(&midi_dev->oWait);
  312. break;
  313. case ICARDMIDI_INLONGDATA:
  314. midihdr = (struct midi_hdr *) pmsg[2];
  315. for (i = 0; i < midihdr->bytesrecorded; i++) {
  316. midi_dev->iBuf[midi_dev->iwr++] = midihdr->data[i];
  317. midi_dev->iwr %= MIDIIN_BUFLEN;
  318. }
  319. midi_dev->icnt += midihdr->bytesrecorded;
  320. if (midi_dev->mistate == MIDIIN_STATE_STARTED) {
  321. init_midi_hdr(midihdr);
  322. emu10k1_mpuin_add_buffer(midi_dev->card->mpuin, midihdr);
  323. wake_up_interruptible(&midi_dev->iWait);
  324. }
  325. break;
  326. case ICARDMIDI_INDATA:
  327. {
  328. u8 *pBuf = (u8 *) & pmsg[1];
  329. u16 bytesvalid = pmsg[2];
  330. for (i = 0; i < bytesvalid; i++) {
  331. midi_dev->iBuf[midi_dev->iwr++] = pBuf[i];
  332. midi_dev->iwr %= MIDIIN_BUFLEN;
  333. }
  334. midi_dev->icnt += bytesvalid;
  335. }
  336. wake_up_interruptible(&midi_dev->iWait);
  337. break;
  338. default: /* Unknown message */
  339. spin_unlock_irqrestore(&midi_spinlock, flags);
  340. return -1;
  341. }
  342. spin_unlock_irqrestore(&midi_spinlock, flags);
  343. return 0;
  344. }
  345. /* MIDI file operations */
  346. struct file_operations emu10k1_midi_fops = {
  347. .owner = THIS_MODULE,
  348. .read = emu10k1_midi_read,
  349. .write = emu10k1_midi_write,
  350. .poll = emu10k1_midi_poll,
  351. .open = emu10k1_midi_open,
  352. .release = emu10k1_midi_release,
  353. };
  354. #ifdef EMU10K1_SEQUENCER
  355. /* functions used for sequencer access */
  356. int emu10k1_seq_midi_open(int dev, int mode,
  357. void (*input) (int dev, unsigned char data),
  358. void (*output) (int dev))
  359. {
  360. struct emu10k1_card *card;
  361. struct midi_openinfo dsCardMidiOpenInfo;
  362. struct emu10k1_mididevice *midi_dev;
  363. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  364. return -EINVAL;
  365. card = midi_devs[dev]->devc;
  366. if (card->open_mode) /* card is opened native */
  367. return -EBUSY;
  368. DPF(2, "emu10k1_seq_midi_open()\n");
  369. if ((midi_dev = (struct emu10k1_mididevice *) kmalloc(sizeof(*midi_dev), GFP_KERNEL)) == NULL)
  370. return -EINVAL;
  371. midi_dev->card = card;
  372. midi_dev->mistate = MIDIIN_STATE_STOPPED;
  373. init_waitqueue_head(&midi_dev->oWait);
  374. init_waitqueue_head(&midi_dev->iWait);
  375. midi_dev->ird = 0;
  376. midi_dev->iwr = 0;
  377. midi_dev->icnt = 0;
  378. INIT_LIST_HEAD(&midi_dev->mid_hdrs);
  379. dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
  380. if (emu10k1_mpuout_open(card, &dsCardMidiOpenInfo) < 0) {
  381. ERROR();
  382. return -ENODEV;
  383. }
  384. card->seq_mididev = midi_dev;
  385. return 0;
  386. }
  387. void emu10k1_seq_midi_close(int dev)
  388. {
  389. struct emu10k1_card *card;
  390. DPF(2, "emu10k1_seq_midi_close()\n");
  391. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  392. return;
  393. card = midi_devs[dev]->devc;
  394. emu10k1_mpuout_close(card);
  395. kfree(card->seq_mididev);
  396. card->seq_mididev = NULL;
  397. }
  398. int emu10k1_seq_midi_out(int dev, unsigned char midi_byte)
  399. {
  400. struct emu10k1_card *card;
  401. struct midi_hdr *midihdr;
  402. unsigned long flags;
  403. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  404. return -EINVAL;
  405. card = midi_devs[dev]->devc;
  406. if ((midihdr = (struct midi_hdr *) kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL)
  407. return -EINVAL;
  408. midihdr->bufferlength = 1;
  409. midihdr->bytesrecorded = 0;
  410. midihdr->flags = 0;
  411. if ((midihdr->data = (u8 *) kmalloc(1, GFP_KERNEL)) == NULL) {
  412. ERROR();
  413. kfree(midihdr);
  414. return -EINVAL;
  415. }
  416. *(midihdr->data) = midi_byte;
  417. spin_lock_irqsave(&midi_spinlock, flags);
  418. if (emu10k1_mpuout_add_buffer(card, midihdr) < 0) {
  419. ERROR();
  420. kfree(midihdr->data);
  421. kfree(midihdr);
  422. spin_unlock_irqrestore(&midi_spinlock, flags);
  423. return -EINVAL;
  424. }
  425. spin_unlock_irqrestore(&midi_spinlock, flags);
  426. return 1;
  427. }
  428. int emu10k1_seq_midi_start_read(int dev)
  429. {
  430. return 0;
  431. }
  432. int emu10k1_seq_midi_end_read(int dev)
  433. {
  434. return 0;
  435. }
  436. void emu10k1_seq_midi_kick(int dev)
  437. {
  438. }
  439. int emu10k1_seq_midi_buffer_status(int dev)
  440. {
  441. int count;
  442. struct midi_queue *queue;
  443. struct emu10k1_card *card;
  444. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  445. return -EINVAL;
  446. count = 0;
  447. card = midi_devs[dev]->devc;
  448. queue = card->mpuout->firstmidiq;
  449. while (queue != NULL) {
  450. count++;
  451. if (queue == card->mpuout->lastmidiq)
  452. break;
  453. queue = queue->next;
  454. }
  455. return count;
  456. }
  457. #endif