2 * Copyright (c) 2003 Mathew Kanner
3 * Copyright (c) 1993 Hannu Savolainen
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * The sequencer personality manager.
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD: head/sys/dev/sound/midi/sequencer.c 274035 2014-11-03 11:11:45Z bapt $");
35 #include <sys/param.h>
36 #include <sys/systm.h>
38 #include <sys/filio.h>
40 #include <sys/sockio.h>
41 #include <sys/fcntl.h>
43 #include <sys/sysctl.h>
45 #include <sys/kernel.h> /* for DATA_SET */
47 #include <sys/module.h>
51 #include <sys/syslog.h>
52 #include <sys/errno.h>
53 #include <sys/malloc.h>
55 #include <machine/clock.h> /* for DELAY */
56 #include <sys/soundcard.h>
60 #include <sys/mutex.h>
61 #include <sys/condvar.h>
62 #include <sys/kthread.h>
63 #include <sys/unistd.h>
64 #include <sys/device.h>
66 #ifdef HAVE_KERNEL_OPTION_HEADERS
70 #include <dev/sound/midi/midi.h>
71 #include <dev/sound/midi/midiq.h>
74 #include <dev/sound/midi/sequencer.h>
76 #define TMR_TIMERBASE 13
78 #define SND_DEV_SEQ 1 /* Sequencer output /dev/sequencer (FM
79 * synthesizer and MIDI output) */
80 #define SND_DEV_MUSIC 8 /* /dev/music, level 2 interface */
82 /* Length of a sequencer event. */
87 #define LOOKUP_EXIST (0)
88 #define LOOKUP_OPEN (1)
89 #define LOOKUP_CLOSE (2)
91 #define PCMMKMINOR(u, d, c) \
92 ((((c) & 0xff) << 16) | (((u) & 0x0f) << 4) | ((d) & 0x0f))
93 #define MIDIMKMINOR(u, d, c) PCMMKMINOR(u, d, c)
94 #define MIDIUNIT(y) ((dev2unit(y) >> 4) & 0x0f)
95 #define MIDIDEV(y) (dev2unit(y) & 0x0f)
97 /* These are the entries to the sequencer driver. */
98 static d_open_t seq_open;
99 static d_close_t seq_close;
100 static d_ioctl_t seq_ioctl;
101 static d_read_t seq_read;
102 static d_write_t seq_write;
103 static d_kqfilter_t seq_kqfilter;
105 static void seq_filter_detach(struct knote *);
106 static int seq_filter_read(struct knote *, long);
107 static int seq_filter_write(struct knote *, long);
109 static struct dev_ops seq_ops = {
110 { "sequencer", 0, D_MPSAFE },
112 .d_close = seq_close,
114 .d_write = seq_write,
115 .d_ioctl = seq_ioctl,
116 .d_kqfilter = seq_kqfilter,
119 static struct filterops seq_read_filterops =
120 { FILTEROP_ISFD, NULL, seq_filter_detach, seq_filter_read };
121 static struct filterops seq_write_filterops =
122 { FILTEROP_ISFD, NULL, seq_filter_detach, seq_filter_write };
127 struct lock seq_lock, q_lock;
128 struct cv empty_cv, reset_cv, in_cv, out_cv, state_cv, th_cv;
130 MIDIQ_HEAD(, u_char) in_q, out_q;
133 /* Flags (protected by flag_mtx of mididev_info) */
134 int fflags; /* Access mode */
137 int out_water; /* Sequence output threshould */
138 snd_sync_parm sync_parm; /* AIOSYNC parameter set */
139 struct thread *sync_thread; /* AIOSYNCing thread */
140 struct kqinfo in_kq, out_kq;
142 struct cdev *seqdev, *musicdev;
149 struct timeval timerstop, timersub;
150 int timerbase, tempo;
156 int pre_event_timeout;
161 * Module specific stuff, including how many sequecers
165 SYSCTL_NODE(_hw_midi, OID_AUTO, seq, CTLFLAG_RD, 0, "Midi sequencer");
168 /* XXX: should this be moved into debug.midi? */
169 SYSCTL_INT(_hw_midi_seq, OID_AUTO, debug, CTLFLAG_RW, &seq_debug, 0, "");
171 midi_cmdtab cmdtab_seqevent[] = {
172 {SEQ_NOTEOFF, "SEQ_NOTEOFF"},
173 {SEQ_NOTEON, "SEQ_NOTEON"},
174 {SEQ_WAIT, "SEQ_WAIT"},
175 {SEQ_PGMCHANGE, "SEQ_PGMCHANGE"},
176 {SEQ_SYNCTIMER, "SEQ_SYNCTIMER"},
177 {SEQ_MIDIPUTC, "SEQ_MIDIPUTC"},
178 {SEQ_DRUMON, "SEQ_DRUMON"},
179 {SEQ_DRUMOFF, "SEQ_DRUMOFF"},
180 {SEQ_ECHO, "SEQ_ECHO"},
181 {SEQ_AFTERTOUCH, "SEQ_AFTERTOUCH"},
182 {SEQ_CONTROLLER, "SEQ_CONTROLLER"},
183 {SEQ_BALANCE, "SEQ_BALANCE"},
184 {SEQ_VOLMODE, "SEQ_VOLMODE"},
185 {SEQ_FULLSIZE, "SEQ_FULLSIZE"},
186 {SEQ_PRIVATE, "SEQ_PRIVATE"},
187 {SEQ_EXTENDED, "SEQ_EXTENDED"},
188 {EV_SEQ_LOCAL, "EV_SEQ_LOCAL"},
189 {EV_TIMING, "EV_TIMING"},
190 {EV_CHN_COMMON, "EV_CHN_COMMON"},
191 {EV_CHN_VOICE, "EV_CHN_VOICE"},
192 {EV_SYSEX, "EV_SYSEX"},
196 midi_cmdtab cmdtab_seqioctl[] = {
197 {SNDCTL_SEQ_RESET, "SNDCTL_SEQ_RESET"},
198 {SNDCTL_SEQ_SYNC, "SNDCTL_SEQ_SYNC"},
199 {SNDCTL_SYNTH_INFO, "SNDCTL_SYNTH_INFO"},
200 {SNDCTL_SEQ_CTRLRATE, "SNDCTL_SEQ_CTRLRATE"},
201 {SNDCTL_SEQ_GETOUTCOUNT, "SNDCTL_SEQ_GETOUTCOUNT"},
202 {SNDCTL_SEQ_GETINCOUNT, "SNDCTL_SEQ_GETINCOUNT"},
203 {SNDCTL_SEQ_PERCMODE, "SNDCTL_SEQ_PERCMODE"},
204 {SNDCTL_FM_LOAD_INSTR, "SNDCTL_FM_LOAD_INSTR"},
205 {SNDCTL_SEQ_TESTMIDI, "SNDCTL_SEQ_TESTMIDI"},
206 {SNDCTL_SEQ_RESETSAMPLES, "SNDCTL_SEQ_RESETSAMPLES"},
207 {SNDCTL_SEQ_NRSYNTHS, "SNDCTL_SEQ_NRSYNTHS"},
208 {SNDCTL_SEQ_NRMIDIS, "SNDCTL_SEQ_NRMIDIS"},
209 {SNDCTL_SEQ_GETTIME, "SNDCTL_SEQ_GETTIME"},
210 {SNDCTL_MIDI_INFO, "SNDCTL_MIDI_INFO"},
211 {SNDCTL_SEQ_THRESHOLD, "SNDCTL_SEQ_THRESHOLD"},
212 {SNDCTL_SYNTH_MEMAVL, "SNDCTL_SYNTH_MEMAVL"},
213 {SNDCTL_FM_4OP_ENABLE, "SNDCTL_FM_4OP_ENABLE"},
214 {SNDCTL_PMGR_ACCESS, "SNDCTL_PMGR_ACCESS"},
215 {SNDCTL_SEQ_PANIC, "SNDCTL_SEQ_PANIC"},
216 {SNDCTL_SEQ_OUTOFBAND, "SNDCTL_SEQ_OUTOFBAND"},
217 {SNDCTL_TMR_TIMEBASE, "SNDCTL_TMR_TIMEBASE"},
218 {SNDCTL_TMR_START, "SNDCTL_TMR_START"},
219 {SNDCTL_TMR_STOP, "SNDCTL_TMR_STOP"},
220 {SNDCTL_TMR_CONTINUE, "SNDCTL_TMR_CONTINUE"},
221 {SNDCTL_TMR_TEMPO, "SNDCTL_TMR_TEMPO"},
222 {SNDCTL_TMR_SOURCE, "SNDCTL_TMR_SOURCE"},
223 {SNDCTL_TMR_METRONOME, "SNDCTL_TMR_METRONOME"},
224 {SNDCTL_TMR_SELECT, "SNDCTL_TMR_SELECT"},
225 {SNDCTL_MIDI_PRETIME, "SNDCTL_MIDI_PRETIME"},
226 {AIONWRITE, "AIONWRITE"},
227 {AIOGSIZE, "AIOGSIZE"},
228 {AIOSSIZE, "AIOSSIZE"},
229 {AIOGFMT, "AIOGFMT"},
230 {AIOSFMT, "AIOSFMT"},
231 {AIOGMIX, "AIOGMIX"},
232 {AIOSMIX, "AIOSMIX"},
233 {AIOSTOP, "AIOSTOP"},
234 {AIOSYNC, "AIOSYNC"},
235 {AIOGCAP, "AIOGCAP"},
239 midi_cmdtab cmdtab_timer[] = {
240 {TMR_WAIT_REL, "TMR_WAIT_REL"},
241 {TMR_WAIT_ABS, "TMR_WAIT_ABS"},
242 {TMR_STOP, "TMR_STOP"},
243 {TMR_START, "TMR_START"},
244 {TMR_CONTINUE, "TMR_CONTINUE"},
245 {TMR_TEMPO, "TMR_TEMPO"},
246 {TMR_ECHO, "TMR_ECHO"},
247 {TMR_CLOCK, "TMR_CLOCK"},
248 {TMR_SPP, "TMR_SPP"},
249 {TMR_TIMESIG, "TMR_TIMESIG"},
253 midi_cmdtab cmdtab_seqcv[] = {
254 {MIDI_NOTEOFF, "MIDI_NOTEOFF"},
255 {MIDI_NOTEON, "MIDI_NOTEON"},
256 {MIDI_KEY_PRESSURE, "MIDI_KEY_PRESSURE"},
260 midi_cmdtab cmdtab_seqccmn[] = {
261 {MIDI_CTL_CHANGE, "MIDI_CTL_CHANGE"},
262 {MIDI_PGM_CHANGE, "MIDI_PGM_CHANGE"},
263 {MIDI_CHN_PRESSURE, "MIDI_CHN_PRESSURE"},
264 {MIDI_PITCH_BEND, "MIDI_PITCH_BEND"},
265 {MIDI_SYSTEM_PREFIX, "MIDI_SYSTEM_PREFIX"},
269 #ifndef KOBJMETHOD_END
270 #define KOBJMETHOD_END { NULL, NULL }
274 * static const char *mpu401_mprovider(kobj_t obj, struct mpu401 *m);
277 static kobj_method_t seq_methods[] = {
278 /* KOBJMETHOD(mpu_provider,mpu401_mprovider), */
282 DEFINE_CLASS(sequencer, seq_methods, 0);
284 /* The followings are the local function. */
285 static int seq_convertold(u_char *event, u_char *out);
288 * static void seq_midiinput(struct seq_softc * scp, void *md);
290 static void seq_reset(struct seq_softc *scp);
291 static int seq_sync(struct seq_softc *scp);
293 static int seq_processevent(struct seq_softc *scp, u_char *event);
295 static int seq_timing(struct seq_softc *scp, u_char *event);
296 static int seq_local(struct seq_softc *scp, u_char *event);
298 static int seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event);
299 static int seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event);
300 static int seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event);
302 static int seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md);
303 void seq_copytoinput(struct seq_softc *scp, u_char *event, int len);
304 int seq_modevent(module_t mod, int type, void *data);
305 struct seq_softc *seqs[10];
306 static struct lock seqinfo_lock;
307 static u_long nseq = 0;
309 static void timer_start(struct seq_softc *t);
310 static void timer_stop(struct seq_softc *t);
311 static void timer_setvals(struct seq_softc *t, int tempo, int timerbase);
312 static void timer_wait(struct seq_softc *t, int ticks, int wait_abs);
313 static int timer_now(struct seq_softc *t);
317 timer_start(struct seq_softc *t)
320 getmicrotime(&t->timersub);
324 timer_continue(struct seq_softc *t)
328 if (t->timerrun == 1)
332 timevalsub(&now, &t->timerstop);
333 timevaladd(&t->timersub, &now);
337 timer_stop(struct seq_softc *t)
340 getmicrotime(&t->timerstop);
344 timer_setvals(struct seq_softc *t, int tempo, int timerbase)
347 t->timerbase = timerbase;
351 timer_wait(struct seq_softc *t, int ticks, int wait_abs)
353 struct timeval now, when;
355 unsigned long long i;
357 while (t->timerrun == 0) {
358 SEQ_DEBUG(2, kprintf("Timer wait when timer isn't running\n"));
360 * The old sequencer used timeouts that only increased
361 * the timer when the timer was running.
362 * Hence the sequencer would stick (?) if the
363 * timer was disabled.
365 cv_wait(&t->reset_cv, &t->seq_lock);
370 i = ticks * 60ull * 1000000ull / (t->tempo * t->timerbase);
372 when.tv_sec = i / 1000000;
373 when.tv_usec = i % 1000000;
376 kprintf("timer_wait tempo %d timerbase %d ticks %d abs %d u_sec %llu\n",
377 t->tempo, t->timerbase, ticks, wait_abs, i);
382 timevalsub(&now, &t->timersub);
383 timevalsub(&when, &now);
385 if (when.tv_sec < 0 || when.tv_usec < 0) {
387 kprintf("seq_timer error negative time %lds.%06lds\n",
388 (long)when.tv_sec, (long)when.tv_usec));
391 i = when.tv_sec * 1000000ull;
396 kprintf("seq_timer usec %llu ticks %llu\n",
397 when.tv_sec * 1000000ull + when.tv_usec, i);
400 ret = cv_timedwait(&t->reset_cv, &t->seq_lock, i + 1);
403 if (ret != EWOULDBLOCK)
404 SEQ_DEBUG(3, kprintf("seq_timer didn't timeout\n"));
409 timer_now(struct seq_softc *t)
412 unsigned long long i;
415 if (t->timerrun == 0)
420 timevalsub(&now, &t->timersub);
422 i = now.tv_sec * 1000000ull;
430 * kprintf("timer_now: %llu %d\n", i, ret);
437 seq_eventthread(void *arg)
439 struct seq_softc *scp = arg;
442 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
443 SEQ_DEBUG(2, kprintf("seq_eventthread started\n"));
444 while (scp->done == 0) {
446 while (scp->playing == 0) {
447 cv_wait(&scp->state_cv, &scp->seq_lock);
452 while (MIDIQ_EMPTY(scp->out_q)) {
453 cv_broadcast(&scp->empty_cv);
454 cv_wait(&scp->out_cv, &scp->seq_lock);
455 if (scp->playing == 0)
461 MIDIQ_DEQ(scp->out_q, event, EV_SZ);
463 if (MIDIQ_AVAIL(scp->out_q) < scp->out_water) {
464 cv_broadcast(&scp->out_cv);
465 KNOTE(&scp->out_kq.ki_note, 0);
467 seq_processevent(scp, event);
471 cv_broadcast(&scp->th_cv);
472 lockmgr(&scp->seq_lock, LK_RELEASE);
473 SEQ_DEBUG(2, kprintf("seq_eventthread finished\n"));
478 * seq_processevent: This maybe called by the event thread or the IOCTL
479 * handler for queued and out of band events respectively.
482 seq_processevent(struct seq_softc *scp, u_char *event)
489 if (event[0] == EV_SEQ_LOCAL)
490 ret = seq_local(scp, event);
491 else if (event[0] == EV_TIMING)
492 ret = seq_timing(scp, event);
493 else if (event[0] != EV_CHN_VOICE &&
494 event[0] != EV_CHN_COMMON &&
495 event[0] != EV_SYSEX &&
496 event[0] != SEQ_MIDIPUTC) {
498 SEQ_DEBUG(2, kprintf("seq_processevent not known %d\n",
500 } else if (seq_fetch_mid(scp, event[1], &m) != 0) {
502 SEQ_DEBUG(2, kprintf("seq_processevent midi unit not found %d\n",
507 ret = seq_chnvoice(scp, m, event);
510 ret = seq_chncommon(scp, m, event);
513 ret = seq_sysex(scp, m, event);
516 lockmgr(&scp->seq_lock, LK_RELEASE);
517 ret = SYNTH_WRITERAW(m, &event[2], 1);
518 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
527 struct seq_softc *scp;
531 /* Allocate the softc. */
533 scp = kmalloc(sizeof(*scp), M_DEVBUF, M_WAITOK | M_ZERO);
534 kobj_init((kobj_t)scp, &sequencer_class);
536 buf = kmalloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_WAITOK | M_ZERO);
537 MIDIQ_INIT(scp->in_q, buf, EV_SZ * 1024);
538 buf = kmalloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_WAITOK | M_ZERO);
539 MIDIQ_INIT(scp->out_q, buf, EV_SZ * 1024);
542 scp->midis = kmalloc(sizeof(kobj_t) * 32, M_TEMP, M_WAITOK | M_ZERO);
543 scp->midi_flags = kmalloc(sizeof(*scp->midi_flags) * 32, M_TEMP,
548 lockinit(&scp->seq_lock, "seqflq", 0, LK_CANRECURSE);
549 cv_init(&scp->state_cv, "seqstate");
550 cv_init(&scp->empty_cv, "seqempty");
551 cv_init(&scp->reset_cv, "seqtimer");
552 cv_init(&scp->out_cv, "seqqout");
553 cv_init(&scp->in_cv, "seqqin");
554 cv_init(&scp->th_cv, "seqstart");
557 * Init the damn timer
560 scp->mapper = midimapper_addseq(scp, &scp->unit, &scp->mapper_cookie);
561 if (scp->mapper == NULL)
564 scp->seqdev = make_dev(&seq_ops,
565 MIDIMKMINOR(scp->unit, SND_DEV_SEQ, 0), UID_ROOT,
566 GID_WHEEL, 0666, "sequencer%d", scp->unit);
568 scp->musicdev = make_dev(&seq_ops,
569 MIDIMKMINOR(scp->unit, SND_DEV_MUSIC, 0), UID_ROOT,
570 GID_WHEEL, 0666, "music%d", scp->unit);
572 if (scp->seqdev == NULL || scp->musicdev == NULL)
575 * TODO: Add to list of sequencers this module provides
580 (seq_eventthread, scp, NULL,
581 "sequencer %02d", scp->unit);
586 scp->seqdev->si_drv1 = scp->musicdev->si_drv1 = scp;
588 SEQ_DEBUG(2, kprintf("sequencer %d created scp %p\n", scp->unit, scp));
592 lockmgr(&seqinfo_lock, LK_EXCLUSIVE);
594 lockmgr(&seqinfo_lock, LK_RELEASE);
600 if (scp->seqdev != NULL)
601 destroy_dev(scp->seqdev);
602 if (scp->musicdev != NULL)
603 destroy_dev(scp->musicdev);
605 * TODO: Destroy mutex and cv
607 if (scp->midis != NULL)
608 kfree(scp->midis, M_TEMP);
609 if (scp->midi_flags != NULL)
610 kfree(scp->midi_flags, M_TEMP);
612 kfree(scp->out_q.b, M_TEMP);
614 kfree(scp->in_q.b, M_TEMP);
615 kfree(scp, M_DEVBUF);
622 seq_delunit(int unit)
624 struct seq_softc *scp = seqs[unit];
627 //SEQ_DEBUG(4, kprintf("seq_delunit: %d\n", unit));
628 SEQ_DEBUG(1, kprintf("seq_delunit: 1 \n"));
629 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
633 cv_broadcast(&scp->out_cv);
634 cv_broadcast(&scp->state_cv);
635 cv_broadcast(&scp->reset_cv);
636 SEQ_DEBUG(1, kprintf("seq_delunit: 2 \n"));
637 cv_wait(&scp->th_cv, &scp->seq_lock);
638 SEQ_DEBUG(1, kprintf("seq_delunit: 3.0 \n"));
639 lockmgr(&scp->seq_lock, LK_RELEASE);
640 SEQ_DEBUG(1, kprintf("seq_delunit: 3.1 \n"));
642 cv_destroy(&scp->state_cv);
643 SEQ_DEBUG(1, kprintf("seq_delunit: 4 \n"));
644 cv_destroy(&scp->empty_cv);
645 SEQ_DEBUG(1, kprintf("seq_delunit: 5 \n"));
646 cv_destroy(&scp->reset_cv);
647 SEQ_DEBUG(1, kprintf("seq_delunit: 6 \n"));
648 cv_destroy(&scp->out_cv);
649 SEQ_DEBUG(1, kprintf("seq_delunit: 7 \n"));
650 cv_destroy(&scp->in_cv);
651 SEQ_DEBUG(1, kprintf("seq_delunit: 8 \n"));
652 cv_destroy(&scp->th_cv);
654 SEQ_DEBUG(1, kprintf("seq_delunit: 10 \n"));
656 destroy_dev(scp->seqdev);
657 SEQ_DEBUG(1, kprintf("seq_delunit: 11 \n"));
659 destroy_dev(scp->musicdev);
660 SEQ_DEBUG(1, kprintf("seq_delunit: 12 \n"));
661 scp->seqdev = scp->musicdev = NULL;
662 if (scp->midis != NULL)
663 kfree(scp->midis, M_TEMP);
664 SEQ_DEBUG(1, kprintf("seq_delunit: 13 \n"));
665 if (scp->midi_flags != NULL)
666 kfree(scp->midi_flags, M_TEMP);
667 SEQ_DEBUG(1, kprintf("seq_delunit: 14 \n"));
668 kfree(scp->out_q.b, M_TEMP);
669 SEQ_DEBUG(1, kprintf("seq_delunit: 15 \n"));
670 kfree(scp->in_q.b, M_TEMP);
672 SEQ_DEBUG(1, kprintf("seq_delunit: 16 \n"));
674 lockuninit(&scp->seq_lock);
675 SEQ_DEBUG(1, kprintf("seq_delunit: 17 \n"));
676 kfree(scp, M_DEVBUF);
678 lockmgr(&seqinfo_lock, LK_EXCLUSIVE);
679 for (i = unit; i < (nseq - 1); i++)
680 seqs[i] = seqs[i + 1];
682 lockmgr(&seqinfo_lock, LK_RELEASE);
688 seq_modevent(module_t mod, int type, void *data)
696 lockinit(&seqinfo_lock, "seqmod", 0, LK_CANRECURSE);
697 retval = seq_addunit();
702 r = seq_delunit(nseq - 1);
710 lockuninit(&seqinfo_lock);
722 seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md)
725 if (unit > scp->midi_number || unit < 0)
728 *md = scp->midis[unit];
734 seq_open(struct dev_open_args *ap)
736 cdev_t i_dev = ap->a_head.a_dev;
737 int flags = ap->a_oflags;
738 struct seq_softc *scp = i_dev->si_drv1;
744 SEQ_DEBUG(3, kprintf("seq_open: scp %p unit %d, flags 0x%x.\n",
745 scp, scp->unit, flags));
748 * Mark this device busy.
751 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
753 lockmgr(&scp->seq_lock, LK_RELEASE);
754 SEQ_DEBUG(2, kprintf("seq_open: unit %d is busy.\n", scp->unit));
759 if ((scp->fflags & O_NONBLOCK) != 0)
760 scp->flags |= SEQ_F_NBIO;
762 scp->music = MIDIDEV(i_dev) == SND_DEV_MUSIC;
765 * Enumerate the available midi devices
767 scp->midi_number = 0;
768 scp->maxunits = midimapper_open(scp->mapper, &scp->mapper_cookie);
770 if (scp->maxunits == 0)
771 SEQ_DEBUG(2, kprintf("seq_open: no midi devices\n"));
773 for (i = 0; i < scp->maxunits; i++) {
774 scp->midis[scp->midi_number] =
775 midimapper_fetch_synth(scp->mapper, scp->mapper_cookie, i);
776 if (scp->midis[scp->midi_number]) {
777 if (SYNTH_OPEN(scp->midis[scp->midi_number], scp,
779 scp->midis[scp->midi_number] = NULL;
781 scp->midi_flags[scp->midi_number] =
782 SYNTH_QUERY(scp->midis[scp->midi_number]);
788 timer_setvals(scp, 60, 100);
793 * actually, if we're in rdonly mode, we should start the timer
796 * TODO: Handle recording now
799 scp->out_water = MIDIQ_SIZE(scp->out_q) / 2;
802 lockmgr(&scp->seq_lock, LK_RELEASE);
804 SEQ_DEBUG(2, kprintf("seq_open: opened, mode %s.\n",
805 scp->music ? "music" : "sequencer"));
807 kprintf("Sequencer %d %p opened maxunits %d midi_number %d:\n",
808 scp->unit, scp, scp->maxunits, scp->midi_number));
809 for (i = 0; i < scp->midi_number; i++)
810 SEQ_DEBUG(3, kprintf(" midi %d %p\n", i, scp->midis[i]));
819 seq_close(struct dev_close_args *ap)
821 cdev_t i_dev = ap->a_head.a_dev;
823 struct seq_softc *scp = i_dev->si_drv1;
829 SEQ_DEBUG(2, kprintf("seq_close: unit %d.\n", scp->unit));
831 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
840 for (i = 0; i < scp->midi_number; i++)
842 SYNTH_CLOSE(scp->midis[i]);
844 midimapper_close(scp->mapper, scp->mapper_cookie);
852 SEQ_DEBUG(3, kprintf("seq_close: closed ret = %d.\n", ret));
853 lockmgr(&scp->seq_lock, LK_RELEASE);
858 seq_read(struct dev_read_args *ap)
860 cdev_t i_dev = ap->a_head.a_dev;
861 struct uio *uio = ap->a_uio;
862 int ioflag = ap->a_ioflag;
864 struct seq_softc *scp = i_dev->si_drv1;
867 u_char buf[SEQ_RSIZE];
872 SEQ_DEBUG(7, kprintf("seq_read: unit %d, resid %zd.\n",
873 scp->unit, uio->uio_resid));
875 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
876 if ((scp->fflags & FREAD) == 0) {
877 SEQ_DEBUG(2, kprintf("seq_read: unit %d is not for reading.\n",
886 * if ((scp->flags & SEQ_F_READING) == 0)
889 * TODO, start recording if not alread
893 * I think the semantics are to return as soon
895 * Second thought, it doens't seem like midimoutain
896 * expects that at all.
897 * TODO: Look up in some sort of spec
900 while (uio->uio_resid > 0) {
901 while (MIDIQ_EMPTY(scp->in_q)) {
902 retval = EWOULDBLOCK;
904 * I wish I knew which one to care about
907 if (scp->fflags & O_NONBLOCK)
909 if (ioflag & O_NONBLOCK)
912 retval = cv_wait_sig(&scp->in_cv, &scp->seq_lock);
917 used = MIN(MIDIQ_LEN(scp->in_q), uio->uio_resid);
918 used = MIN(used, SEQ_RSIZE);
920 SEQ_DEBUG(8, kprintf("midiread: uiomove cc=%d\n", used));
921 MIDIQ_DEQ(scp->in_q, buf, used);
922 retval = uiomove(buf, used, uio);
929 lockmgr(&scp->seq_lock, LK_RELEASE);
930 SEQ_DEBUG(6, kprintf("seq_read: ret %d, resid %zd.\n",
931 retval, uio->uio_resid));
937 seq_write(struct dev_write_args *ap)
939 cdev_t i_dev = ap->a_head.a_dev;
940 struct uio *uio = ap->a_uio;
941 int ioflag = ap->a_ioflag;
942 u_char event[EV_SZ], newevent[EV_SZ], ev_code;
943 struct seq_softc *scp = i_dev->si_drv1;
947 SEQ_DEBUG(7, kprintf("seq_write: unit %d, resid %zd.\n",
948 scp->unit, uio->uio_resid));
953 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
955 if ((scp->fflags & FWRITE) == 0) {
956 SEQ_DEBUG(2, kprintf("seq_write: unit %d is not for writing.\n",
961 while (uio->uio_resid > 0) {
962 while (MIDIQ_AVAIL(scp->out_q) == 0) {
963 retval = EWOULDBLOCK;
964 if (scp->fflags & O_NONBLOCK)
966 if (ioflag & O_NONBLOCK)
968 SEQ_DEBUG(8, kprintf("seq_write cvwait\n"));
971 cv_broadcast(&scp->out_cv);
972 cv_broadcast(&scp->state_cv);
974 retval = cv_wait_sig(&scp->out_cv, &scp->seq_lock);
976 * We slept, maybe things have changed since last
985 if (scp != i_dev->si_drv1)
990 used = MIN(uio->uio_resid, 4);
992 SEQ_DEBUG(8, kprintf("seqout: resid %zd len %jd avail %jd\n",
993 uio->uio_resid, (intmax_t)MIDIQ_LEN(scp->out_q),
994 (intmax_t)MIDIQ_AVAIL(scp->out_q)));
1000 retval = uiomove(event, used, uio);
1005 SEQ_DEBUG(8, kprintf("seq_write: unit %d, event %s.\n",
1006 scp->unit, midi_cmdname(ev_code, cmdtab_seqevent)));
1008 /* Have a look at the event code. */
1009 if (ev_code == SEQ_FULLSIZE) {
1012 * TODO: restore code for SEQ_FULLSIZE
1016 * A long event, these are the patches/samples for a
1019 midiunit = *(u_short *)&event[2];
1020 lockmgr(&sd->seq_lock, LK_EXCLUSIVE);
1021 ret = lookup_mididev(scp, midiunit, LOOKUP_OPEN, &md);
1022 lockmgr(&sd->seq_lock, LK_RELEASE);
1026 SEQ_DEBUG(kprintf("seq_write: loading a patch to the unit %d.\n", midiunit));
1028 ret = md->synth.loadpatch(md, *(short *)&event[0], buf,
1033 * For now, just flush the darn buffer
1036 kprintf("seq_write: SEQ_FULLSIZE flusing buffer.\n"));
1037 while (uio->uio_resid > 0) {
1038 retval = uiomove(event, EV_SZ, uio);
1048 if (ev_code >= 128) {
1051 * Some sort of an extended event. The size is eight
1052 * bytes. scoop extra info.
1054 if (scp->music && ev_code == SEQ_EXTENDED) {
1055 SEQ_DEBUG(2, kprintf("seq_write: invalid level two event %x.\n", ev_code));
1058 if (uiomove((caddr_t)&event[4], 4, uio)) {
1060 kprintf("seq_write: user memory mangled?\n"));
1068 SEQ_DEBUG(2, kprintf("seq_write: four byte event in music mode.\n"));
1072 if (ev_code == SEQ_MIDIPUTC) {
1074 * TODO: event[2] is unit number to receive char.
1079 #ifdef not_ever_ever
1080 if (event[0] == EV_TIMING &&
1081 (event[1] == TMR_START || event[1] == TMR_STOP)) {
1083 * For now, try to make midimoutain work by
1084 * forcing these events to be processed
1087 seq_processevent(scp, event);
1089 MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1091 MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1094 if (seq_convertold(event, newevent) > 0)
1095 MIDIQ_ENQ(scp->out_q, newevent, EV_SZ);
1105 cv_broadcast(&scp->state_cv);
1106 cv_broadcast(&scp->out_cv);
1112 kprintf("seq_write done: leftover buffer length %zd retval %d\n",
1113 uio->uio_resid, retval));
1114 lockmgr(&scp->seq_lock, LK_RELEASE);
1119 seq_ioctl(struct dev_ioctl_args *ap)
1121 cdev_t i_dev = ap->a_head.a_dev;
1122 u_long cmd = ap->a_cmd;
1123 caddr_t arg = ap->a_data;
1124 int mode = ap->a_fflag;
1125 int midiunit, ret, tmp;
1126 struct seq_softc *scp = i_dev->si_drv1;
1127 struct synth_info *synthinfo;
1128 struct midi_info *midiinfo;
1129 u_char event[EV_SZ];
1130 u_char newevent[EV_SZ];
1135 * struct snd_size *sndsize;
1141 SEQ_DEBUG(6, kprintf("seq_ioctl: unit %d, cmd %s.\n",
1142 scp->unit, midi_cmdname(cmd, cmdtab_seqioctl)));
1147 case SNDCTL_SEQ_GETTIME:
1149 * ioctl needed by libtse
1151 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1152 *(int *)arg = timer_now(scp);
1153 lockmgr(&scp->seq_lock, LK_RELEASE);
1154 SEQ_DEBUG(6, kprintf("seq_ioctl: gettime %d.\n", *(int *)arg));
1157 case SNDCTL_TMR_METRONOME:
1159 case SNDCTL_TMR_SOURCE:
1165 case SNDCTL_TMR_TEMPO:
1166 event[1] = TMR_TEMPO;
1167 event[4] = *(int *)arg & 0xFF;
1168 event[5] = (*(int *)arg >> 8) & 0xFF;
1169 event[6] = (*(int *)arg >> 16) & 0xFF;
1170 event[7] = (*(int *)arg >> 24) & 0xFF;
1172 case SNDCTL_TMR_TIMEBASE:
1173 event[1] = TMR_TIMERBASE;
1174 event[4] = *(int *)arg & 0xFF;
1175 event[5] = (*(int *)arg >> 8) & 0xFF;
1176 event[6] = (*(int *)arg >> 16) & 0xFF;
1177 event[7] = (*(int *)arg >> 24) & 0xFF;
1179 case SNDCTL_TMR_START:
1180 event[1] = TMR_START;
1182 case SNDCTL_TMR_STOP:
1183 event[1] = TMR_STOP;
1185 case SNDCTL_TMR_CONTINUE:
1186 event[1] = TMR_CONTINUE;
1188 event[0] = EV_TIMING;
1189 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1192 lockmgr(&scp->seq_lock, LK_RELEASE);
1195 seq_processevent(scp, event);
1196 lockmgr(&scp->seq_lock, LK_RELEASE);
1198 case SNDCTL_TMR_SELECT:
1200 kprintf("seq_ioctl: SNDCTL_TMR_SELECT not supported\n"));
1203 case SNDCTL_SEQ_SYNC:
1204 if (mode == O_RDONLY) {
1208 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1209 ret = seq_sync(scp);
1210 lockmgr(&scp->seq_lock, LK_RELEASE);
1212 case SNDCTL_SEQ_PANIC:
1214 case SNDCTL_SEQ_RESET:
1216 * SNDCTL_SEQ_PANIC == SNDCTL_SEQ_RESET
1218 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1220 lockmgr(&scp->seq_lock, LK_RELEASE);
1223 case SNDCTL_SEQ_TESTMIDI:
1224 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1226 * TODO: SNDCTL_SEQ_TESTMIDI now means "can I write to the
1229 lockmgr(&scp->seq_lock, LK_RELEASE);
1232 case SNDCTL_SEQ_GETINCOUNT:
1233 if (mode == O_WRONLY)
1236 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1237 *(int *)arg = scp->in_q.rl;
1238 lockmgr(&scp->seq_lock, LK_RELEASE);
1239 SEQ_DEBUG(kprintf("seq_ioctl: incount %d.\n",
1244 case SNDCTL_SEQ_GETOUTCOUNT:
1245 if (mode == O_RDONLY)
1248 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1249 *(int *)arg = scp->out_q.fl;
1250 lockmgr(&scp->seq_lock, LK_RELEASE);
1251 SEQ_DEBUG(kprintf("seq_ioctl: outcount %d.\n",
1257 case SNDCTL_SEQ_CTRLRATE:
1258 if (*(int *)arg != 0) {
1262 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1263 *(int *)arg = scp->timerbase;
1264 lockmgr(&scp->seq_lock, LK_RELEASE);
1265 SEQ_DEBUG(3, kprintf("seq_ioctl: ctrlrate %d.\n", *(int *)arg));
1269 * TODO: ioctl SNDCTL_SEQ_RESETSAMPLES
1272 case SNDCTL_SEQ_RESETSAMPLES:
1273 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1274 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1275 lockmgr(&scp->seq_lock, LK_RELEASE);
1278 ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg,
1279 SND_DEV_MIDIN), cmd, arg, mode, td);
1282 case SNDCTL_SEQ_NRSYNTHS:
1283 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1284 *(int *)arg = scp->midi_number;
1285 lockmgr(&scp->seq_lock, LK_RELEASE);
1286 SEQ_DEBUG(3, kprintf("seq_ioctl: synths %d.\n", *(int *)arg));
1289 case SNDCTL_SEQ_NRMIDIS:
1290 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1295 * TODO: count the numbder of devices that can WRITERAW
1297 *(int *)arg = scp->midi_number;
1299 lockmgr(&scp->seq_lock, LK_RELEASE);
1300 SEQ_DEBUG(3, kprintf("seq_ioctl: midis %d.\n", *(int *)arg));
1304 * TODO: ioctl SNDCTL_SYNTH_MEMAVL
1307 case SNDCTL_SYNTH_MEMAVL:
1308 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1309 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1310 lockmgr(&scp->seq_lock, LK_RELEASE);
1313 ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg,
1314 SND_DEV_MIDIN), cmd, arg, mode, td);
1317 case SNDCTL_SEQ_OUTOFBAND:
1318 for (ret = 0; ret < EV_SZ; ret++)
1319 event[ret] = (u_char)arg[0];
1321 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1323 ret = seq_processevent(scp, event);
1325 if (seq_convertold(event, newevent) > 0)
1326 ret = seq_processevent(scp, newevent);
1330 lockmgr(&scp->seq_lock, LK_RELEASE);
1332 case SNDCTL_SYNTH_INFO:
1333 synthinfo = (struct synth_info *)arg;
1334 midiunit = synthinfo->device;
1335 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1336 if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1337 bzero(synthinfo, sizeof(*synthinfo));
1338 synthinfo->name[0] = 'f';
1339 synthinfo->name[1] = 'a';
1340 synthinfo->name[2] = 'k';
1341 synthinfo->name[3] = 'e';
1342 synthinfo->name[4] = 's';
1343 synthinfo->name[5] = 'y';
1344 synthinfo->name[6] = 'n';
1345 synthinfo->name[7] = 't';
1346 synthinfo->name[8] = 'h';
1347 synthinfo->device = midiunit;
1348 synthinfo->synth_type = SYNTH_TYPE_MIDI;
1349 synthinfo->capabilities = scp->midi_flags[midiunit];
1353 lockmgr(&scp->seq_lock, LK_RELEASE);
1355 case SNDCTL_MIDI_INFO:
1356 midiinfo = (struct midi_info *)arg;
1357 midiunit = midiinfo->device;
1358 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1359 if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1360 bzero(midiinfo, sizeof(*midiinfo));
1361 midiinfo->name[0] = 'f';
1362 midiinfo->name[1] = 'a';
1363 midiinfo->name[2] = 'k';
1364 midiinfo->name[3] = 'e';
1365 midiinfo->name[4] = 'm';
1366 midiinfo->name[5] = 'i';
1367 midiinfo->name[6] = 'd';
1368 midiinfo->name[7] = 'i';
1369 midiinfo->device = midiunit;
1370 midiinfo->capabilities = scp->midi_flags[midiunit];
1372 * TODO: What devtype?
1374 midiinfo->dev_type = 0x01;
1378 lockmgr(&scp->seq_lock, LK_RELEASE);
1380 case SNDCTL_SEQ_THRESHOLD:
1381 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1382 RANGE(*(int *)arg, 1, MIDIQ_SIZE(scp->out_q) - 1);
1383 scp->out_water = *(int *)arg;
1384 lockmgr(&scp->seq_lock, LK_RELEASE);
1385 SEQ_DEBUG(3, kprintf("seq_ioctl: water %d.\n", *(int *)arg));
1388 case SNDCTL_MIDI_PRETIME:
1392 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1393 scp->pre_event_timeout = (hz * tmp) / 10;
1394 *(int *)arg = scp->pre_event_timeout;
1395 lockmgr(&scp->seq_lock, LK_RELEASE);
1396 SEQ_DEBUG(3, kprintf("seq_ioctl: pretime %d.\n", *(int *)arg));
1399 case SNDCTL_FM_4OP_ENABLE:
1400 case SNDCTL_PMGR_IFACE:
1401 case SNDCTL_PMGR_ACCESS:
1403 * Patch manager and fm are ded, ded, ded.
1408 * TODO: Consider ioctl default case.
1410 * if ((scp->fflags & O_ACCMODE) == FREAD) {
1414 * Then pass on the ioctl to device 0
1417 kprintf("seq_ioctl: unsupported IOCTL %ld.\n", cmd));
1426 seq_kqfilter(struct dev_kqfilter_args *ap)
1428 cdev_t dev = ap->a_head.a_dev;
1429 struct knote *kn = ap->a_kn;
1430 struct seq_softc *scp;
1431 struct klist *klist;
1436 switch (kn->kn_filter) {
1438 kn->kn_fop = &seq_read_filterops;
1439 kn->kn_hook = (caddr_t)scp;
1440 klist = &scp->in_kq.ki_note;
1443 kn->kn_fop = &seq_write_filterops;
1444 kn->kn_hook = (caddr_t)scp;
1445 klist = &scp->out_kq.ki_note;
1448 ap->a_result = EOPNOTSUPP;
1452 knote_insert(klist, kn);
1458 seq_filter_detach(struct knote *kn)
1460 struct seq_softc *scp = (struct seq_softc *)kn->kn_hook;
1461 struct klist *in_klist = &scp->in_kq.ki_note;
1462 struct klist *out_klist = &scp->out_kq.ki_note;
1464 knote_remove(in_klist, kn);
1465 knote_remove(out_klist, kn);
1469 seq_filter_read(struct knote *kn, long hint)
1471 struct seq_softc *scp = (struct seq_softc *)kn->kn_hook;
1475 SEQ_DEBUG(3, kprintf("seq_filter_read: unit %d.\n", scp->unit));
1476 SEQ_DEBUG(1, kprintf("seq_filter_read: unit %d.\n", scp->unit));
1478 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1480 /* Look up the apropriate queue and select it. */
1482 /* TODO: Start recording. */
1484 /* Find out the boundary. */
1486 if (MIDIQ_LEN(scp->in_q) >= lim) {
1487 /* We can read now. */
1490 lockmgr(&scp->seq_lock, LK_RELEASE);
1496 seq_filter_write(struct knote *kn, long hint)
1498 struct seq_softc *scp = (struct seq_softc *)kn->kn_hook;
1502 SEQ_DEBUG(3, kprintf("seq_filter_write: unit %d.\n", scp->unit));
1503 SEQ_DEBUG(1, kprintf("seq_filter_write: unit %d.\n", scp->unit));
1505 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1507 /* Look up the apropriate queue and select it. */
1509 /* Start playing. */
1511 cv_broadcast(&scp->state_cv);
1512 cv_broadcast(&scp->out_cv);
1514 lim = scp->out_water;
1516 if (MIDIQ_AVAIL(scp->out_q) >= lim) {
1517 /* We can write now. */
1520 lockmgr(&scp->seq_lock, LK_RELEASE);
1527 sein_qtr(void *p, void /* mididev_info */ *md)
1529 struct seq_softc *scp;
1531 scp = (struct seq_softc *)p;
1533 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1535 /* Restart playing if we have the data to output. */
1536 if (scp->queueout_pending)
1537 seq_callback(scp, SEQ_CB_START | SEQ_CB_WR);
1538 /* Check the midi device if we are reading. */
1539 if ((scp->flags & SEQ_F_READING) != 0)
1540 seq_midiinput(scp, md);
1542 lockmgr(&scp->seq_lock, LK_RELEASE);
1548 * Was the old playevent. Use this to convert and old
1549 * style /dev/sequencer event to a /dev/music event
1552 seq_convertold(u_char *event, u_char *out)
1555 u_char dev, chn, note, vel;
1557 out[0] = out[1] = out[2] = out[3] = out[4] = out[5] = out[6] =
1569 * TODO: Debug statement
1588 out[0] = EV_CHN_VOICE;
1590 out[2] = MIDI_NOTEOFF;
1598 out[0] = EV_CHN_VOICE;
1600 out[2] = MIDI_NOTEON;
1608 * wait delay = (event[2] << 16) + (event[3] << 8) + event[4]
1612 out[0] = EV_CHN_COMMON;
1614 out[2] = MIDI_PGM_CHANGE;
1623 out[2] = MIDI_PGM_CHANGE;
1627 SEQ_DEBUG(4,kprintf("seq_playevent: synctimer\n"));
1633 kprintf("seq_playevent: put data 0x%02x, unit %d.\n",
1634 event[1], event[2]));
1636 * Pass through to the midi device.
1640 out[0] = SEQ_MIDIPUTC;
1648 * This isn't handled here yet because I don't know if I can
1649 * just use four bytes events. There might be consequences
1650 * in the _read routing
1652 if (seq_copytoinput(scp, event, 4) == EAGAIN) {
1668 case SEQ_AFTERTOUCH:
1670 * SYNTH_AFTERTOUCH(md, event[3], event[4])
1674 * SYNTH_PANNING(md, event[3], (char)event[4])
1676 case SEQ_CONTROLLER:
1678 * SYNTH_CONTROLLER(md, event[3], event[4], *(short *)&event[5])
1682 * SYNTH_VOLUMEMETHOD(md, event[3])
1686 kprintf("seq_convertold: SEQ_EXTENDED type %d"
1687 "not handled\n", event[1]));
1693 out[1] = TMR_WAIT_REL;
1698 SEQ_DEBUG(5, kprintf("SEQ_WAIT %d",
1699 event[2] + (event[3] << 8) + (event[4] << 24)));
1709 kprintf("seq_convertold: event type %d not handled %d %d %d\n",
1710 event[0], event[1], event[2], event[3]));
1717 * Writting to the sequencer buffer never blocks and drops
1718 * input which cannot be queued
1721 seq_copytoinput(struct seq_softc *scp, u_char *event, int len)
1724 KKASSERT(lockowned(&scp->seq_lock));
1726 if (MIDIQ_AVAIL(scp->in_q) < len) {
1728 * ENOROOM? EINPUTDROPPED? ETOUGHLUCK?
1730 SEQ_DEBUG(2, kprintf("seq_copytoinput: queue full\n"));
1732 MIDIQ_ENQ(scp->in_q, event, len);
1733 KNOTE(&scp->in_kq.ki_note, 0);
1734 cv_broadcast(&scp->in_cv);
1740 seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event)
1743 u_char cmd, chn, note, parm;
1751 KKASSERT(lockowned(&scp->seq_lock));
1753 SEQ_DEBUG(5, kprintf("seq_chnvoice: unit %d, dev %d, cmd %s,"
1754 " chn %d, note %d, parm %d.\n", scp->unit, event[1],
1755 midi_cmdname(cmd, cmdtab_seqcv), chn, note, parm));
1757 voice = SYNTH_ALLOC(md, chn, note);
1759 lockmgr(&scp->seq_lock, LK_RELEASE);
1763 if (note < 128 || note == 255) {
1765 if (scp->music && chn == 9) {
1767 * This channel is a percussion. The note
1768 * number is the patch number.
1771 lockmgr(&scp->seq_lock, LK_RELEASE);
1772 if (SYNTH_SETINSTR(md, voice, 128 + note)
1774 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1777 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1779 note = 60; /* Middle C. */
1784 lockmgr(&scp->seq_lock, LK_RELEASE);
1785 if (SYNTH_SETUPVOICE(md, voice, chn)
1787 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1790 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1793 SYNTH_STARTNOTE(md, voice, note, parm);
1797 SYNTH_KILLNOTE(md, voice, note, parm);
1799 case MIDI_KEY_PRESSURE:
1800 SYNTH_AFTERTOUCH(md, voice, parm);
1804 SEQ_DEBUG(2, kprintf("seq_chnvoice event type %d not handled\n",
1809 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1814 seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event)
1818 u_char cmd, chn, p1;
1824 w14 = *(u_short *)&event[6];
1826 SEQ_DEBUG(5, kprintf("seq_chncommon: unit %d, dev %d, cmd %s, chn %d,"
1827 " p1 %d, w14 %d.\n", scp->unit, event[1],
1828 midi_cmdname(cmd, cmdtab_seqccmn), chn, p1, w14));
1829 lockmgr(&scp->seq_lock, LK_RELEASE);
1831 case MIDI_PGM_CHANGE:
1832 SEQ_DEBUG(4, kprintf("seq_chncommon pgmchn chn %d pg %d\n",
1834 SYNTH_SETINSTR(md, chn, p1);
1836 case MIDI_CTL_CHANGE:
1837 SEQ_DEBUG(4, kprintf("seq_chncommon ctlch chn %d pg %d %d\n",
1839 SYNTH_CONTROLLER(md, chn, p1, w14);
1841 case MIDI_PITCH_BEND:
1844 * TODO: MIDI_PITCH_BEND
1847 lockmgr(&md->synth.vc_lock, LK_EXCLUSIVE);
1848 md->synth.chn_info[chn].bender_value = w14;
1849 if (md->midiunit >= 0) {
1851 * Handle all of the notes playing on this
1854 key = ((int)chn << 8);
1855 for (i = 0; i < md->synth.alloc.max_voice; i++)
1856 if ((md->synth.alloc.map[i] & 0xff00) == key) {
1857 lockmgr(&md->synth.vc_lock, LK_RELEASE);
1858 lockmgr(&scp->seq_lock, LK_RELEASE);
1859 if (md->synth.bender(md, i, w14) == EAGAIN) {
1860 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1863 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1866 lockmgr(&md->synth.vc_lock, LK_RELEASE);
1867 lockmgr(&scp->seq_lock, LK_RELEASE);
1868 if (md->synth.bender(md, chn, w14) == EAGAIN) {
1869 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1872 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1876 SYNTH_BENDER(md, chn, w14);
1881 kprintf("seq_chncommon event type %d not handled.\n",
1886 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1891 seq_timing(struct seq_softc *scp, u_char *event)
1897 param = event[4] + (event[5] << 8) +
1898 (event[6] << 16) + (event[7] << 24);
1900 SEQ_DEBUG(5, kprintf("seq_timing: unit %d, cmd %d, param %d.\n",
1901 scp->unit, event[1], param));
1904 timer_wait(scp, param, 0);
1907 timer_wait(scp, param, 1);
1911 cv_broadcast(&scp->reset_cv);
1916 * The following cv_broadcast isn't needed since we only
1917 * wait for 0->1 transitions. It probably won't hurt
1919 cv_broadcast(&scp->reset_cv);
1922 timer_continue(scp);
1923 cv_broadcast(&scp->reset_cv);
1930 SEQ_DEBUG(4, kprintf("Timer set tempo %d\n", param));
1931 timer_setvals(scp, param, scp->timerbase);
1938 SEQ_DEBUG(4, kprintf("Timer set timerbase %d\n", param));
1939 timer_setvals(scp, scp->tempo, param);
1943 * TODO: Consider making 4-byte events for /dev/sequencer
1944 * PRO: Maybe needed by legacy apps
1945 * CON: soundcard.h has been warning for a while many years
1946 * to expect 8 byte events.
1950 seq_copytoinput(scp, event, 8);
1952 param = (param << 8 | SEQ_ECHO);
1953 seq_copytoinput(scp, (u_char *)¶m, 4);
1956 seq_copytoinput(scp, event, 8);
1960 SEQ_DEBUG(2, kprintf("seq_timing event type %d not handled.\n",
1969 seq_local(struct seq_softc *scp, u_char *event)
1974 KKASSERT(lockowned(&scp->seq_lock));
1976 SEQ_DEBUG(5, kprintf("seq_local: unit %d, cmd %d\n", scp->unit,
1980 SEQ_DEBUG(1, kprintf("seq_local event type %d not handled\n",
1989 seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event)
1993 KKASSERT(lockowned(&scp->seq_lock));
1994 SEQ_DEBUG(5, kprintf("seq_sysex: unit %d device %d\n", scp->unit,
1997 for (i = 0; i < 6 && event[i + 2] != 0xff; i++)
2000 lockmgr(&scp->seq_lock, LK_RELEASE);
2001 if (SYNTH_SENDSYSEX(md, &event[2], l) == EAGAIN) {
2002 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2005 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2011 * Reset no longer closes the raw devices nor seq_sync's
2012 * Callers are IOCTL and seq_close
2015 seq_reset(struct seq_softc *scp)
2020 KKASSERT(lockowned(&scp->seq_lock));
2022 SEQ_DEBUG(5, kprintf("seq_reset: unit %d.\n", scp->unit));
2025 * Stop reading and writing.
2028 /* scp->recording = 0; */
2030 cv_broadcast(&scp->state_cv);
2031 cv_broadcast(&scp->out_cv);
2032 cv_broadcast(&scp->reset_cv);
2035 * For now, don't reset the timers.
2037 MIDIQ_CLEAR(scp->in_q);
2038 MIDIQ_CLEAR(scp->out_q);
2040 for (i = 0; i < scp->midi_number; i++) {
2042 lockmgr(&scp->seq_lock, LK_RELEASE);
2044 for (chn = 0; chn < 16; chn++) {
2045 SYNTH_CONTROLLER(m, chn, 123, 0);
2046 SYNTH_CONTROLLER(m, chn, 121, 0);
2047 SYNTH_BENDER(m, chn, 1 << 13);
2049 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2055 * *really* flush the output queue
2056 * flush the event queue, then flush the synthsisers.
2057 * Callers are IOCTL and close
2060 #define SEQ_SYNC_TIMEOUT 8
2062 seq_sync(struct seq_softc *scp)
2064 int i, rl, sync[16], done;
2066 KKASSERT(lockowned(&scp->seq_lock));
2068 SEQ_DEBUG(4, kprintf("seq_sync: unit %d.\n", scp->unit));
2071 * Wait until output queue is empty. Check every so often to see if
2072 * the queue is moving along. If it isn't just abort.
2074 while (!MIDIQ_EMPTY(scp->out_q)) {
2076 if (!scp->playing) {
2078 cv_broadcast(&scp->state_cv);
2079 cv_broadcast(&scp->out_cv);
2081 rl = MIDIQ_LEN(scp->out_q);
2083 i = cv_timedwait_sig(&scp->out_cv,
2084 &scp->seq_lock, SEQ_SYNC_TIMEOUT * hz);
2086 if (i == EINTR || i == ERESTART) {
2089 * XXX: I don't know why we stop playing
2092 cv_broadcast(&scp->out_cv);
2096 if (i == EWOULDBLOCK && rl == MIDIQ_LEN(scp->out_q) &&
2097 scp->waiting == 0) {
2099 * A queue seems to be stuck up. Give up and clear
2102 MIDIQ_CLEAR(scp->out_q);
2104 cv_broadcast(&scp->state_cv);
2105 cv_broadcast(&scp->out_cv);
2106 cv_broadcast(&scp->reset_cv);
2109 * TODO: Consider if the raw devices need to be flushed
2112 SEQ_DEBUG(1, kprintf("seq_sync queue stuck, aborting\n"));
2120 * Since syncing a midi device might block, unlock scp->seq_lock.
2123 lockmgr(&scp->seq_lock, LK_RELEASE);
2124 for (i = 0; i < scp->midi_number; i++)
2129 for (i = 0; i < scp->midi_number; i++)
2131 if (SYNTH_INSYNC(scp->midis[i]) == 0)
2141 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2146 midi_cmdname(int cmd, midi_cmdtab *tab)
2148 while (tab->name != NULL) {
2149 if (cmd == tab->cmd)