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>
37 #include <sys/ioccom.h>
39 #include <sys/filio.h>
41 #include <sys/sockio.h>
42 #include <sys/fcntl.h>
44 #include <sys/sysctl.h>
46 #include <sys/kernel.h> /* for DATA_SET */
48 #include <sys/module.h>
52 #include <sys/syslog.h>
53 #include <sys/errno.h>
54 #include <sys/malloc.h>
56 #include <machine/clock.h> /* for DELAY */
57 #include <sys/soundcard.h>
61 #include <sys/mutex.h>
62 #include <sys/condvar.h>
63 #include <sys/kthread.h>
64 #include <sys/unistd.h>
65 #include <sys/device.h>
67 #ifdef HAVE_KERNEL_OPTION_HEADERS
71 #include <dev/sound/midi/midi.h>
72 #include <dev/sound/midi/midiq.h>
75 #include <dev/sound/midi/sequencer.h>
77 #define TMR_TIMERBASE 13
79 #define SND_DEV_SEQ 1 /* Sequencer output /dev/sequencer (FM
80 * synthesizer and MIDI output) */
81 #define SND_DEV_MUSIC 8 /* /dev/music, level 2 interface */
83 /* Length of a sequencer event. */
88 #define LOOKUP_EXIST (0)
89 #define LOOKUP_OPEN (1)
90 #define LOOKUP_CLOSE (2)
92 #define PCMMKMINOR(u, d, c) \
93 ((((c) & 0xff) << 16) | (((u) & 0x0f) << 4) | ((d) & 0x0f))
94 #define MIDIMKMINOR(u, d, c) PCMMKMINOR(u, d, c)
95 #define MIDIUNIT(y) ((dev2unit(y) >> 4) & 0x0f)
96 #define MIDIDEV(y) (dev2unit(y) & 0x0f)
98 /* These are the entries to the sequencer driver. */
99 static d_open_t seq_open;
100 static d_close_t seq_close;
101 static d_ioctl_t seq_ioctl;
102 static d_read_t seq_read;
103 static d_write_t seq_write;
104 static d_kqfilter_t seq_kqfilter;
106 static void seq_filter_detach(struct knote *);
107 static int seq_filter_read(struct knote *, long);
108 static int seq_filter_write(struct knote *, long);
110 static struct dev_ops seq_ops = {
111 { "sequencer", 0, D_MPSAFE },
113 .d_close = seq_close,
115 .d_write = seq_write,
116 .d_ioctl = seq_ioctl,
117 .d_kqfilter = seq_kqfilter,
120 static struct filterops seq_read_filterops =
121 { FILTEROP_ISFD, NULL, seq_filter_detach, seq_filter_read };
122 static struct filterops seq_write_filterops =
123 { FILTEROP_ISFD, NULL, seq_filter_detach, seq_filter_write };
128 struct lock seq_lock, q_lock;
129 struct cv empty_cv, reset_cv, in_cv, out_cv, state_cv, th_cv;
131 MIDIQ_HEAD(, u_char) in_q, out_q;
134 /* Flags (protected by flag_mtx of mididev_info) */
135 int fflags; /* Access mode */
138 int out_water; /* Sequence output threshould */
139 snd_sync_parm sync_parm; /* AIOSYNC parameter set */
140 struct thread *sync_thread; /* AIOSYNCing thread */
141 struct kqinfo in_kq, out_kq;
143 struct cdev *seqdev, *musicdev;
150 struct timeval timerstop, timersub;
151 int timerbase, tempo;
157 int pre_event_timeout;
162 * Module specific stuff, including how many sequecers
166 SYSCTL_NODE(_hw_midi, OID_AUTO, seq, CTLFLAG_RD, 0, "Midi sequencer");
169 /* XXX: should this be moved into debug.midi? */
170 SYSCTL_INT(_hw_midi_seq, OID_AUTO, debug, CTLFLAG_RW, &seq_debug, 0, "");
172 midi_cmdtab cmdtab_seqevent[] = {
173 {SEQ_NOTEOFF, "SEQ_NOTEOFF"},
174 {SEQ_NOTEON, "SEQ_NOTEON"},
175 {SEQ_WAIT, "SEQ_WAIT"},
176 {SEQ_PGMCHANGE, "SEQ_PGMCHANGE"},
177 {SEQ_SYNCTIMER, "SEQ_SYNCTIMER"},
178 {SEQ_MIDIPUTC, "SEQ_MIDIPUTC"},
179 {SEQ_DRUMON, "SEQ_DRUMON"},
180 {SEQ_DRUMOFF, "SEQ_DRUMOFF"},
181 {SEQ_ECHO, "SEQ_ECHO"},
182 {SEQ_AFTERTOUCH, "SEQ_AFTERTOUCH"},
183 {SEQ_CONTROLLER, "SEQ_CONTROLLER"},
184 {SEQ_BALANCE, "SEQ_BALANCE"},
185 {SEQ_VOLMODE, "SEQ_VOLMODE"},
186 {SEQ_FULLSIZE, "SEQ_FULLSIZE"},
187 {SEQ_PRIVATE, "SEQ_PRIVATE"},
188 {SEQ_EXTENDED, "SEQ_EXTENDED"},
189 {EV_SEQ_LOCAL, "EV_SEQ_LOCAL"},
190 {EV_TIMING, "EV_TIMING"},
191 {EV_CHN_COMMON, "EV_CHN_COMMON"},
192 {EV_CHN_VOICE, "EV_CHN_VOICE"},
193 {EV_SYSEX, "EV_SYSEX"},
197 midi_cmdtab cmdtab_seqioctl[] = {
198 {SNDCTL_SEQ_RESET, "SNDCTL_SEQ_RESET"},
199 {SNDCTL_SEQ_SYNC, "SNDCTL_SEQ_SYNC"},
200 {SNDCTL_SYNTH_INFO, "SNDCTL_SYNTH_INFO"},
201 {SNDCTL_SEQ_CTRLRATE, "SNDCTL_SEQ_CTRLRATE"},
202 {SNDCTL_SEQ_GETOUTCOUNT, "SNDCTL_SEQ_GETOUTCOUNT"},
203 {SNDCTL_SEQ_GETINCOUNT, "SNDCTL_SEQ_GETINCOUNT"},
204 {SNDCTL_SEQ_PERCMODE, "SNDCTL_SEQ_PERCMODE"},
205 {SNDCTL_FM_LOAD_INSTR, "SNDCTL_FM_LOAD_INSTR"},
206 {SNDCTL_SEQ_TESTMIDI, "SNDCTL_SEQ_TESTMIDI"},
207 {SNDCTL_SEQ_RESETSAMPLES, "SNDCTL_SEQ_RESETSAMPLES"},
208 {SNDCTL_SEQ_NRSYNTHS, "SNDCTL_SEQ_NRSYNTHS"},
209 {SNDCTL_SEQ_NRMIDIS, "SNDCTL_SEQ_NRMIDIS"},
210 {SNDCTL_SEQ_GETTIME, "SNDCTL_SEQ_GETTIME"},
211 {SNDCTL_MIDI_INFO, "SNDCTL_MIDI_INFO"},
212 {SNDCTL_SEQ_THRESHOLD, "SNDCTL_SEQ_THRESHOLD"},
213 {SNDCTL_SYNTH_MEMAVL, "SNDCTL_SYNTH_MEMAVL"},
214 {SNDCTL_FM_4OP_ENABLE, "SNDCTL_FM_4OP_ENABLE"},
215 {SNDCTL_PMGR_ACCESS, "SNDCTL_PMGR_ACCESS"},
216 {SNDCTL_SEQ_PANIC, "SNDCTL_SEQ_PANIC"},
217 {SNDCTL_SEQ_OUTOFBAND, "SNDCTL_SEQ_OUTOFBAND"},
218 {SNDCTL_TMR_TIMEBASE, "SNDCTL_TMR_TIMEBASE"},
219 {SNDCTL_TMR_START, "SNDCTL_TMR_START"},
220 {SNDCTL_TMR_STOP, "SNDCTL_TMR_STOP"},
221 {SNDCTL_TMR_CONTINUE, "SNDCTL_TMR_CONTINUE"},
222 {SNDCTL_TMR_TEMPO, "SNDCTL_TMR_TEMPO"},
223 {SNDCTL_TMR_SOURCE, "SNDCTL_TMR_SOURCE"},
224 {SNDCTL_TMR_METRONOME, "SNDCTL_TMR_METRONOME"},
225 {SNDCTL_TMR_SELECT, "SNDCTL_TMR_SELECT"},
226 {SNDCTL_MIDI_PRETIME, "SNDCTL_MIDI_PRETIME"},
227 {AIONWRITE, "AIONWRITE"},
228 {AIOGSIZE, "AIOGSIZE"},
229 {AIOSSIZE, "AIOSSIZE"},
230 {AIOGFMT, "AIOGFMT"},
231 {AIOSFMT, "AIOSFMT"},
232 {AIOGMIX, "AIOGMIX"},
233 {AIOSMIX, "AIOSMIX"},
234 {AIOSTOP, "AIOSTOP"},
235 {AIOSYNC, "AIOSYNC"},
236 {AIOGCAP, "AIOGCAP"},
240 midi_cmdtab cmdtab_timer[] = {
241 {TMR_WAIT_REL, "TMR_WAIT_REL"},
242 {TMR_WAIT_ABS, "TMR_WAIT_ABS"},
243 {TMR_STOP, "TMR_STOP"},
244 {TMR_START, "TMR_START"},
245 {TMR_CONTINUE, "TMR_CONTINUE"},
246 {TMR_TEMPO, "TMR_TEMPO"},
247 {TMR_ECHO, "TMR_ECHO"},
248 {TMR_CLOCK, "TMR_CLOCK"},
249 {TMR_SPP, "TMR_SPP"},
250 {TMR_TIMESIG, "TMR_TIMESIG"},
254 midi_cmdtab cmdtab_seqcv[] = {
255 {MIDI_NOTEOFF, "MIDI_NOTEOFF"},
256 {MIDI_NOTEON, "MIDI_NOTEON"},
257 {MIDI_KEY_PRESSURE, "MIDI_KEY_PRESSURE"},
261 midi_cmdtab cmdtab_seqccmn[] = {
262 {MIDI_CTL_CHANGE, "MIDI_CTL_CHANGE"},
263 {MIDI_PGM_CHANGE, "MIDI_PGM_CHANGE"},
264 {MIDI_CHN_PRESSURE, "MIDI_CHN_PRESSURE"},
265 {MIDI_PITCH_BEND, "MIDI_PITCH_BEND"},
266 {MIDI_SYSTEM_PREFIX, "MIDI_SYSTEM_PREFIX"},
270 #ifndef KOBJMETHOD_END
271 #define KOBJMETHOD_END { NULL, NULL }
275 * static const char *mpu401_mprovider(kobj_t obj, struct mpu401 *m);
278 static kobj_method_t seq_methods[] = {
279 /* KOBJMETHOD(mpu_provider,mpu401_mprovider), */
283 DEFINE_CLASS(sequencer, seq_methods, 0);
285 /* The followings are the local function. */
286 static int seq_convertold(u_char *event, u_char *out);
289 * static void seq_midiinput(struct seq_softc * scp, void *md);
291 static void seq_reset(struct seq_softc *scp);
292 static int seq_sync(struct seq_softc *scp);
294 static int seq_processevent(struct seq_softc *scp, u_char *event);
296 static int seq_timing(struct seq_softc *scp, u_char *event);
297 static int seq_local(struct seq_softc *scp, u_char *event);
299 static int seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event);
300 static int seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event);
301 static int seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event);
303 static int seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md);
304 void seq_copytoinput(struct seq_softc *scp, u_char *event, int len);
305 int seq_modevent(module_t mod, int type, void *data);
306 struct seq_softc *seqs[10];
307 static struct lock seqinfo_lock;
308 static u_long nseq = 0;
310 static void timer_start(struct seq_softc *t);
311 static void timer_stop(struct seq_softc *t);
312 static void timer_setvals(struct seq_softc *t, int tempo, int timerbase);
313 static void timer_wait(struct seq_softc *t, int ticks, int wait_abs);
314 static int timer_now(struct seq_softc *t);
318 timer_start(struct seq_softc *t)
321 getmicrotime(&t->timersub);
325 timer_continue(struct seq_softc *t)
329 if (t->timerrun == 1)
333 timevalsub(&now, &t->timerstop);
334 timevaladd(&t->timersub, &now);
338 timer_stop(struct seq_softc *t)
341 getmicrotime(&t->timerstop);
345 timer_setvals(struct seq_softc *t, int tempo, int timerbase)
348 t->timerbase = timerbase;
352 timer_wait(struct seq_softc *t, int ticks, int wait_abs)
354 struct timeval now, when;
356 unsigned long long i;
358 while (t->timerrun == 0) {
359 SEQ_DEBUG(2, kprintf("Timer wait when timer isn't running\n"));
361 * The old sequencer used timeouts that only increased
362 * the timer when the timer was running.
363 * Hence the sequencer would stick (?) if the
364 * timer was disabled.
366 cv_wait(&t->reset_cv, &t->seq_lock);
371 i = ticks * 60ull * 1000000ull / (t->tempo * t->timerbase);
373 when.tv_sec = i / 1000000;
374 when.tv_usec = i % 1000000;
377 kprintf("timer_wait tempo %d timerbase %d ticks %d abs %d u_sec %llu\n",
378 t->tempo, t->timerbase, ticks, wait_abs, i);
383 timevalsub(&now, &t->timersub);
384 timevalsub(&when, &now);
386 if (when.tv_sec < 0 || when.tv_usec < 0) {
388 kprintf("seq_timer error negative time %lds.%06lds\n",
389 (long)when.tv_sec, (long)when.tv_usec));
392 i = when.tv_sec * 1000000ull;
397 kprintf("seq_timer usec %llu ticks %llu\n",
398 when.tv_sec * 1000000ull + when.tv_usec, i);
401 ret = cv_timedwait(&t->reset_cv, &t->seq_lock, i + 1);
404 if (ret != EWOULDBLOCK)
405 SEQ_DEBUG(3, kprintf("seq_timer didn't timeout\n"));
410 timer_now(struct seq_softc *t)
413 unsigned long long i;
416 if (t->timerrun == 0)
421 timevalsub(&now, &t->timersub);
423 i = now.tv_sec * 1000000ull;
431 * kprintf("timer_now: %llu %d\n", i, ret);
438 seq_eventthread(void *arg)
440 struct seq_softc *scp = arg;
443 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
444 SEQ_DEBUG(2, kprintf("seq_eventthread started\n"));
445 while (scp->done == 0) {
447 while (scp->playing == 0) {
448 cv_wait(&scp->state_cv, &scp->seq_lock);
453 while (MIDIQ_EMPTY(scp->out_q)) {
454 cv_broadcast(&scp->empty_cv);
455 cv_wait(&scp->out_cv, &scp->seq_lock);
456 if (scp->playing == 0)
462 MIDIQ_DEQ(scp->out_q, event, EV_SZ);
464 if (MIDIQ_AVAIL(scp->out_q) < scp->out_water) {
465 cv_broadcast(&scp->out_cv);
466 KNOTE(&scp->out_kq.ki_note, 0);
468 seq_processevent(scp, event);
472 cv_broadcast(&scp->th_cv);
473 lockmgr(&scp->seq_lock, LK_RELEASE);
474 SEQ_DEBUG(2, kprintf("seq_eventthread finished\n"));
479 * seq_processevent: This maybe called by the event thread or the IOCTL
480 * handler for queued and out of band events respectively.
483 seq_processevent(struct seq_softc *scp, u_char *event)
490 if (event[0] == EV_SEQ_LOCAL)
491 ret = seq_local(scp, event);
492 else if (event[0] == EV_TIMING)
493 ret = seq_timing(scp, event);
494 else if (event[0] != EV_CHN_VOICE &&
495 event[0] != EV_CHN_COMMON &&
496 event[0] != EV_SYSEX &&
497 event[0] != SEQ_MIDIPUTC) {
499 SEQ_DEBUG(2, kprintf("seq_processevent not known %d\n",
501 } else if (seq_fetch_mid(scp, event[1], &m) != 0) {
503 SEQ_DEBUG(2, kprintf("seq_processevent midi unit not found %d\n",
508 ret = seq_chnvoice(scp, m, event);
511 ret = seq_chncommon(scp, m, event);
514 ret = seq_sysex(scp, m, event);
517 lockmgr(&scp->seq_lock, LK_RELEASE);
518 ret = SYNTH_WRITERAW(m, &event[2], 1);
519 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
528 struct seq_softc *scp;
532 /* Allocate the softc. */
534 scp = kmalloc(sizeof(*scp), M_DEVBUF, M_WAITOK | M_ZERO);
535 kobj_init((kobj_t)scp, &sequencer_class);
537 buf = kmalloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_WAITOK | M_ZERO);
538 MIDIQ_INIT(scp->in_q, buf, EV_SZ * 1024);
539 buf = kmalloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_WAITOK | M_ZERO);
540 MIDIQ_INIT(scp->out_q, buf, EV_SZ * 1024);
543 scp->midis = kmalloc(sizeof(kobj_t) * 32, M_TEMP, M_WAITOK | M_ZERO);
544 scp->midi_flags = kmalloc(sizeof(*scp->midi_flags) * 32, M_TEMP,
549 lockinit(&scp->seq_lock, "seqflq", 0, LK_CANRECURSE);
550 cv_init(&scp->state_cv, "seqstate");
551 cv_init(&scp->empty_cv, "seqempty");
552 cv_init(&scp->reset_cv, "seqtimer");
553 cv_init(&scp->out_cv, "seqqout");
554 cv_init(&scp->in_cv, "seqqin");
555 cv_init(&scp->th_cv, "seqstart");
558 * Init the damn timer
561 scp->mapper = midimapper_addseq(scp, &scp->unit, &scp->mapper_cookie);
562 if (scp->mapper == NULL)
565 scp->seqdev = make_dev(&seq_ops,
566 MIDIMKMINOR(scp->unit, SND_DEV_SEQ, 0), UID_ROOT,
567 GID_WHEEL, 0666, "sequencer%d", scp->unit);
569 scp->musicdev = make_dev(&seq_ops,
570 MIDIMKMINOR(scp->unit, SND_DEV_MUSIC, 0), UID_ROOT,
571 GID_WHEEL, 0666, "music%d", scp->unit);
573 if (scp->seqdev == NULL || scp->musicdev == NULL)
576 * TODO: Add to list of sequencers this module provides
581 (seq_eventthread, scp, NULL,
582 "sequencer %02d", scp->unit);
587 scp->seqdev->si_drv1 = scp->musicdev->si_drv1 = scp;
589 SEQ_DEBUG(2, kprintf("sequencer %d created scp %p\n", scp->unit, scp));
593 lockmgr(&seqinfo_lock, LK_EXCLUSIVE);
595 lockmgr(&seqinfo_lock, LK_RELEASE);
601 if (scp->seqdev != NULL)
602 destroy_dev(scp->seqdev);
603 if (scp->musicdev != NULL)
604 destroy_dev(scp->musicdev);
606 * TODO: Destroy mutex and cv
608 if (scp->midis != NULL)
609 kfree(scp->midis, M_TEMP);
610 if (scp->midi_flags != NULL)
611 kfree(scp->midi_flags, M_TEMP);
613 kfree(scp->out_q.b, M_TEMP);
615 kfree(scp->in_q.b, M_TEMP);
616 kfree(scp, M_DEVBUF);
623 seq_delunit(int unit)
625 struct seq_softc *scp = seqs[unit];
628 //SEQ_DEBUG(4, kprintf("seq_delunit: %d\n", unit));
629 SEQ_DEBUG(1, kprintf("seq_delunit: 1 \n"));
630 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
634 cv_broadcast(&scp->out_cv);
635 cv_broadcast(&scp->state_cv);
636 cv_broadcast(&scp->reset_cv);
637 SEQ_DEBUG(1, kprintf("seq_delunit: 2 \n"));
638 cv_wait(&scp->th_cv, &scp->seq_lock);
639 SEQ_DEBUG(1, kprintf("seq_delunit: 3.0 \n"));
640 lockmgr(&scp->seq_lock, LK_RELEASE);
641 SEQ_DEBUG(1, kprintf("seq_delunit: 3.1 \n"));
643 cv_destroy(&scp->state_cv);
644 SEQ_DEBUG(1, kprintf("seq_delunit: 4 \n"));
645 cv_destroy(&scp->empty_cv);
646 SEQ_DEBUG(1, kprintf("seq_delunit: 5 \n"));
647 cv_destroy(&scp->reset_cv);
648 SEQ_DEBUG(1, kprintf("seq_delunit: 6 \n"));
649 cv_destroy(&scp->out_cv);
650 SEQ_DEBUG(1, kprintf("seq_delunit: 7 \n"));
651 cv_destroy(&scp->in_cv);
652 SEQ_DEBUG(1, kprintf("seq_delunit: 8 \n"));
653 cv_destroy(&scp->th_cv);
655 SEQ_DEBUG(1, kprintf("seq_delunit: 10 \n"));
657 destroy_dev(scp->seqdev);
658 SEQ_DEBUG(1, kprintf("seq_delunit: 11 \n"));
660 destroy_dev(scp->musicdev);
661 SEQ_DEBUG(1, kprintf("seq_delunit: 12 \n"));
662 scp->seqdev = scp->musicdev = NULL;
663 if (scp->midis != NULL)
664 kfree(scp->midis, M_TEMP);
665 SEQ_DEBUG(1, kprintf("seq_delunit: 13 \n"));
666 if (scp->midi_flags != NULL)
667 kfree(scp->midi_flags, M_TEMP);
668 SEQ_DEBUG(1, kprintf("seq_delunit: 14 \n"));
669 kfree(scp->out_q.b, M_TEMP);
670 SEQ_DEBUG(1, kprintf("seq_delunit: 15 \n"));
671 kfree(scp->in_q.b, M_TEMP);
673 SEQ_DEBUG(1, kprintf("seq_delunit: 16 \n"));
675 lockuninit(&scp->seq_lock);
676 SEQ_DEBUG(1, kprintf("seq_delunit: 17 \n"));
677 kfree(scp, M_DEVBUF);
679 lockmgr(&seqinfo_lock, LK_EXCLUSIVE);
680 for (i = unit; i < (nseq - 1); i++)
681 seqs[i] = seqs[i + 1];
683 lockmgr(&seqinfo_lock, LK_RELEASE);
689 seq_modevent(module_t mod, int type, void *data)
697 lockinit(&seqinfo_lock, "seqmod", 0, LK_CANRECURSE);
698 retval = seq_addunit();
703 r = seq_delunit(nseq - 1);
711 lockuninit(&seqinfo_lock);
723 seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md)
726 if (unit > scp->midi_number || unit < 0)
729 *md = scp->midis[unit];
735 seq_open(struct dev_open_args *ap)
737 cdev_t i_dev = ap->a_head.a_dev;
738 int flags = ap->a_oflags;
739 struct seq_softc *scp = i_dev->si_drv1;
745 SEQ_DEBUG(3, kprintf("seq_open: scp %p unit %d, flags 0x%x.\n",
746 scp, scp->unit, flags));
749 * Mark this device busy.
752 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
754 lockmgr(&scp->seq_lock, LK_RELEASE);
755 SEQ_DEBUG(2, kprintf("seq_open: unit %d is busy.\n", scp->unit));
760 if ((scp->fflags & O_NONBLOCK) != 0)
761 scp->flags |= SEQ_F_NBIO;
763 scp->music = MIDIDEV(i_dev) == SND_DEV_MUSIC;
766 * Enumerate the available midi devices
768 scp->midi_number = 0;
769 scp->maxunits = midimapper_open(scp->mapper, &scp->mapper_cookie);
771 if (scp->maxunits == 0)
772 SEQ_DEBUG(2, kprintf("seq_open: no midi devices\n"));
774 for (i = 0; i < scp->maxunits; i++) {
775 scp->midis[scp->midi_number] =
776 midimapper_fetch_synth(scp->mapper, scp->mapper_cookie, i);
777 if (scp->midis[scp->midi_number]) {
778 if (SYNTH_OPEN(scp->midis[scp->midi_number], scp,
780 scp->midis[scp->midi_number] = NULL;
782 scp->midi_flags[scp->midi_number] =
783 SYNTH_QUERY(scp->midis[scp->midi_number]);
789 timer_setvals(scp, 60, 100);
794 * actually, if we're in rdonly mode, we should start the timer
797 * TODO: Handle recording now
800 scp->out_water = MIDIQ_SIZE(scp->out_q) / 2;
803 lockmgr(&scp->seq_lock, LK_RELEASE);
805 SEQ_DEBUG(2, kprintf("seq_open: opened, mode %s.\n",
806 scp->music ? "music" : "sequencer"));
808 kprintf("Sequencer %d %p opened maxunits %d midi_number %d:\n",
809 scp->unit, scp, scp->maxunits, scp->midi_number));
810 for (i = 0; i < scp->midi_number; i++)
811 SEQ_DEBUG(3, kprintf(" midi %d %p\n", i, scp->midis[i]));
820 seq_close(struct dev_close_args *ap)
822 cdev_t i_dev = ap->a_head.a_dev;
824 struct seq_softc *scp = i_dev->si_drv1;
830 SEQ_DEBUG(2, kprintf("seq_close: unit %d.\n", scp->unit));
832 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
841 for (i = 0; i < scp->midi_number; i++)
843 SYNTH_CLOSE(scp->midis[i]);
845 midimapper_close(scp->mapper, scp->mapper_cookie);
853 SEQ_DEBUG(3, kprintf("seq_close: closed ret = %d.\n", ret));
854 lockmgr(&scp->seq_lock, LK_RELEASE);
859 seq_read(struct dev_read_args *ap)
861 cdev_t i_dev = ap->a_head.a_dev;
862 struct uio *uio = ap->a_uio;
863 int ioflag = ap->a_ioflag;
865 struct seq_softc *scp = i_dev->si_drv1;
868 u_char buf[SEQ_RSIZE];
873 SEQ_DEBUG(7, kprintf("seq_read: unit %d, resid %zd.\n",
874 scp->unit, uio->uio_resid));
876 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
877 if ((scp->fflags & FREAD) == 0) {
878 SEQ_DEBUG(2, kprintf("seq_read: unit %d is not for reading.\n",
887 * if ((scp->flags & SEQ_F_READING) == 0)
890 * TODO, start recording if not alread
894 * I think the semantics are to return as soon
896 * Second thought, it doens't seem like midimoutain
897 * expects that at all.
898 * TODO: Look up in some sort of spec
901 while (uio->uio_resid > 0) {
902 while (MIDIQ_EMPTY(scp->in_q)) {
903 retval = EWOULDBLOCK;
905 * I wish I knew which one to care about
908 if (scp->fflags & O_NONBLOCK)
910 if (ioflag & O_NONBLOCK)
913 retval = cv_wait_sig(&scp->in_cv, &scp->seq_lock);
918 used = MIN(MIDIQ_LEN(scp->in_q), uio->uio_resid);
919 used = MIN(used, SEQ_RSIZE);
921 SEQ_DEBUG(8, kprintf("midiread: uiomove cc=%d\n", used));
922 MIDIQ_DEQ(scp->in_q, buf, used);
923 retval = uiomove(buf, used, uio);
930 lockmgr(&scp->seq_lock, LK_RELEASE);
931 SEQ_DEBUG(6, kprintf("seq_read: ret %d, resid %zd.\n",
932 retval, uio->uio_resid));
938 seq_write(struct dev_write_args *ap)
940 cdev_t i_dev = ap->a_head.a_dev;
941 struct uio *uio = ap->a_uio;
942 int ioflag = ap->a_ioflag;
943 u_char event[EV_SZ], newevent[EV_SZ], ev_code;
944 struct seq_softc *scp = i_dev->si_drv1;
948 SEQ_DEBUG(7, kprintf("seq_write: unit %d, resid %zd.\n",
949 scp->unit, uio->uio_resid));
954 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
956 if ((scp->fflags & FWRITE) == 0) {
957 SEQ_DEBUG(2, kprintf("seq_write: unit %d is not for writing.\n",
962 while (uio->uio_resid > 0) {
963 while (MIDIQ_AVAIL(scp->out_q) == 0) {
964 retval = EWOULDBLOCK;
965 if (scp->fflags & O_NONBLOCK)
967 if (ioflag & O_NONBLOCK)
969 SEQ_DEBUG(8, kprintf("seq_write cvwait\n"));
972 cv_broadcast(&scp->out_cv);
973 cv_broadcast(&scp->state_cv);
975 retval = cv_wait_sig(&scp->out_cv, &scp->seq_lock);
977 * We slept, maybe things have changed since last
986 if (scp != i_dev->si_drv1)
991 used = MIN(uio->uio_resid, 4);
993 SEQ_DEBUG(8, kprintf("seqout: resid %zd len %jd avail %jd\n",
994 uio->uio_resid, (intmax_t)MIDIQ_LEN(scp->out_q),
995 (intmax_t)MIDIQ_AVAIL(scp->out_q)));
1001 retval = uiomove(event, used, uio);
1006 SEQ_DEBUG(8, kprintf("seq_write: unit %d, event %s.\n",
1007 scp->unit, midi_cmdname(ev_code, cmdtab_seqevent)));
1009 /* Have a look at the event code. */
1010 if (ev_code == SEQ_FULLSIZE) {
1013 * TODO: restore code for SEQ_FULLSIZE
1017 * A long event, these are the patches/samples for a
1020 midiunit = *(u_short *)&event[2];
1021 lockmgr(&sd->seq_lock, LK_EXCLUSIVE);
1022 ret = lookup_mididev(scp, midiunit, LOOKUP_OPEN, &md);
1023 lockmgr(&sd->seq_lock, LK_RELEASE);
1027 SEQ_DEBUG(kprintf("seq_write: loading a patch to the unit %d.\n", midiunit));
1029 ret = md->synth.loadpatch(md, *(short *)&event[0], buf,
1034 * For now, just flush the darn buffer
1037 kprintf("seq_write: SEQ_FULLSIZE flusing buffer.\n"));
1038 while (uio->uio_resid > 0) {
1039 retval = uiomove(event, EV_SZ, uio);
1049 if (ev_code >= 128) {
1052 * Some sort of an extended event. The size is eight
1053 * bytes. scoop extra info.
1055 if (scp->music && ev_code == SEQ_EXTENDED) {
1056 SEQ_DEBUG(2, kprintf("seq_write: invalid level two event %x.\n", ev_code));
1059 if (uiomove((caddr_t)&event[4], 4, uio)) {
1061 kprintf("seq_write: user memory mangled?\n"));
1069 SEQ_DEBUG(2, kprintf("seq_write: four byte event in music mode.\n"));
1073 if (ev_code == SEQ_MIDIPUTC) {
1075 * TODO: event[2] is unit number to receive char.
1080 #ifdef not_ever_ever
1081 if (event[0] == EV_TIMING &&
1082 (event[1] == TMR_START || event[1] == TMR_STOP)) {
1084 * For now, try to make midimoutain work by
1085 * forcing these events to be processed
1088 seq_processevent(scp, event);
1090 MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1092 MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1095 if (seq_convertold(event, newevent) > 0)
1096 MIDIQ_ENQ(scp->out_q, newevent, EV_SZ);
1106 cv_broadcast(&scp->state_cv);
1107 cv_broadcast(&scp->out_cv);
1113 kprintf("seq_write done: leftover buffer length %zd retval %d\n",
1114 uio->uio_resid, retval));
1115 lockmgr(&scp->seq_lock, LK_RELEASE);
1120 seq_ioctl(struct dev_ioctl_args *ap)
1122 cdev_t i_dev = ap->a_head.a_dev;
1123 u_long cmd = ap->a_cmd;
1124 caddr_t arg = ap->a_data;
1125 int mode = ap->a_fflag;
1126 int midiunit, ret, tmp;
1127 struct seq_softc *scp = i_dev->si_drv1;
1128 struct synth_info *synthinfo;
1129 struct midi_info *midiinfo;
1130 u_char event[EV_SZ];
1131 u_char newevent[EV_SZ];
1136 * struct snd_size *sndsize;
1142 SEQ_DEBUG(6, kprintf("seq_ioctl: unit %d, cmd %s.\n",
1143 scp->unit, midi_cmdname(cmd, cmdtab_seqioctl)));
1148 case SNDCTL_SEQ_GETTIME:
1150 * ioctl needed by libtse
1152 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1153 *(int *)arg = timer_now(scp);
1154 lockmgr(&scp->seq_lock, LK_RELEASE);
1155 SEQ_DEBUG(6, kprintf("seq_ioctl: gettime %d.\n", *(int *)arg));
1158 case SNDCTL_TMR_METRONOME:
1160 case SNDCTL_TMR_SOURCE:
1166 case SNDCTL_TMR_TEMPO:
1167 event[1] = TMR_TEMPO;
1168 event[4] = *(int *)arg & 0xFF;
1169 event[5] = (*(int *)arg >> 8) & 0xFF;
1170 event[6] = (*(int *)arg >> 16) & 0xFF;
1171 event[7] = (*(int *)arg >> 24) & 0xFF;
1173 case SNDCTL_TMR_TIMEBASE:
1174 event[1] = TMR_TIMERBASE;
1175 event[4] = *(int *)arg & 0xFF;
1176 event[5] = (*(int *)arg >> 8) & 0xFF;
1177 event[6] = (*(int *)arg >> 16) & 0xFF;
1178 event[7] = (*(int *)arg >> 24) & 0xFF;
1180 case SNDCTL_TMR_START:
1181 event[1] = TMR_START;
1183 case SNDCTL_TMR_STOP:
1184 event[1] = TMR_STOP;
1186 case SNDCTL_TMR_CONTINUE:
1187 event[1] = TMR_CONTINUE;
1189 event[0] = EV_TIMING;
1190 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1193 lockmgr(&scp->seq_lock, LK_RELEASE);
1196 seq_processevent(scp, event);
1197 lockmgr(&scp->seq_lock, LK_RELEASE);
1199 case SNDCTL_TMR_SELECT:
1201 kprintf("seq_ioctl: SNDCTL_TMR_SELECT not supported\n"));
1204 case SNDCTL_SEQ_SYNC:
1205 if (mode == O_RDONLY) {
1209 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1210 ret = seq_sync(scp);
1211 lockmgr(&scp->seq_lock, LK_RELEASE);
1213 case SNDCTL_SEQ_PANIC:
1215 case SNDCTL_SEQ_RESET:
1217 * SNDCTL_SEQ_PANIC == SNDCTL_SEQ_RESET
1219 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1221 lockmgr(&scp->seq_lock, LK_RELEASE);
1224 case SNDCTL_SEQ_TESTMIDI:
1225 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1227 * TODO: SNDCTL_SEQ_TESTMIDI now means "can I write to the
1230 lockmgr(&scp->seq_lock, LK_RELEASE);
1233 case SNDCTL_SEQ_GETINCOUNT:
1234 if (mode == O_WRONLY)
1237 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1238 *(int *)arg = scp->in_q.rl;
1239 lockmgr(&scp->seq_lock, LK_RELEASE);
1240 SEQ_DEBUG(kprintf("seq_ioctl: incount %d.\n",
1245 case SNDCTL_SEQ_GETOUTCOUNT:
1246 if (mode == O_RDONLY)
1249 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1250 *(int *)arg = scp->out_q.fl;
1251 lockmgr(&scp->seq_lock, LK_RELEASE);
1252 SEQ_DEBUG(kprintf("seq_ioctl: outcount %d.\n",
1258 case SNDCTL_SEQ_CTRLRATE:
1259 if (*(int *)arg != 0) {
1263 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1264 *(int *)arg = scp->timerbase;
1265 lockmgr(&scp->seq_lock, LK_RELEASE);
1266 SEQ_DEBUG(3, kprintf("seq_ioctl: ctrlrate %d.\n", *(int *)arg));
1270 * TODO: ioctl SNDCTL_SEQ_RESETSAMPLES
1273 case SNDCTL_SEQ_RESETSAMPLES:
1274 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1275 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1276 lockmgr(&scp->seq_lock, LK_RELEASE);
1279 ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg,
1280 SND_DEV_MIDIN), cmd, arg, mode, td);
1283 case SNDCTL_SEQ_NRSYNTHS:
1284 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1285 *(int *)arg = scp->midi_number;
1286 lockmgr(&scp->seq_lock, LK_RELEASE);
1287 SEQ_DEBUG(3, kprintf("seq_ioctl: synths %d.\n", *(int *)arg));
1290 case SNDCTL_SEQ_NRMIDIS:
1291 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1296 * TODO: count the numbder of devices that can WRITERAW
1298 *(int *)arg = scp->midi_number;
1300 lockmgr(&scp->seq_lock, LK_RELEASE);
1301 SEQ_DEBUG(3, kprintf("seq_ioctl: midis %d.\n", *(int *)arg));
1305 * TODO: ioctl SNDCTL_SYNTH_MEMAVL
1308 case SNDCTL_SYNTH_MEMAVL:
1309 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1310 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1311 lockmgr(&scp->seq_lock, LK_RELEASE);
1314 ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg,
1315 SND_DEV_MIDIN), cmd, arg, mode, td);
1318 case SNDCTL_SEQ_OUTOFBAND:
1319 for (ret = 0; ret < EV_SZ; ret++)
1320 event[ret] = (u_char)arg[0];
1322 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1324 ret = seq_processevent(scp, event);
1326 if (seq_convertold(event, newevent) > 0)
1327 ret = seq_processevent(scp, newevent);
1331 lockmgr(&scp->seq_lock, LK_RELEASE);
1333 case SNDCTL_SYNTH_INFO:
1334 synthinfo = (struct synth_info *)arg;
1335 midiunit = synthinfo->device;
1336 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1337 if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1338 bzero(synthinfo, sizeof(*synthinfo));
1339 synthinfo->name[0] = 'f';
1340 synthinfo->name[1] = 'a';
1341 synthinfo->name[2] = 'k';
1342 synthinfo->name[3] = 'e';
1343 synthinfo->name[4] = 's';
1344 synthinfo->name[5] = 'y';
1345 synthinfo->name[6] = 'n';
1346 synthinfo->name[7] = 't';
1347 synthinfo->name[8] = 'h';
1348 synthinfo->device = midiunit;
1349 synthinfo->synth_type = SYNTH_TYPE_MIDI;
1350 synthinfo->capabilities = scp->midi_flags[midiunit];
1354 lockmgr(&scp->seq_lock, LK_RELEASE);
1356 case SNDCTL_MIDI_INFO:
1357 midiinfo = (struct midi_info *)arg;
1358 midiunit = midiinfo->device;
1359 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1360 if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1361 bzero(midiinfo, sizeof(*midiinfo));
1362 midiinfo->name[0] = 'f';
1363 midiinfo->name[1] = 'a';
1364 midiinfo->name[2] = 'k';
1365 midiinfo->name[3] = 'e';
1366 midiinfo->name[4] = 'm';
1367 midiinfo->name[5] = 'i';
1368 midiinfo->name[6] = 'd';
1369 midiinfo->name[7] = 'i';
1370 midiinfo->device = midiunit;
1371 midiinfo->capabilities = scp->midi_flags[midiunit];
1373 * TODO: What devtype?
1375 midiinfo->dev_type = 0x01;
1379 lockmgr(&scp->seq_lock, LK_RELEASE);
1381 case SNDCTL_SEQ_THRESHOLD:
1382 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1383 RANGE(*(int *)arg, 1, MIDIQ_SIZE(scp->out_q) - 1);
1384 scp->out_water = *(int *)arg;
1385 lockmgr(&scp->seq_lock, LK_RELEASE);
1386 SEQ_DEBUG(3, kprintf("seq_ioctl: water %d.\n", *(int *)arg));
1389 case SNDCTL_MIDI_PRETIME:
1393 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1394 scp->pre_event_timeout = (hz * tmp) / 10;
1395 *(int *)arg = scp->pre_event_timeout;
1396 lockmgr(&scp->seq_lock, LK_RELEASE);
1397 SEQ_DEBUG(3, kprintf("seq_ioctl: pretime %d.\n", *(int *)arg));
1400 case SNDCTL_FM_4OP_ENABLE:
1401 case SNDCTL_PMGR_IFACE:
1402 case SNDCTL_PMGR_ACCESS:
1404 * Patch manager and fm are ded, ded, ded.
1409 * TODO: Consider ioctl default case.
1411 * if ((scp->fflags & O_ACCMODE) == FREAD) {
1415 * Then pass on the ioctl to device 0
1418 kprintf("seq_ioctl: unsupported IOCTL %ld.\n", cmd));
1427 seq_kqfilter(struct dev_kqfilter_args *ap)
1429 cdev_t dev = ap->a_head.a_dev;
1430 struct knote *kn = ap->a_kn;
1431 struct seq_softc *scp;
1432 struct klist *klist;
1437 switch (kn->kn_filter) {
1439 kn->kn_fop = &seq_read_filterops;
1440 kn->kn_hook = (caddr_t)scp;
1441 klist = &scp->in_kq.ki_note;
1444 kn->kn_fop = &seq_write_filterops;
1445 kn->kn_hook = (caddr_t)scp;
1446 klist = &scp->out_kq.ki_note;
1449 ap->a_result = EOPNOTSUPP;
1453 knote_insert(klist, kn);
1459 seq_filter_detach(struct knote *kn)
1461 struct seq_softc *scp = (struct seq_softc *)kn->kn_hook;
1462 struct klist *in_klist = &scp->in_kq.ki_note;
1463 struct klist *out_klist = &scp->out_kq.ki_note;
1465 knote_remove(in_klist, kn);
1466 knote_remove(out_klist, kn);
1470 seq_filter_read(struct knote *kn, long hint)
1472 struct seq_softc *scp = (struct seq_softc *)kn->kn_hook;
1476 SEQ_DEBUG(3, kprintf("seq_filter_read: unit %d.\n", scp->unit));
1477 SEQ_DEBUG(1, kprintf("seq_filter_read: unit %d.\n", scp->unit));
1479 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1481 /* Look up the apropriate queue and select it. */
1483 /* TODO: Start recording. */
1485 /* Find out the boundary. */
1487 if (MIDIQ_LEN(scp->in_q) >= lim) {
1488 /* We can read now. */
1491 lockmgr(&scp->seq_lock, LK_RELEASE);
1497 seq_filter_write(struct knote *kn, long hint)
1499 struct seq_softc *scp = (struct seq_softc *)kn->kn_hook;
1503 SEQ_DEBUG(3, kprintf("seq_filter_write: unit %d.\n", scp->unit));
1504 SEQ_DEBUG(1, kprintf("seq_filter_write: unit %d.\n", scp->unit));
1506 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1508 /* Look up the apropriate queue and select it. */
1510 /* Start playing. */
1512 cv_broadcast(&scp->state_cv);
1513 cv_broadcast(&scp->out_cv);
1515 lim = scp->out_water;
1517 if (MIDIQ_AVAIL(scp->out_q) >= lim) {
1518 /* We can write now. */
1521 lockmgr(&scp->seq_lock, LK_RELEASE);
1528 sein_qtr(void *p, void /* mididev_info */ *md)
1530 struct seq_softc *scp;
1532 scp = (struct seq_softc *)p;
1534 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1536 /* Restart playing if we have the data to output. */
1537 if (scp->queueout_pending)
1538 seq_callback(scp, SEQ_CB_START | SEQ_CB_WR);
1539 /* Check the midi device if we are reading. */
1540 if ((scp->flags & SEQ_F_READING) != 0)
1541 seq_midiinput(scp, md);
1543 lockmgr(&scp->seq_lock, LK_RELEASE);
1549 * Was the old playevent. Use this to convert and old
1550 * style /dev/sequencer event to a /dev/music event
1553 seq_convertold(u_char *event, u_char *out)
1556 u_char dev, chn, note, vel;
1558 out[0] = out[1] = out[2] = out[3] = out[4] = out[5] = out[6] =
1570 * TODO: Debug statement
1589 out[0] = EV_CHN_VOICE;
1591 out[2] = MIDI_NOTEOFF;
1599 out[0] = EV_CHN_VOICE;
1601 out[2] = MIDI_NOTEON;
1609 * wait delay = (event[2] << 16) + (event[3] << 8) + event[4]
1613 out[0] = EV_CHN_COMMON;
1615 out[2] = MIDI_PGM_CHANGE;
1624 out[2] = MIDI_PGM_CHANGE;
1628 SEQ_DEBUG(4,kprintf("seq_playevent: synctimer\n"));
1634 kprintf("seq_playevent: put data 0x%02x, unit %d.\n",
1635 event[1], event[2]));
1637 * Pass through to the midi device.
1641 out[0] = SEQ_MIDIPUTC;
1649 * This isn't handled here yet because I don't know if I can
1650 * just use four bytes events. There might be consequences
1651 * in the _read routing
1653 if (seq_copytoinput(scp, event, 4) == EAGAIN) {
1669 case SEQ_AFTERTOUCH:
1671 * SYNTH_AFTERTOUCH(md, event[3], event[4])
1675 * SYNTH_PANNING(md, event[3], (char)event[4])
1677 case SEQ_CONTROLLER:
1679 * SYNTH_CONTROLLER(md, event[3], event[4], *(short *)&event[5])
1683 * SYNTH_VOLUMEMETHOD(md, event[3])
1687 kprintf("seq_convertold: SEQ_EXTENDED type %d"
1688 "not handled\n", event[1]));
1694 out[1] = TMR_WAIT_REL;
1699 SEQ_DEBUG(5, kprintf("SEQ_WAIT %d",
1700 event[2] + (event[3] << 8) + (event[4] << 24)));
1710 kprintf("seq_convertold: event type %d not handled %d %d %d\n",
1711 event[0], event[1], event[2], event[3]));
1718 * Writting to the sequencer buffer never blocks and drops
1719 * input which cannot be queued
1722 seq_copytoinput(struct seq_softc *scp, u_char *event, int len)
1725 KKASSERT(lockowned(&scp->seq_lock));
1727 if (MIDIQ_AVAIL(scp->in_q) < len) {
1729 * ENOROOM? EINPUTDROPPED? ETOUGHLUCK?
1731 SEQ_DEBUG(2, kprintf("seq_copytoinput: queue full\n"));
1733 MIDIQ_ENQ(scp->in_q, event, len);
1734 KNOTE(&scp->in_kq.ki_note, 0);
1735 cv_broadcast(&scp->in_cv);
1741 seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event)
1744 u_char cmd, chn, note, parm;
1752 KKASSERT(lockowned(&scp->seq_lock));
1754 SEQ_DEBUG(5, kprintf("seq_chnvoice: unit %d, dev %d, cmd %s,"
1755 " chn %d, note %d, parm %d.\n", scp->unit, event[1],
1756 midi_cmdname(cmd, cmdtab_seqcv), chn, note, parm));
1758 voice = SYNTH_ALLOC(md, chn, note);
1760 lockmgr(&scp->seq_lock, LK_RELEASE);
1764 if (note < 128 || note == 255) {
1766 if (scp->music && chn == 9) {
1768 * This channel is a percussion. The note
1769 * number is the patch number.
1772 lockmgr(&scp->seq_lock, LK_RELEASE);
1773 if (SYNTH_SETINSTR(md, voice, 128 + note)
1775 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1778 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1780 note = 60; /* Middle C. */
1785 lockmgr(&scp->seq_lock, LK_RELEASE);
1786 if (SYNTH_SETUPVOICE(md, voice, chn)
1788 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1791 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1794 SYNTH_STARTNOTE(md, voice, note, parm);
1798 SYNTH_KILLNOTE(md, voice, note, parm);
1800 case MIDI_KEY_PRESSURE:
1801 SYNTH_AFTERTOUCH(md, voice, parm);
1805 SEQ_DEBUG(2, kprintf("seq_chnvoice event type %d not handled\n",
1810 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1815 seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event)
1819 u_char cmd, chn, p1;
1825 w14 = *(u_short *)&event[6];
1827 SEQ_DEBUG(5, kprintf("seq_chncommon: unit %d, dev %d, cmd %s, chn %d,"
1828 " p1 %d, w14 %d.\n", scp->unit, event[1],
1829 midi_cmdname(cmd, cmdtab_seqccmn), chn, p1, w14));
1830 lockmgr(&scp->seq_lock, LK_RELEASE);
1832 case MIDI_PGM_CHANGE:
1833 SEQ_DEBUG(4, kprintf("seq_chncommon pgmchn chn %d pg %d\n",
1835 SYNTH_SETINSTR(md, chn, p1);
1837 case MIDI_CTL_CHANGE:
1838 SEQ_DEBUG(4, kprintf("seq_chncommon ctlch chn %d pg %d %d\n",
1840 SYNTH_CONTROLLER(md, chn, p1, w14);
1842 case MIDI_PITCH_BEND:
1845 * TODO: MIDI_PITCH_BEND
1848 lockmgr(&md->synth.vc_lock, LK_EXCLUSIVE);
1849 md->synth.chn_info[chn].bender_value = w14;
1850 if (md->midiunit >= 0) {
1852 * Handle all of the notes playing on this
1855 key = ((int)chn << 8);
1856 for (i = 0; i < md->synth.alloc.max_voice; i++)
1857 if ((md->synth.alloc.map[i] & 0xff00) == key) {
1858 lockmgr(&md->synth.vc_lock, LK_RELEASE);
1859 lockmgr(&scp->seq_lock, LK_RELEASE);
1860 if (md->synth.bender(md, i, w14) == EAGAIN) {
1861 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1864 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1867 lockmgr(&md->synth.vc_lock, LK_RELEASE);
1868 lockmgr(&scp->seq_lock, LK_RELEASE);
1869 if (md->synth.bender(md, chn, w14) == EAGAIN) {
1870 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1873 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1877 SYNTH_BENDER(md, chn, w14);
1882 kprintf("seq_chncommon event type %d not handled.\n",
1887 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
1892 seq_timing(struct seq_softc *scp, u_char *event)
1898 param = event[4] + (event[5] << 8) +
1899 (event[6] << 16) + (event[7] << 24);
1901 SEQ_DEBUG(5, kprintf("seq_timing: unit %d, cmd %d, param %d.\n",
1902 scp->unit, event[1], param));
1905 timer_wait(scp, param, 0);
1908 timer_wait(scp, param, 1);
1912 cv_broadcast(&scp->reset_cv);
1917 * The following cv_broadcast isn't needed since we only
1918 * wait for 0->1 transitions. It probably won't hurt
1920 cv_broadcast(&scp->reset_cv);
1923 timer_continue(scp);
1924 cv_broadcast(&scp->reset_cv);
1931 SEQ_DEBUG(4, kprintf("Timer set tempo %d\n", param));
1932 timer_setvals(scp, param, scp->timerbase);
1939 SEQ_DEBUG(4, kprintf("Timer set timerbase %d\n", param));
1940 timer_setvals(scp, scp->tempo, param);
1944 * TODO: Consider making 4-byte events for /dev/sequencer
1945 * PRO: Maybe needed by legacy apps
1946 * CON: soundcard.h has been warning for a while many years
1947 * to expect 8 byte events.
1951 seq_copytoinput(scp, event, 8);
1953 param = (param << 8 | SEQ_ECHO);
1954 seq_copytoinput(scp, (u_char *)¶m, 4);
1957 seq_copytoinput(scp, event, 8);
1961 SEQ_DEBUG(2, kprintf("seq_timing event type %d not handled.\n",
1970 seq_local(struct seq_softc *scp, u_char *event)
1975 KKASSERT(lockowned(&scp->seq_lock));
1977 SEQ_DEBUG(5, kprintf("seq_local: unit %d, cmd %d\n", scp->unit,
1981 SEQ_DEBUG(1, kprintf("seq_local event type %d not handled\n",
1990 seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event)
1994 KKASSERT(lockowned(&scp->seq_lock));
1995 SEQ_DEBUG(5, kprintf("seq_sysex: unit %d device %d\n", scp->unit,
1998 for (i = 0; i < 6 && event[i + 2] != 0xff; i++)
2001 lockmgr(&scp->seq_lock, LK_RELEASE);
2002 if (SYNTH_SENDSYSEX(md, &event[2], l) == EAGAIN) {
2003 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2006 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2012 * Reset no longer closes the raw devices nor seq_sync's
2013 * Callers are IOCTL and seq_close
2016 seq_reset(struct seq_softc *scp)
2021 KKASSERT(lockowned(&scp->seq_lock));
2023 SEQ_DEBUG(5, kprintf("seq_reset: unit %d.\n", scp->unit));
2026 * Stop reading and writing.
2029 /* scp->recording = 0; */
2031 cv_broadcast(&scp->state_cv);
2032 cv_broadcast(&scp->out_cv);
2033 cv_broadcast(&scp->reset_cv);
2036 * For now, don't reset the timers.
2038 MIDIQ_CLEAR(scp->in_q);
2039 MIDIQ_CLEAR(scp->out_q);
2041 for (i = 0; i < scp->midi_number; i++) {
2043 lockmgr(&scp->seq_lock, LK_RELEASE);
2045 for (chn = 0; chn < 16; chn++) {
2046 SYNTH_CONTROLLER(m, chn, 123, 0);
2047 SYNTH_CONTROLLER(m, chn, 121, 0);
2048 SYNTH_BENDER(m, chn, 1 << 13);
2050 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2056 * *really* flush the output queue
2057 * flush the event queue, then flush the synthsisers.
2058 * Callers are IOCTL and close
2061 #define SEQ_SYNC_TIMEOUT 8
2063 seq_sync(struct seq_softc *scp)
2065 int i, rl, sync[16], done;
2067 KKASSERT(lockowned(&scp->seq_lock));
2069 SEQ_DEBUG(4, kprintf("seq_sync: unit %d.\n", scp->unit));
2072 * Wait until output queue is empty. Check every so often to see if
2073 * the queue is moving along. If it isn't just abort.
2075 while (!MIDIQ_EMPTY(scp->out_q)) {
2077 if (!scp->playing) {
2079 cv_broadcast(&scp->state_cv);
2080 cv_broadcast(&scp->out_cv);
2082 rl = MIDIQ_LEN(scp->out_q);
2084 i = cv_timedwait_sig(&scp->out_cv,
2085 &scp->seq_lock, SEQ_SYNC_TIMEOUT * hz);
2087 if (i == EINTR || i == ERESTART) {
2090 * XXX: I don't know why we stop playing
2093 cv_broadcast(&scp->out_cv);
2097 if (i == EWOULDBLOCK && rl == MIDIQ_LEN(scp->out_q) &&
2098 scp->waiting == 0) {
2100 * A queue seems to be stuck up. Give up and clear
2103 MIDIQ_CLEAR(scp->out_q);
2105 cv_broadcast(&scp->state_cv);
2106 cv_broadcast(&scp->out_cv);
2107 cv_broadcast(&scp->reset_cv);
2110 * TODO: Consider if the raw devices need to be flushed
2113 SEQ_DEBUG(1, kprintf("seq_sync queue stuck, aborting\n"));
2121 * Since syncing a midi device might block, unlock scp->seq_lock.
2124 lockmgr(&scp->seq_lock, LK_RELEASE);
2125 for (i = 0; i < scp->midi_number; i++)
2130 for (i = 0; i < scp->midi_number; i++)
2132 if (SYNTH_INSYNC(scp->midis[i]) == 0)
2142 lockmgr(&scp->seq_lock, LK_EXCLUSIVE);
2147 midi_cmdname(int cmd, midi_cmdtab *tab)
2149 while (tab->name != NULL) {
2150 if (cmd == tab->cmd)