midi.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  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. midihdr->data = kmalloc(MIDIIN_BUFLEN, GFP_KERNEL);
  60. if (!midihdr->data) {
  61. ERROR();
  62. kfree(midihdr);
  63. return -1;
  64. }
  65. if (emu10k1_mpuin_add_buffer(midi_dev->card->mpuin, midihdr) < 0) {
  66. ERROR();
  67. kfree(midihdr->data);
  68. kfree(midihdr);
  69. return -1;
  70. }
  71. *midihdrptr = midihdr;
  72. list_add_tail(&midihdr->list, &midi_dev->mid_hdrs);
  73. return 0;
  74. }
  75. static int emu10k1_midi_open(struct inode *inode, struct file *file)
  76. {
  77. int minor = iminor(inode);
  78. struct emu10k1_card *card = NULL;
  79. struct emu10k1_mididevice *midi_dev;
  80. struct list_head *entry;
  81. DPF(2, "emu10k1_midi_open()\n");
  82. /* Check for correct device to open */
  83. list_for_each(entry, &emu10k1_devs) {
  84. card = list_entry(entry, struct emu10k1_card, list);
  85. if (card->midi_dev == minor)
  86. goto match;
  87. }
  88. return -ENODEV;
  89. match:
  90. #ifdef EMU10K1_SEQUENCER
  91. if (card->seq_mididev) /* card is opened by sequencer */
  92. return -EBUSY;
  93. #endif
  94. /* Wait for device to become free */
  95. mutex_lock(&card->open_sem);
  96. while (card->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) {
  97. if (file->f_flags & O_NONBLOCK) {
  98. mutex_unlock(&card->open_sem);
  99. return -EBUSY;
  100. }
  101. mutex_unlock(&card->open_sem);
  102. interruptible_sleep_on(&card->open_wait);
  103. if (signal_pending(current)) {
  104. return -ERESTARTSYS;
  105. }
  106. mutex_lock(&card->open_sem);
  107. }
  108. if ((midi_dev = (struct emu10k1_mididevice *) kmalloc(sizeof(*midi_dev), GFP_KERNEL)) == NULL)
  109. return -EINVAL;
  110. midi_dev->card = card;
  111. midi_dev->mistate = MIDIIN_STATE_STOPPED;
  112. init_waitqueue_head(&midi_dev->oWait);
  113. init_waitqueue_head(&midi_dev->iWait);
  114. midi_dev->ird = 0;
  115. midi_dev->iwr = 0;
  116. midi_dev->icnt = 0;
  117. INIT_LIST_HEAD(&midi_dev->mid_hdrs);
  118. if (file->f_mode & FMODE_READ) {
  119. struct midi_openinfo dsCardMidiOpenInfo;
  120. struct midi_hdr *midihdr1;
  121. struct midi_hdr *midihdr2;
  122. dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
  123. if (emu10k1_mpuin_open(card, &dsCardMidiOpenInfo) < 0) {
  124. ERROR();
  125. kfree(midi_dev);
  126. return -ENODEV;
  127. }
  128. /* Add two buffers to receive sysex buffer */
  129. if (midiin_add_buffer(midi_dev, &midihdr1) < 0) {
  130. kfree(midi_dev);
  131. return -ENODEV;
  132. }
  133. if (midiin_add_buffer(midi_dev, &midihdr2) < 0) {
  134. list_del(&midihdr1->list);
  135. kfree(midihdr1->data);
  136. kfree(midihdr1);
  137. kfree(midi_dev);
  138. return -ENODEV;
  139. }
  140. }
  141. if (file->f_mode & FMODE_WRITE) {
  142. struct midi_openinfo dsCardMidiOpenInfo;
  143. dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
  144. if (emu10k1_mpuout_open(card, &dsCardMidiOpenInfo) < 0) {
  145. ERROR();
  146. kfree(midi_dev);
  147. return -ENODEV;
  148. }
  149. }
  150. file->private_data = (void *) midi_dev;
  151. card->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE);
  152. mutex_unlock(&card->open_sem);
  153. return nonseekable_open(inode, file);
  154. }
  155. static int emu10k1_midi_release(struct inode *inode, struct file *file)
  156. {
  157. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  158. struct emu10k1_card *card;
  159. lock_kernel();
  160. card = midi_dev->card;
  161. DPF(2, "emu10k1_midi_release()\n");
  162. if (file->f_mode & FMODE_WRITE) {
  163. if (!(file->f_flags & O_NONBLOCK)) {
  164. while (!signal_pending(current) && (card->mpuout->firstmidiq != NULL)) {
  165. DPF(4, "Cannot close - buffers not empty\n");
  166. interruptible_sleep_on(&midi_dev->oWait);
  167. }
  168. }
  169. emu10k1_mpuout_close(card);
  170. }
  171. if (file->f_mode & FMODE_READ) {
  172. struct midi_hdr *midihdr;
  173. if (midi_dev->mistate == MIDIIN_STATE_STARTED) {
  174. emu10k1_mpuin_stop(card);
  175. midi_dev->mistate = MIDIIN_STATE_STOPPED;
  176. }
  177. emu10k1_mpuin_reset(card);
  178. emu10k1_mpuin_close(card);
  179. while (!list_empty(&midi_dev->mid_hdrs)) {
  180. midihdr = list_entry(midi_dev->mid_hdrs.next, struct midi_hdr, list);
  181. list_del(midi_dev->mid_hdrs.next);
  182. kfree(midihdr->data);
  183. kfree(midihdr);
  184. }
  185. }
  186. kfree(midi_dev);
  187. mutex_lock(&card->open_sem);
  188. card->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE));
  189. mutex_unlock(&card->open_sem);
  190. wake_up_interruptible(&card->open_wait);
  191. unlock_kernel();
  192. return 0;
  193. }
  194. static ssize_t emu10k1_midi_read(struct file *file, char __user *buffer, size_t count, loff_t * pos)
  195. {
  196. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  197. ssize_t ret = 0;
  198. u16 cnt;
  199. unsigned long flags;
  200. DPD(4, "emu10k1_midi_read(), count %#x\n", (u32) count);
  201. if (!access_ok(VERIFY_WRITE, buffer, count))
  202. return -EFAULT;
  203. if (midi_dev->mistate == MIDIIN_STATE_STOPPED) {
  204. if (emu10k1_mpuin_start(midi_dev->card) < 0) {
  205. ERROR();
  206. return -EINVAL;
  207. }
  208. midi_dev->mistate = MIDIIN_STATE_STARTED;
  209. }
  210. while (count > 0) {
  211. cnt = MIDIIN_BUFLEN - midi_dev->ird;
  212. spin_lock_irqsave(&midi_spinlock, flags);
  213. if (midi_dev->icnt < cnt)
  214. cnt = midi_dev->icnt;
  215. spin_unlock_irqrestore(&midi_spinlock, flags);
  216. if (cnt > count)
  217. cnt = count;
  218. if (cnt <= 0) {
  219. if (file->f_flags & O_NONBLOCK)
  220. return ret ? ret : -EAGAIN;
  221. DPF(2, " Go to sleep...\n");
  222. interruptible_sleep_on(&midi_dev->iWait);
  223. if (signal_pending(current))
  224. return ret ? ret : -ERESTARTSYS;
  225. continue;
  226. }
  227. if (copy_to_user(buffer, midi_dev->iBuf + midi_dev->ird, cnt)) {
  228. ERROR();
  229. return ret ? ret : -EFAULT;
  230. }
  231. midi_dev->ird += cnt;
  232. midi_dev->ird %= MIDIIN_BUFLEN;
  233. spin_lock_irqsave(&midi_spinlock, flags);
  234. midi_dev->icnt -= cnt;
  235. spin_unlock_irqrestore(&midi_spinlock, flags);
  236. count -= cnt;
  237. buffer += cnt;
  238. ret += cnt;
  239. if (midi_dev->icnt == 0)
  240. break;
  241. }
  242. return ret;
  243. }
  244. static ssize_t emu10k1_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t * pos)
  245. {
  246. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  247. struct midi_hdr *midihdr;
  248. unsigned long flags;
  249. DPD(4, "emu10k1_midi_write(), count=%#x\n", (u32) count);
  250. if (!access_ok(VERIFY_READ, buffer, count))
  251. return -EFAULT;
  252. if ((midihdr = (struct midi_hdr *) kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL)
  253. return -EINVAL;
  254. midihdr->bufferlength = count;
  255. midihdr->bytesrecorded = 0;
  256. midihdr->flags = 0;
  257. midihdr->data = kmalloc(count, GFP_KERNEL);
  258. if (!midihdr->data) {
  259. ERROR();
  260. kfree(midihdr);
  261. return -EINVAL;
  262. }
  263. if (copy_from_user(midihdr->data, buffer, count)) {
  264. kfree(midihdr->data);
  265. kfree(midihdr);
  266. return -EFAULT;
  267. }
  268. spin_lock_irqsave(&midi_spinlock, flags);
  269. if (emu10k1_mpuout_add_buffer(midi_dev->card, midihdr) < 0) {
  270. ERROR();
  271. kfree(midihdr->data);
  272. kfree(midihdr);
  273. spin_unlock_irqrestore(&midi_spinlock, flags);
  274. return -EINVAL;
  275. }
  276. spin_unlock_irqrestore(&midi_spinlock, flags);
  277. return count;
  278. }
  279. static unsigned int emu10k1_midi_poll(struct file *file, struct poll_table_struct *wait)
  280. {
  281. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
  282. unsigned long flags;
  283. unsigned int mask = 0;
  284. DPF(4, "emu10k1_midi_poll() called\n");
  285. if (file->f_mode & FMODE_WRITE)
  286. poll_wait(file, &midi_dev->oWait, wait);
  287. if (file->f_mode & FMODE_READ)
  288. poll_wait(file, &midi_dev->iWait, wait);
  289. spin_lock_irqsave(&midi_spinlock, flags);
  290. if (file->f_mode & FMODE_WRITE)
  291. mask |= POLLOUT | POLLWRNORM;
  292. if (file->f_mode & FMODE_READ) {
  293. if (midi_dev->mistate == MIDIIN_STATE_STARTED)
  294. if (midi_dev->icnt > 0)
  295. mask |= POLLIN | POLLRDNORM;
  296. }
  297. spin_unlock_irqrestore(&midi_spinlock, flags);
  298. return mask;
  299. }
  300. int emu10k1_midi_callback(unsigned long msg, unsigned long refdata, unsigned long *pmsg)
  301. {
  302. struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) refdata;
  303. struct midi_hdr *midihdr = NULL;
  304. unsigned long flags;
  305. int i;
  306. DPF(4, "emu10k1_midi_callback()\n");
  307. spin_lock_irqsave(&midi_spinlock, flags);
  308. switch (msg) {
  309. case ICARDMIDI_OUTLONGDATA:
  310. midihdr = (struct midi_hdr *) pmsg[2];
  311. kfree(midihdr->data);
  312. kfree(midihdr);
  313. wake_up_interruptible(&midi_dev->oWait);
  314. break;
  315. case ICARDMIDI_INLONGDATA:
  316. midihdr = (struct midi_hdr *) pmsg[2];
  317. for (i = 0; i < midihdr->bytesrecorded; i++) {
  318. midi_dev->iBuf[midi_dev->iwr++] = midihdr->data[i];
  319. midi_dev->iwr %= MIDIIN_BUFLEN;
  320. }
  321. midi_dev->icnt += midihdr->bytesrecorded;
  322. if (midi_dev->mistate == MIDIIN_STATE_STARTED) {
  323. init_midi_hdr(midihdr);
  324. emu10k1_mpuin_add_buffer(midi_dev->card->mpuin, midihdr);
  325. wake_up_interruptible(&midi_dev->iWait);
  326. }
  327. break;
  328. case ICARDMIDI_INDATA:
  329. {
  330. u8 *pBuf = (u8 *) & pmsg[1];
  331. u16 bytesvalid = pmsg[2];
  332. for (i = 0; i < bytesvalid; i++) {
  333. midi_dev->iBuf[midi_dev->iwr++] = pBuf[i];
  334. midi_dev->iwr %= MIDIIN_BUFLEN;
  335. }
  336. midi_dev->icnt += bytesvalid;
  337. }
  338. wake_up_interruptible(&midi_dev->iWait);
  339. break;
  340. default: /* Unknown message */
  341. spin_unlock_irqrestore(&midi_spinlock, flags);
  342. return -1;
  343. }
  344. spin_unlock_irqrestore(&midi_spinlock, flags);
  345. return 0;
  346. }
  347. /* MIDI file operations */
  348. struct file_operations emu10k1_midi_fops = {
  349. .owner = THIS_MODULE,
  350. .read = emu10k1_midi_read,
  351. .write = emu10k1_midi_write,
  352. .poll = emu10k1_midi_poll,
  353. .open = emu10k1_midi_open,
  354. .release = emu10k1_midi_release,
  355. };
  356. #ifdef EMU10K1_SEQUENCER
  357. /* functions used for sequencer access */
  358. int emu10k1_seq_midi_open(int dev, int mode,
  359. void (*input) (int dev, unsigned char data),
  360. void (*output) (int dev))
  361. {
  362. struct emu10k1_card *card;
  363. struct midi_openinfo dsCardMidiOpenInfo;
  364. struct emu10k1_mididevice *midi_dev;
  365. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  366. return -EINVAL;
  367. card = midi_devs[dev]->devc;
  368. if (card->open_mode) /* card is opened native */
  369. return -EBUSY;
  370. DPF(2, "emu10k1_seq_midi_open()\n");
  371. if ((midi_dev = (struct emu10k1_mididevice *) kmalloc(sizeof(*midi_dev), GFP_KERNEL)) == NULL)
  372. return -EINVAL;
  373. midi_dev->card = card;
  374. midi_dev->mistate = MIDIIN_STATE_STOPPED;
  375. init_waitqueue_head(&midi_dev->oWait);
  376. init_waitqueue_head(&midi_dev->iWait);
  377. midi_dev->ird = 0;
  378. midi_dev->iwr = 0;
  379. midi_dev->icnt = 0;
  380. INIT_LIST_HEAD(&midi_dev->mid_hdrs);
  381. dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
  382. if (emu10k1_mpuout_open(card, &dsCardMidiOpenInfo) < 0) {
  383. ERROR();
  384. return -ENODEV;
  385. }
  386. card->seq_mididev = midi_dev;
  387. return 0;
  388. }
  389. void emu10k1_seq_midi_close(int dev)
  390. {
  391. struct emu10k1_card *card;
  392. DPF(2, "emu10k1_seq_midi_close()\n");
  393. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  394. return;
  395. card = midi_devs[dev]->devc;
  396. emu10k1_mpuout_close(card);
  397. kfree(card->seq_mididev);
  398. card->seq_mididev = NULL;
  399. }
  400. int emu10k1_seq_midi_out(int dev, unsigned char midi_byte)
  401. {
  402. struct emu10k1_card *card;
  403. struct midi_hdr *midihdr;
  404. unsigned long flags;
  405. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  406. return -EINVAL;
  407. card = midi_devs[dev]->devc;
  408. if ((midihdr = (struct midi_hdr *) kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL)
  409. return -EINVAL;
  410. midihdr->bufferlength = 1;
  411. midihdr->bytesrecorded = 0;
  412. midihdr->flags = 0;
  413. midihdr->data = kmalloc(1, GFP_KERNEL);
  414. if (!midihdr->data) {
  415. ERROR();
  416. kfree(midihdr);
  417. return -EINVAL;
  418. }
  419. *(midihdr->data) = midi_byte;
  420. spin_lock_irqsave(&midi_spinlock, flags);
  421. if (emu10k1_mpuout_add_buffer(card, midihdr) < 0) {
  422. ERROR();
  423. kfree(midihdr->data);
  424. kfree(midihdr);
  425. spin_unlock_irqrestore(&midi_spinlock, flags);
  426. return -EINVAL;
  427. }
  428. spin_unlock_irqrestore(&midi_spinlock, flags);
  429. return 1;
  430. }
  431. int emu10k1_seq_midi_start_read(int dev)
  432. {
  433. return 0;
  434. }
  435. int emu10k1_seq_midi_end_read(int dev)
  436. {
  437. return 0;
  438. }
  439. void emu10k1_seq_midi_kick(int dev)
  440. {
  441. }
  442. int emu10k1_seq_midi_buffer_status(int dev)
  443. {
  444. int count;
  445. struct midi_queue *queue;
  446. struct emu10k1_card *card;
  447. if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
  448. return -EINVAL;
  449. count = 0;
  450. card = midi_devs[dev]->devc;
  451. queue = card->mpuout->firstmidiq;
  452. while (queue != NULL) {
  453. count++;
  454. if (queue == card->mpuout->lastmidiq)
  455. break;
  456. queue = queue->next;
  457. }
  458. return count;
  459. }
  460. #endif