39#include <sys/ioccom.h>
43#include <sys/sockio.h>
46#include <sys/sysctl.h>
48#include <sys/kernel.h>
50#include <sys/module.h>
54#include <sys/syslog.h>
56#include <sys/malloc.h>
58#include <machine/resource.h>
59#include <machine/bus.h>
60#include <machine/clock.h>
61#include <sys/soundcard.h>
66#include <sys/condvar.h>
67#include <sys/kthread.h>
68#include <sys/unistd.h>
69#include <sys/selinfo.h>
71#ifdef HAVE_KERNEL_OPTION_HEADERS
81#define TMR_TIMERBASE 13
85#define SND_DEV_MUSIC 8
92#define LOOKUP_EXIST (0)
93#define LOOKUP_OPEN (1)
94#define LOOKUP_CLOSE (2)
96#define PCMMKMINOR(u, d, c) \
97 ((((c) & 0xff) << 16) | (((u) & 0x0f) << 4) | ((d) & 0x0f))
98#define MIDIMKMINOR(u, d, c) PCMMKMINOR(u, d, c)
99#define MIDIUNIT(y) ((dev2unit(y) >> 4) & 0x0f)
100#define MIDIDEV(y) (dev2unit(y) & 0x0f)
111 .d_version = D_VERSION,
118 .d_name =
"sequencer",
125 struct cv empty_cv, reset_cv, in_cv, out_cv, state_cv,
th_cv;
135 snd_sync_parm sync_parm;
136 struct thread *sync_thread;
137 struct selinfo in_sel, out_sel;
139 struct cdev *seqdev, *musicdev;
146 struct timeval timerstop, timersub;
147 int timerbase, tempo;
153 int pre_event_timeout;
162SYSCTL_NODE(_hw_midi, OID_AUTO, seq, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
170 {SEQ_NOTEOFF,
"SEQ_NOTEOFF"},
171 {SEQ_NOTEON,
"SEQ_NOTEON"},
172 {SEQ_WAIT,
"SEQ_WAIT"},
173 {SEQ_PGMCHANGE,
"SEQ_PGMCHANGE"},
174 {SEQ_SYNCTIMER,
"SEQ_SYNCTIMER"},
175 {SEQ_MIDIPUTC,
"SEQ_MIDIPUTC"},
176 {SEQ_DRUMON,
"SEQ_DRUMON"},
177 {SEQ_DRUMOFF,
"SEQ_DRUMOFF"},
178 {SEQ_ECHO,
"SEQ_ECHO"},
179 {SEQ_AFTERTOUCH,
"SEQ_AFTERTOUCH"},
180 {SEQ_CONTROLLER,
"SEQ_CONTROLLER"},
181 {SEQ_BALANCE,
"SEQ_BALANCE"},
182 {SEQ_VOLMODE,
"SEQ_VOLMODE"},
183 {SEQ_FULLSIZE,
"SEQ_FULLSIZE"},
184 {SEQ_PRIVATE,
"SEQ_PRIVATE"},
185 {SEQ_EXTENDED,
"SEQ_EXTENDED"},
186 {EV_SEQ_LOCAL,
"EV_SEQ_LOCAL"},
187 {EV_TIMING,
"EV_TIMING"},
188 {EV_CHN_COMMON,
"EV_CHN_COMMON"},
189 {EV_CHN_VOICE,
"EV_CHN_VOICE"},
190 {EV_SYSEX,
"EV_SYSEX"},
195 {SNDCTL_SEQ_RESET,
"SNDCTL_SEQ_RESET"},
196 {SNDCTL_SEQ_SYNC,
"SNDCTL_SEQ_SYNC"},
197 {SNDCTL_SYNTH_INFO,
"SNDCTL_SYNTH_INFO"},
198 {SNDCTL_SEQ_CTRLRATE,
"SNDCTL_SEQ_CTRLRATE"},
199 {SNDCTL_SEQ_GETOUTCOUNT,
"SNDCTL_SEQ_GETOUTCOUNT"},
200 {SNDCTL_SEQ_GETINCOUNT,
"SNDCTL_SEQ_GETINCOUNT"},
201 {SNDCTL_SEQ_PERCMODE,
"SNDCTL_SEQ_PERCMODE"},
202 {SNDCTL_FM_LOAD_INSTR,
"SNDCTL_FM_LOAD_INSTR"},
203 {SNDCTL_SEQ_TESTMIDI,
"SNDCTL_SEQ_TESTMIDI"},
204 {SNDCTL_SEQ_RESETSAMPLES,
"SNDCTL_SEQ_RESETSAMPLES"},
205 {SNDCTL_SEQ_NRSYNTHS,
"SNDCTL_SEQ_NRSYNTHS"},
206 {SNDCTL_SEQ_NRMIDIS,
"SNDCTL_SEQ_NRMIDIS"},
207 {SNDCTL_SEQ_GETTIME,
"SNDCTL_SEQ_GETTIME"},
208 {SNDCTL_MIDI_INFO,
"SNDCTL_MIDI_INFO"},
209 {SNDCTL_SEQ_THRESHOLD,
"SNDCTL_SEQ_THRESHOLD"},
210 {SNDCTL_SYNTH_MEMAVL,
"SNDCTL_SYNTH_MEMAVL"},
211 {SNDCTL_FM_4OP_ENABLE,
"SNDCTL_FM_4OP_ENABLE"},
212 {SNDCTL_PMGR_ACCESS,
"SNDCTL_PMGR_ACCESS"},
213 {SNDCTL_SEQ_PANIC,
"SNDCTL_SEQ_PANIC"},
214 {SNDCTL_SEQ_OUTOFBAND,
"SNDCTL_SEQ_OUTOFBAND"},
215 {SNDCTL_TMR_TIMEBASE,
"SNDCTL_TMR_TIMEBASE"},
216 {SNDCTL_TMR_START,
"SNDCTL_TMR_START"},
217 {SNDCTL_TMR_STOP,
"SNDCTL_TMR_STOP"},
218 {SNDCTL_TMR_CONTINUE,
"SNDCTL_TMR_CONTINUE"},
219 {SNDCTL_TMR_TEMPO,
"SNDCTL_TMR_TEMPO"},
220 {SNDCTL_TMR_SOURCE,
"SNDCTL_TMR_SOURCE"},
221 {SNDCTL_TMR_METRONOME,
"SNDCTL_TMR_METRONOME"},
222 {SNDCTL_TMR_SELECT,
"SNDCTL_TMR_SELECT"},
223 {SNDCTL_MIDI_PRETIME,
"SNDCTL_MIDI_PRETIME"},
224 {AIONWRITE,
"AIONWRITE"},
225 {AIOGSIZE,
"AIOGSIZE"},
226 {AIOSSIZE,
"AIOSSIZE"},
227 {AIOGFMT,
"AIOGFMT"},
228 {AIOSFMT,
"AIOSFMT"},
229 {AIOGMIX,
"AIOGMIX"},
230 {AIOSMIX,
"AIOSMIX"},
231 {AIOSTOP,
"AIOSTOP"},
232 {AIOSYNC,
"AIOSYNC"},
233 {AIOGCAP,
"AIOGCAP"},
238 {TMR_WAIT_REL,
"TMR_WAIT_REL"},
239 {TMR_WAIT_ABS,
"TMR_WAIT_ABS"},
240 {TMR_STOP,
"TMR_STOP"},
241 {TMR_START,
"TMR_START"},
242 {TMR_CONTINUE,
"TMR_CONTINUE"},
243 {TMR_TEMPO,
"TMR_TEMPO"},
244 {TMR_ECHO,
"TMR_ECHO"},
245 {TMR_CLOCK,
"TMR_CLOCK"},
246 {TMR_SPP,
"TMR_SPP"},
247 {TMR_TIMESIG,
"TMR_TIMESIG"},
252 {MIDI_NOTEOFF,
"MIDI_NOTEOFF"},
253 {MIDI_NOTEON,
"MIDI_NOTEON"},
254 {MIDI_KEY_PRESSURE,
"MIDI_KEY_PRESSURE"},
259 {MIDI_CTL_CHANGE,
"MIDI_CTL_CHANGE"},
260 {MIDI_PGM_CHANGE,
"MIDI_PGM_CHANGE"},
261 {MIDI_CHN_PRESSURE,
"MIDI_CHN_PRESSURE"},
262 {MIDI_PITCH_BEND,
"MIDI_PITCH_BEND"},
263 {MIDI_SYSTEM_PREFIX,
"MIDI_SYSTEM_PREFIX"},
267#ifndef KOBJMETHOD_END
268#define KOBJMETHOD_END { NULL, NULL }
305static u_long
nseq = 0;
317 getmicrotime(&t->timersub);
325 if (t->timerrun == 1)
329 timevalsub(&now, &t->timerstop);
330 timevaladd(&t->timersub, &now);
337 getmicrotime(&t->timerstop);
344 t->timerbase = timerbase;
350 struct timeval now, when;
352 unsigned long long i;
354 while (t->timerrun == 0) {
355 SEQ_DEBUG(2, printf(
"Timer wait when timer isn't running\n"));
362 cv_wait(&t->reset_cv, &t->seq_lock);
367 i = ticks * 60ull * 1000000ull / (t->tempo * t->timerbase);
369 when.tv_sec = i / 1000000;
370 when.tv_usec = i % 1000000;
373 printf(
"timer_wait tempo %d timerbase %d ticks %d abs %d u_sec %llu\n",
374 t->tempo, t->timerbase, ticks, wait_abs, i);
379 timevalsub(&now, &t->timersub);
380 timevalsub(&when, &now);
382 if (when.tv_sec < 0 || when.tv_usec < 0) {
384 printf(
"seq_timer error negative time %lds.%06lds\n",
385 (
long)when.tv_sec, (
long)when.tv_usec));
388 i = when.tv_sec * 1000000ull;
393 printf(
"seq_timer usec %llu ticks %llu\n",
394 when.tv_sec * 1000000ull + when.tv_usec, i);
397 ret = cv_timedwait(&t->reset_cv, &t->seq_lock, i + 1);
400 if (ret != EWOULDBLOCK)
401 SEQ_DEBUG(3, printf(
"seq_timer didn't timeout\n"));
409 unsigned long long i;
412 if (t->timerrun == 0)
417 timevalsub(&now, &t->timersub);
419 i = now.tv_sec * 1000000ull;
439 mtx_lock(&scp->seq_lock);
440 SEQ_DEBUG(2, printf(
"seq_eventthread started\n"));
441 while (scp->done == 0) {
443 while (scp->playing == 0) {
444 cv_wait(&scp->state_cv, &scp->seq_lock);
450 cv_broadcast(&scp->empty_cv);
451 cv_wait(&scp->out_cv, &scp->seq_lock);
452 if (scp->playing == 0)
461 cv_broadcast(&scp->out_cv);
462 selwakeup(&scp->out_sel);
468 cv_broadcast(&scp->
th_cv);
469 mtx_unlock(&scp->seq_lock);
470 SEQ_DEBUG(2, printf(
"seq_eventthread finished\n"));
486 if (event[0] == EV_SEQ_LOCAL)
488 else if (event[0] == EV_TIMING)
490 else if (event[0] != EV_CHN_VOICE &&
491 event[0] != EV_CHN_COMMON &&
492 event[0] != EV_SYSEX &&
493 event[0] != SEQ_MIDIPUTC) {
495 SEQ_DEBUG(2, printf(
"seq_processevent not known %d\n",
499 SEQ_DEBUG(2, printf(
"seq_processevent midi unit not found %d\n",
513 mtx_unlock(&scp->seq_lock);
514 ret = SYNTH_WRITERAW(
m, &event[2], 1);
515 mtx_lock(&scp->seq_lock);
530 scp = malloc(
sizeof(*scp), M_DEVBUF, M_NOWAIT | M_ZERO);
532 SEQ_DEBUG(1, printf(
"seq_addunit: softc allocation failed.\n"));
535 kobj_init((kobj_t)scp, &sequencer_class);
537 buf = malloc(
sizeof(*
buf) *
EV_SZ * 1024, M_TEMP, M_NOWAIT | M_ZERO);
541 buf = malloc(
sizeof(*
buf) *
EV_SZ * 1024, M_TEMP, M_NOWAIT | M_ZERO);
547 scp->midis = malloc(
sizeof(kobj_t) * 32, M_TEMP, M_NOWAIT | M_ZERO);
548 scp->midi_flags = malloc(
sizeof(*scp->midi_flags) * 32, M_TEMP,
551 if (scp->midis == NULL || scp->midi_flags == NULL)
556 mtx_init(&scp->seq_lock,
"seqflq", NULL, 0);
557 cv_init(&scp->state_cv,
"seqstate");
558 cv_init(&scp->empty_cv,
"seqempty");
559 cv_init(&scp->reset_cv,
"seqtimer");
560 cv_init(&scp->out_cv,
"seqqout");
561 cv_init(&scp->in_cv,
"seqqin");
562 cv_init(&scp->
th_cv,
"seqstart");
569 if (scp->mapper == NULL)
574 GID_WHEEL, 0666,
"sequencer%d", scp->unit);
578 GID_WHEEL, 0666,
"music%d", scp->unit);
580 if (scp->seqdev == NULL || scp->musicdev == NULL)
589 "sequencer %02d", scp->unit);
594 scp->seqdev->si_drv1 = scp->musicdev->si_drv1 = scp;
596 SEQ_DEBUG(2, printf(
"sequencer %d created scp %p\n", scp->unit, scp));
608 if (scp->seqdev != NULL)
609 destroy_dev(scp->seqdev);
610 if (scp->musicdev != NULL)
611 destroy_dev(scp->musicdev);
615 if (scp->midis != NULL)
616 free(scp->midis, M_TEMP);
617 if (scp->midi_flags != NULL)
618 free(scp->midi_flags, M_TEMP);
620 free(scp->out_q.b, M_TEMP);
622 free(scp->in_q.b, M_TEMP);
636 SEQ_DEBUG(1, printf(
"seq_delunit: 1 \n"));
637 mtx_lock(&scp->seq_lock);
641 cv_broadcast(&scp->out_cv);
642 cv_broadcast(&scp->state_cv);
643 cv_broadcast(&scp->reset_cv);
644 SEQ_DEBUG(1, printf(
"seq_delunit: 2 \n"));
645 cv_wait(&scp->
th_cv, &scp->seq_lock);
646 SEQ_DEBUG(1, printf(
"seq_delunit: 3.0 \n"));
647 mtx_unlock(&scp->seq_lock);
648 SEQ_DEBUG(1, printf(
"seq_delunit: 3.1 \n"));
650 cv_destroy(&scp->state_cv);
651 SEQ_DEBUG(1, printf(
"seq_delunit: 4 \n"));
652 cv_destroy(&scp->empty_cv);
653 SEQ_DEBUG(1, printf(
"seq_delunit: 5 \n"));
654 cv_destroy(&scp->reset_cv);
655 SEQ_DEBUG(1, printf(
"seq_delunit: 6 \n"));
656 cv_destroy(&scp->out_cv);
657 SEQ_DEBUG(1, printf(
"seq_delunit: 7 \n"));
658 cv_destroy(&scp->in_cv);
659 SEQ_DEBUG(1, printf(
"seq_delunit: 8 \n"));
660 cv_destroy(&scp->
th_cv);
662 SEQ_DEBUG(1, printf(
"seq_delunit: 10 \n"));
664 destroy_dev(scp->seqdev);
665 SEQ_DEBUG(1, printf(
"seq_delunit: 11 \n"));
667 destroy_dev(scp->musicdev);
668 SEQ_DEBUG(1, printf(
"seq_delunit: 12 \n"));
669 scp->seqdev = scp->musicdev = NULL;
670 if (scp->midis != NULL)
671 free(scp->midis, M_TEMP);
672 SEQ_DEBUG(1, printf(
"seq_delunit: 13 \n"));
673 if (scp->midi_flags != NULL)
674 free(scp->midi_flags, M_TEMP);
675 SEQ_DEBUG(1, printf(
"seq_delunit: 14 \n"));
676 free(scp->out_q.b, M_TEMP);
677 SEQ_DEBUG(1, printf(
"seq_delunit: 15 \n"));
678 free(scp->in_q.b, M_TEMP);
680 SEQ_DEBUG(1, printf(
"seq_delunit: 16 \n"));
682 mtx_destroy(&scp->seq_lock);
683 SEQ_DEBUG(1, printf(
"seq_delunit: 17 \n"));
687 for (i = unit; i < (
nseq - 1); i++)
733 if (unit >= scp->midi_number || unit < 0)
736 *md = scp->midis[unit];
742mseq_open(
struct cdev *i_dev,
int flags,
int mode,
struct thread *td)
750 SEQ_DEBUG(3, printf(
"seq_open: scp %p unit %d, flags 0x%x.\n",
751 scp, scp->unit, flags));
757 mtx_lock(&scp->seq_lock);
759 mtx_unlock(&scp->seq_lock);
760 SEQ_DEBUG(2, printf(
"seq_open: unit %d is busy.\n", scp->unit));
773 scp->midi_number = 0;
776 if (scp->maxunits == 0)
777 SEQ_DEBUG(2, printf(
"seq_open: no midi devices\n"));
779 for (i = 0; i < scp->maxunits; i++) {
780 scp->midis[scp->midi_number] =
782 if (scp->midis[scp->midi_number]) {
783 if (SYNTH_OPEN(scp->midis[scp->midi_number], scp,
785 scp->midis[scp->midi_number] = NULL;
787 scp->midi_flags[scp->midi_number] =
788 SYNTH_QUERY(scp->midis[scp->midi_number]);
808 mtx_unlock(&scp->seq_lock);
810 SEQ_DEBUG(2, printf(
"seq_open: opened, mode %s.\n",
811 scp->music ?
"music" :
"sequencer"));
813 printf(
"Sequencer %d %p opened maxunits %d midi_number %d:\n",
814 scp->unit, scp, scp->maxunits, scp->midi_number));
815 for (i = 0; i < scp->midi_number; i++)
816 SEQ_DEBUG(3, printf(
" midi %d %p\n", i, scp->midis[i]));
825mseq_close(
struct cdev *i_dev,
int flags,
int mode,
struct thread *td)
834 SEQ_DEBUG(2, printf(
"seq_close: unit %d.\n", scp->unit));
836 mtx_lock(&scp->seq_lock);
845 for (i = 0; i < scp->midi_number; i++)
847 SYNTH_CLOSE(scp->midis[i]);
857 SEQ_DEBUG(3, printf(
"seq_close: closed ret = %d.\n", ret));
858 mtx_unlock(&scp->seq_lock);
863mseq_read(
struct cdev *i_dev,
struct uio *uio,
int ioflag)
874 SEQ_DEBUG(7, printf(
"mseq_read: unit %d, resid %zd.\n",
875 scp->unit, uio->uio_resid));
877 mtx_lock(&scp->seq_lock);
878 if ((scp->fflags & FREAD) == 0) {
879 SEQ_DEBUG(2, printf(
"mseq_read: unit %d is not for reading.\n",
902 while (uio->uio_resid > 0) {
904 retval = EWOULDBLOCK;
909 if (scp->fflags & O_NONBLOCK)
911 if (ioflag & O_NONBLOCK)
914 retval = cv_wait_sig(&scp->in_cv, &scp->seq_lock);
919 used = MIN(
MIDIQ_LEN(scp->in_q), uio->uio_resid);
922 SEQ_DEBUG(8, printf(
"midiread: uiomove cc=%d\n", used));
924 mtx_unlock(&scp->seq_lock);
925 retval = uiomove(
buf, used, uio);
926 mtx_lock(&scp->seq_lock);
933 mtx_unlock(&scp->seq_lock);
934 SEQ_DEBUG(6, printf(
"mseq_read: ret %d, resid %zd.\n",
935 retval, uio->uio_resid));
941mseq_write(
struct cdev *i_dev,
struct uio *uio,
int ioflag)
943 u_char
event[
EV_SZ], newevent[
EV_SZ], ev_code;
948 SEQ_DEBUG(7, printf(
"seq_write: unit %d, resid %zd.\n",
949 scp->unit, uio->uio_resid));
954 mtx_lock(&scp->seq_lock);
956 if ((scp->fflags & FWRITE) == 0) {
957 SEQ_DEBUG(2, printf(
"seq_write: unit %d is not for writing.\n",
962 while (uio->uio_resid > 0) {
964 retval = EWOULDBLOCK;
965 if (scp->fflags & O_NONBLOCK)
967 if (ioflag & O_NONBLOCK)
969 SEQ_DEBUG(8, printf(
"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);
986 if (scp != i_dev->si_drv1)
991 used = MIN(uio->uio_resid, 4);
993 SEQ_DEBUG(8, printf(
"seqout: resid %zd len %jd avail %jd\n",
994 uio->uio_resid, (intmax_t)
MIDIQ_LEN(scp->out_q),
1001 mtx_unlock(&scp->seq_lock);
1002 retval = uiomove(event, used, uio);
1003 mtx_lock(&scp->seq_lock);
1008 SEQ_DEBUG(8, printf(
"seq_write: unit %d, event %s.\n",
1012 if (ev_code == SEQ_FULLSIZE) {
1021 midiunit = *(u_short *)&event[2];
1022 mtx_lock(&sd->seq_lock);
1023 ret = lookup_mididev(scp, midiunit,
LOOKUP_OPEN, &md);
1024 mtx_unlock(&sd->seq_lock);
1028 SEQ_DEBUG(printf(
"seq_write: loading a patch to the unit %d.\n", midiunit));
1030 ret = md->synth.loadpatch(md, *(
short *)&event[0],
buf,
1038 printf(
"seq_write: SEQ_FULLSIZE flusing buffer.\n"));
1039 while (uio->uio_resid > 0) {
1040 mtx_unlock(&scp->seq_lock);
1041 retval = uiomove(event, MIN(
EV_SZ, uio->uio_resid), uio);
1042 mtx_lock(&scp->seq_lock);
1051 if (ev_code >= 128) {
1058 if (scp->music && ev_code == SEQ_EXTENDED) {
1059 SEQ_DEBUG(2, printf(
"seq_write: invalid level two event %x.\n", ev_code));
1062 mtx_unlock(&scp->seq_lock);
1063 if (uio->uio_resid < 4)
1066 error = uiomove((caddr_t)&event[4], 4, uio);
1067 mtx_lock(&scp->seq_lock);
1070 printf(
"seq_write: user memory mangled?\n"));
1078 SEQ_DEBUG(2, printf(
"seq_write: four byte event in music mode.\n"));
1082 if (ev_code == SEQ_MIDIPUTC) {
1090 if (event[0] == EV_TIMING &&
1091 (event[1] == TMR_START || event[1] == TMR_STOP)) {
1114 cv_broadcast(&scp->state_cv);
1115 cv_broadcast(&scp->out_cv);
1121 printf(
"seq_write done: leftover buffer length %zd retval %d\n",
1122 uio->uio_resid, retval));
1123 mtx_unlock(&scp->seq_lock);
1128mseq_ioctl(
struct cdev *i_dev, u_long cmd, caddr_t arg,
int mode,
1131 int midiunit, ret, tmp;
1133 struct synth_info *synthinfo;
1134 struct midi_info *midiinfo;
1135 u_char
event[
EV_SZ];
1136 u_char newevent[
EV_SZ];
1147 SEQ_DEBUG(6, printf(
"seq_ioctl: unit %d, cmd %s.\n",
1153 case SNDCTL_SEQ_GETTIME:
1157 mtx_lock(&scp->seq_lock);
1159 mtx_unlock(&scp->seq_lock);
1160 SEQ_DEBUG(6, printf(
"seq_ioctl: gettime %d.\n", *(
int *)arg));
1163 case SNDCTL_TMR_METRONOME:
1165 case SNDCTL_TMR_SOURCE:
1171 case SNDCTL_TMR_TEMPO:
1172 event[1] = TMR_TEMPO;
1173 event[4] = *(
int *)arg & 0xFF;
1174 event[5] = (*(
int *)arg >> 8) & 0xFF;
1175 event[6] = (*(
int *)arg >> 16) & 0xFF;
1176 event[7] = (*(
int *)arg >> 24) & 0xFF;
1178 case SNDCTL_TMR_TIMEBASE:
1180 event[4] = *(
int *)arg & 0xFF;
1181 event[5] = (*(
int *)arg >> 8) & 0xFF;
1182 event[6] = (*(
int *)arg >> 16) & 0xFF;
1183 event[7] = (*(
int *)arg >> 24) & 0xFF;
1185 case SNDCTL_TMR_START:
1186 event[1] = TMR_START;
1188 case SNDCTL_TMR_STOP:
1189 event[1] = TMR_STOP;
1191 case SNDCTL_TMR_CONTINUE:
1192 event[1] = TMR_CONTINUE;
1194 event[0] = EV_TIMING;
1195 mtx_lock(&scp->seq_lock);
1198 mtx_unlock(&scp->seq_lock);
1202 mtx_unlock(&scp->seq_lock);
1204 case SNDCTL_TMR_SELECT:
1206 printf(
"seq_ioctl: SNDCTL_TMR_SELECT not supported\n"));
1209 case SNDCTL_SEQ_SYNC:
1210 if (mode == O_RDONLY) {
1214 mtx_lock(&scp->seq_lock);
1216 mtx_unlock(&scp->seq_lock);
1218 case SNDCTL_SEQ_PANIC:
1220 case SNDCTL_SEQ_RESET:
1224 mtx_lock(&scp->seq_lock);
1226 mtx_unlock(&scp->seq_lock);
1229 case SNDCTL_SEQ_TESTMIDI:
1230 mtx_lock(&scp->seq_lock);
1235 mtx_unlock(&scp->seq_lock);
1238 case SNDCTL_SEQ_GETINCOUNT:
1239 if (mode == O_WRONLY)
1242 mtx_lock(&scp->seq_lock);
1243 *(
int *)arg = scp->in_q.rl;
1244 mtx_unlock(&scp->seq_lock);
1245 SEQ_DEBUG(printf(
"seq_ioctl: incount %d.\n",
1250 case SNDCTL_SEQ_GETOUTCOUNT:
1251 if (mode == O_RDONLY)
1254 mtx_lock(&scp->seq_lock);
1255 *(
int *)arg = scp->out_q.fl;
1256 mtx_unlock(&scp->seq_lock);
1257 SEQ_DEBUG(printf(
"seq_ioctl: outcount %d.\n",
1263 case SNDCTL_SEQ_CTRLRATE:
1264 if (*(
int *)arg != 0) {
1268 mtx_lock(&scp->seq_lock);
1269 *(
int *)arg = scp->timerbase;
1270 mtx_unlock(&scp->seq_lock);
1271 SEQ_DEBUG(3, printf(
"seq_ioctl: ctrlrate %d.\n", *(
int *)arg));
1278 case SNDCTL_SEQ_RESETSAMPLES:
1279 mtx_lock(&scp->seq_lock);
1280 ret = lookup_mididev(scp, *(
int *)arg,
LOOKUP_OPEN, &md);
1281 mtx_unlock(&scp->seq_lock);
1284 ret =
midi_ioctl(MIDIMKDEV(major(i_dev), *(
int *)arg,
1288 case SNDCTL_SEQ_NRSYNTHS:
1289 mtx_lock(&scp->seq_lock);
1290 *(
int *)arg = scp->midi_number;
1291 mtx_unlock(&scp->seq_lock);
1292 SEQ_DEBUG(3, printf(
"seq_ioctl: synths %d.\n", *(
int *)arg));
1295 case SNDCTL_SEQ_NRMIDIS:
1296 mtx_lock(&scp->seq_lock);
1303 *(
int *)arg = scp->midi_number;
1305 mtx_unlock(&scp->seq_lock);
1306 SEQ_DEBUG(3, printf(
"seq_ioctl: midis %d.\n", *(
int *)arg));
1313 case SNDCTL_SYNTH_MEMAVL:
1314 mtx_lock(&scp->seq_lock);
1315 ret = lookup_mididev(scp, *(
int *)arg,
LOOKUP_OPEN, &md);
1316 mtx_unlock(&scp->seq_lock);
1319 ret =
midi_ioctl(MIDIMKDEV(major(i_dev), *(
int *)arg,
1323 case SNDCTL_SEQ_OUTOFBAND:
1324 for (ret = 0; ret <
EV_SZ; ret++)
1325 event[ret] = (u_char)arg[0];
1327 mtx_lock(&scp->seq_lock);
1336 mtx_unlock(&scp->seq_lock);
1338 case SNDCTL_SYNTH_INFO:
1339 synthinfo = (
struct synth_info *)arg;
1340 midiunit = synthinfo->device;
1341 mtx_lock(&scp->seq_lock);
1343 bzero(synthinfo,
sizeof(*synthinfo));
1344 synthinfo->name[0] =
'f';
1345 synthinfo->name[1] =
'a';
1346 synthinfo->name[2] =
'k';
1347 synthinfo->name[3] =
'e';
1348 synthinfo->name[4] =
's';
1349 synthinfo->name[5] =
'y';
1350 synthinfo->name[6] =
'n';
1351 synthinfo->name[7] =
't';
1352 synthinfo->name[8] =
'h';
1353 synthinfo->device = midiunit;
1354 synthinfo->synth_type = SYNTH_TYPE_MIDI;
1355 synthinfo->capabilities = scp->midi_flags[midiunit];
1359 mtx_unlock(&scp->seq_lock);
1361 case SNDCTL_MIDI_INFO:
1362 midiinfo = (
struct midi_info *)arg;
1363 midiunit = midiinfo->device;
1364 mtx_lock(&scp->seq_lock);
1366 bzero(midiinfo,
sizeof(*midiinfo));
1367 midiinfo->name[0] =
'f';
1368 midiinfo->name[1] =
'a';
1369 midiinfo->name[2] =
'k';
1370 midiinfo->name[3] =
'e';
1371 midiinfo->name[4] =
'm';
1372 midiinfo->name[5] =
'i';
1373 midiinfo->name[6] =
'd';
1374 midiinfo->name[7] =
'i';
1375 midiinfo->device = midiunit;
1376 midiinfo->capabilities = scp->midi_flags[midiunit];
1380 midiinfo->dev_type = 0x01;
1384 mtx_unlock(&scp->seq_lock);
1386 case SNDCTL_SEQ_THRESHOLD:
1387 mtx_lock(&scp->seq_lock);
1389 scp->out_water = *(
int *)arg;
1390 mtx_unlock(&scp->seq_lock);
1391 SEQ_DEBUG(3, printf(
"seq_ioctl: water %d.\n", *(
int *)arg));
1394 case SNDCTL_MIDI_PRETIME:
1398 mtx_lock(&scp->seq_lock);
1399 scp->pre_event_timeout = (hz * tmp) / 10;
1400 *(
int *)arg = scp->pre_event_timeout;
1401 mtx_unlock(&scp->seq_lock);
1402 SEQ_DEBUG(3, printf(
"seq_ioctl: pretime %d.\n", *(
int *)arg));
1405 case SNDCTL_FM_4OP_ENABLE:
1406 case SNDCTL_PMGR_IFACE:
1407 case SNDCTL_PMGR_ACCESS:
1423 printf(
"seq_ioctl: unsupported IOCTL %ld.\n", cmd));
1432mseq_poll(
struct cdev *i_dev,
int events,
struct thread *td)
1437 SEQ_DEBUG(3, printf(
"seq_poll: unit %d.\n", scp->unit));
1438 SEQ_DEBUG(1, printf(
"seq_poll: unit %d.\n", scp->unit));
1440 mtx_lock(&scp->seq_lock);
1445 if ((events & (POLLOUT | POLLWRNORM)) != 0) {
1448 cv_broadcast(&scp->state_cv);
1449 cv_broadcast(&scp->out_cv);
1451 lim = scp->out_water;
1455 selrecord(td, &scp->out_sel);
1458 ret |= events & (POLLOUT | POLLWRNORM);
1460 if ((events & (POLLIN | POLLRDNORM)) != 0) {
1467 selrecord(td, &scp->in_sel);
1470 ret |= events & (POLLIN | POLLRDNORM);
1472 mtx_unlock(&scp->seq_lock);
1479sein_qtr(
void *p,
void *md)
1485 mtx_lock(&scp->seq_lock);
1488 if (scp->queueout_pending)
1489 seq_callback(scp, SEQ_CB_START | SEQ_CB_WR);
1491 if ((scp->flags & SEQ_F_READING) != 0)
1492 seq_midiinput(scp, md);
1494 mtx_unlock(&scp->seq_lock);
1507 u_char
dev, chn, note, vel;
1509 out[0] = out[1] = out[2] = out[3] = out[4] = out[5] = out[6] =
1540 out[0] = EV_CHN_VOICE;
1542 out[2] = MIDI_NOTEOFF;
1550 out[0] = EV_CHN_VOICE;
1552 out[2] = MIDI_NOTEON;
1564 out[0] = EV_CHN_COMMON;
1566 out[2] = MIDI_PGM_CHANGE;
1585 printf(
"seq_playevent: put data 0x%02x, unit %d.\n",
1586 event[1], event[2]));
1592 out[0] = SEQ_MIDIPUTC;
1620 case SEQ_AFTERTOUCH:
1628 case SEQ_CONTROLLER:
1638 printf(
"seq_convertold: SEQ_EXTENDED type %d"
1639 "not handled\n", event[1]));
1645 out[1] = TMR_WAIT_REL;
1651 event[2] + (event[3] << 8) + (event[4] << 24)));
1661 printf(
"seq_convertold: event type %d not handled %d %d %d\n",
1662 event[0], event[1], event[2], event[3]));
1676 mtx_assert(&scp->seq_lock, MA_OWNED);
1682 SEQ_DEBUG(2, printf(
"seq_copytoinput: queue full\n"));
1685 selwakeup(&scp->in_sel);
1686 cv_broadcast(&scp->in_cv);
1695 u_char cmd, chn, note, parm;
1703 mtx_assert(&scp->seq_lock, MA_OWNED);
1705 SEQ_DEBUG(5, printf(
"seq_chnvoice: unit %d, dev %d, cmd %s,"
1706 " chn %d, note %d, parm %d.\n", scp->unit, event[1],
1709 voice = SYNTH_ALLOC(md, chn, note);
1711 mtx_unlock(&scp->seq_lock);
1715 if (note < 128 || note == 255) {
1717 if (scp->music && chn == 9) {
1745 SYNTH_STARTNOTE(md, voice, note, parm);
1749 SYNTH_KILLNOTE(md, voice, note, parm);
1751 case MIDI_KEY_PRESSURE:
1752 SYNTH_AFTERTOUCH(md, voice, parm);
1756 SEQ_DEBUG(2, printf(
"seq_chnvoice event type %d not handled\n",
1761 mtx_lock(&scp->seq_lock);
1770 u_char cmd, chn, p1;
1776 w14 = *(u_short *)&event[6];
1778 SEQ_DEBUG(5, printf(
"seq_chncommon: unit %d, dev %d, cmd %s, chn %d,"
1779 " p1 %d, w14 %d.\n", scp->unit, event[1],
1781 mtx_unlock(&scp->seq_lock);
1783 case MIDI_PGM_CHANGE:
1784 SEQ_DEBUG(4, printf(
"seq_chncommon pgmchn chn %d pg %d\n",
1786 SYNTH_SETINSTR(md, chn, p1);
1788 case MIDI_CTL_CHANGE:
1789 SEQ_DEBUG(4, printf(
"seq_chncommon ctlch chn %d pg %d %d\n",
1791 SYNTH_CONTROLLER(md, chn, p1, w14);
1793 case MIDI_PITCH_BEND:
1799 mtx_lock(&md->synth.vc_mtx);
1800 md->synth.chn_info[chn].bender_value = w14;
1801 if (md->midiunit >= 0) {
1806 key = ((int)chn << 8);
1807 for (i = 0; i < md->synth.alloc.max_voice; i++)
1808 if ((md->synth.alloc.map[i] & 0xff00) ==
key) {
1809 mtx_unlock(&md->synth.vc_mtx);
1810 mtx_unlock(&scp->seq_lock);
1811 if (md->synth.bender(md, i, w14) == EAGAIN) {
1812 mtx_lock(&scp->seq_lock);
1815 mtx_lock(&scp->seq_lock);
1818 mtx_unlock(&md->synth.vc_mtx);
1819 mtx_unlock(&scp->seq_lock);
1820 if (md->synth.bender(md, chn, w14) == EAGAIN) {
1821 mtx_lock(&scp->seq_lock);
1824 mtx_lock(&scp->seq_lock);
1828 SYNTH_BENDER(md, chn, w14);
1833 printf(
"seq_chncommon event type %d not handled.\n",
1837 mtx_lock(&scp->seq_lock);
1848 param =
event[4] + (
event[5] << 8) +
1849 (event[6] << 16) + (
event[7] << 24);
1851 SEQ_DEBUG(5, printf(
"seq_timing: unit %d, cmd %d, param %d.\n",
1852 scp->unit, event[1],
param));
1862 cv_broadcast(&scp->reset_cv);
1870 cv_broadcast(&scp->reset_cv);
1874 cv_broadcast(&scp->reset_cv);
1911 SEQ_DEBUG(2, printf(
"seq_timing event type %d not handled.\n",
1925 mtx_assert(&scp->seq_lock, MA_OWNED);
1927 SEQ_DEBUG(5, printf(
"seq_local: unit %d, cmd %d\n", scp->unit,
1931 SEQ_DEBUG(1, printf(
"seq_local event type %d not handled\n",
1944 mtx_assert(&scp->seq_lock, MA_OWNED);
1945 SEQ_DEBUG(5, printf(
"seq_sysex: unit %d device %d\n", scp->unit,
1948 for (i = 0; i < 6 &&
event[i + 2] != 0xff; i++)
1951 mtx_unlock(&scp->seq_lock);
1952 if (SYNTH_SENDSYSEX(md, &event[2], l) == EAGAIN) {
1953 mtx_lock(&scp->seq_lock);
1956 mtx_lock(&scp->seq_lock);
1971 mtx_assert(&scp->seq_lock, MA_OWNED);
1973 SEQ_DEBUG(5, printf(
"seq_reset: unit %d.\n", scp->unit));
1981 cv_broadcast(&scp->state_cv);
1982 cv_broadcast(&scp->out_cv);
1983 cv_broadcast(&scp->reset_cv);
1991 for (i = 0; i < scp->midi_number; i++) {
1993 mtx_unlock(&scp->seq_lock);
1995 for (chn = 0; chn < 16; chn++) {
1996 SYNTH_CONTROLLER(
m, chn, 123, 0);
1997 SYNTH_CONTROLLER(
m, chn, 121, 0);
1998 SYNTH_BENDER(
m, chn, 1 << 13);
2000 mtx_lock(&scp->seq_lock);
2011#define SEQ_SYNC_TIMEOUT 8
2015 int i, rl, sync[16], done;
2017 mtx_assert(&scp->seq_lock, MA_OWNED);
2019 SEQ_DEBUG(4, printf(
"seq_sync: unit %d.\n", scp->unit));
2026 if (!scp->playing) {
2028 cv_broadcast(&scp->state_cv);
2029 cv_broadcast(&scp->out_cv);
2033 i = cv_timedwait_sig(&scp->out_cv,
2036 if (i == EINTR || i == ERESTART) {
2042 cv_broadcast(&scp->out_cv);
2046 if (i == EWOULDBLOCK && rl ==
MIDIQ_LEN(scp->out_q) &&
2047 scp->waiting == 0) {
2054 cv_broadcast(&scp->state_cv);
2055 cv_broadcast(&scp->out_cv);
2056 cv_broadcast(&scp->reset_cv);
2062 SEQ_DEBUG(1, printf(
"seq_sync queue stuck, aborting\n"));
2073 mtx_unlock(&scp->seq_lock);
2074 for (i = 0; i < scp->midi_number; i++)
2079 for (i = 0; i < scp->midi_number; i++)
2081 if (SYNTH_INSYNC(scp->midis[i]) == 0)
2091 mtx_lock(&scp->seq_lock);
2098 while (tab->
name != NULL) {
2099 if (cmd == tab->
cmd)
struct pcmchan_matrix * m
int midi_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, struct thread *td)
kobj_t midimapper_fetch_synth(void *arg, void *cookie, int unit)
int midimapper_open(void *arg1, void **cookie)
int midimapper_close(void *arg1, void *cookie)
kobj_t midimapper_addseq(void *arg1, int *unit, void **cookie)
#define MIDIQ_HEAD(name, type)
#define MIDIQ_DEQ(head, buf, size)
#define MIDIQ_INIT(head, buf, size)
#define MIDIQ_CLEAR(head)
#define MIDIQ_AVAIL(head)
#define MIDIQ_EMPTY(head)
#define MIDIQ_ENQ(head, buf, size)
static int seq_local(struct seq_softc *scp, u_char *event)
int seq_modevent(module_t mod, int type, void *data)
static int seq_delunit(int unit)
midi_cmdtab cmdtab_timer[]
#define MIDIMKMINOR(u, d, c)
static int seq_processevent(struct seq_softc *scp, u_char *event)
static kobj_method_t seq_methods[]
static struct cdevsw seq_cdevsw
midi_cmdtab cmdtab_seqcv[]
static d_poll_t mseq_poll
static d_read_t mseq_read
static int seq_sync(struct seq_softc *scp)
static d_open_t mseq_open
static int seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md)
static d_write_t mseq_write
DEFINE_CLASS(sequencer, seq_methods, 0)
static int seq_addunit(void)
static int seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event)
void seq_copytoinput(struct seq_softc *scp, u_char *event, int len)
static void seq_eventthread(void *arg)
midi_cmdtab cmdtab_seqccmn[]
char * midi_cmdname(int cmd, midi_cmdtab *tab)
static struct mtx seqinfo_mtx
static int seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event)
static int seq_timing(struct seq_softc *scp, u_char *event)
static void timer_setvals(struct seq_softc *t, int tempo, int timerbase)
static int seq_convertold(u_char *event, u_char *out)
static int seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event)
struct seq_softc * seqs[10]
static void timer_continue(struct seq_softc *t)
static int timer_now(struct seq_softc *t)
SYSCTL_INT(_hw_midi_seq, OID_AUTO, debug, CTLFLAG_RW, &seq_debug, 0, "")
static void timer_stop(struct seq_softc *t)
static d_close_t mseq_close
static void timer_wait(struct seq_softc *t, int ticks, int wait_abs)
static void timer_start(struct seq_softc *t)
midi_cmdtab cmdtab_seqioctl[]
static d_ioctl_t mseq_ioctl
SYSCTL_NODE(_hw_midi, OID_AUTO, seq, CTLFLAG_RD|CTLFLAG_MPSAFE, 0, "Midi sequencer")
static void seq_reset(struct seq_softc *scp)
midi_cmdtab cmdtab_seqevent[]
#define RANGE(var, low, high)
struct mtx seq_lock q_lock
struct cv empty_cv reset_cv in_cv out_cv state_cv th_cv