1 /*- 2 * Copyright (c) 2003 Mathew Kanner 3 * Copyright (c) 1993 Hannu Savolainen 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 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. 14 * 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 25 * SUCH DAMAGE. 26 */ 27 28 /* 29 * The sequencer personality manager. 30 */ 31 32 #include <sys/cdefs.h> 33 __FBSDID("$FreeBSD$"); 34 35 #include <sys/param.h> 36 #include <sys/systm.h> 37 #include <sys/ioccom.h> 38 39 #include <sys/filio.h> 40 #include <sys/lock.h> 41 #include <sys/sockio.h> 42 #include <sys/fcntl.h> 43 #include <sys/proc.h> 44 #include <sys/sysctl.h> 45 46 #include <sys/kernel.h> /* for DATA_SET */ 47 48 #include <sys/module.h> 49 #include <sys/conf.h> 50 #include <sys/file.h> 51 #include <sys/uio.h> 52 #include <sys/syslog.h> 53 #include <sys/errno.h> 54 #include <sys/malloc.h> 55 #include <sys/bus.h> 56 #include <machine/resource.h> 57 #include <machine/bus.h> 58 #include <machine/clock.h> /* for DELAY */ 59 #include <sys/soundcard.h> 60 #include <sys/rman.h> 61 #include <sys/mman.h> 62 #include <sys/poll.h> 63 #include <sys/mutex.h> 64 #include <sys/condvar.h> 65 #include <sys/kthread.h> 66 #include <sys/unistd.h> 67 #include <sys/selinfo.h> 68 69 #ifdef HAVE_KERNEL_OPTION_HEADERS 70 #include "opt_snd.h" 71 #endif 72 73 #include <dev/sound/midi/midi.h> 74 #include <dev/sound/midi/midiq.h> 75 #include "synth_if.h" 76 77 #include <dev/sound/midi/sequencer.h> 78 79 #define TMR_TIMERBASE 13 80 81 #define SND_DEV_SEQ 1 /* Sequencer output /dev/sequencer (FM 82 * synthesizer and MIDI output) */ 83 #define SND_DEV_MUSIC 8 /* /dev/music, level 2 interface */ 84 85 /* Length of a sequencer event. */ 86 #define EV_SZ 8 87 #define IEV_SZ 8 88 89 /* Lookup modes */ 90 #define LOOKUP_EXIST (0) 91 #define LOOKUP_OPEN (1) 92 #define LOOKUP_CLOSE (2) 93 94 #define PCMMKMINOR(u, d, c) \ 95 ((((c) & 0xff) << 16) | (((u) & 0x0f) << 4) | ((d) & 0x0f)) 96 #define MIDIMKMINOR(u, d, c) PCMMKMINOR(u, d, c) 97 #define MIDIUNIT(y) ((dev2unit(y) >> 4) & 0x0f) 98 #define MIDIDEV(y) (dev2unit(y) & 0x0f) 99 100 /* These are the entries to the sequencer driver. */ 101 static d_open_t mseq_open; 102 static d_close_t mseq_close; 103 static d_ioctl_t mseq_ioctl; 104 static d_read_t mseq_read; 105 static d_write_t mseq_write; 106 static d_poll_t mseq_poll; 107 108 static struct cdevsw seq_cdevsw = { 109 .d_version = D_VERSION, 110 .d_open = mseq_open, 111 .d_close = mseq_close, 112 .d_read = mseq_read, 113 .d_write = mseq_write, 114 .d_ioctl = mseq_ioctl, 115 .d_poll = mseq_poll, 116 .d_name = "sequencer", 117 }; 118 119 struct seq_softc { 120 KOBJ_FIELDS; 121 122 struct mtx seq_lock, q_lock; 123 struct cv empty_cv, reset_cv, in_cv, out_cv, state_cv, th_cv; 124 125 MIDIQ_HEAD(, u_char) in_q, out_q; 126 127 u_long flags; 128 /* Flags (protected by flag_mtx of mididev_info) */ 129 int fflags; /* Access mode */ 130 int music; 131 132 int out_water; /* Sequence output threshould */ 133 snd_sync_parm sync_parm; /* AIOSYNC parameter set */ 134 struct thread *sync_thread; /* AIOSYNCing thread */ 135 struct selinfo in_sel, out_sel; 136 int midi_number; 137 struct cdev *seqdev, *musicdev; 138 int unit; 139 int maxunits; 140 kobj_t *midis; 141 int *midi_flags; 142 kobj_t mapper; 143 void *mapper_cookie; 144 struct timeval timerstop, timersub; 145 int timerbase, tempo; 146 int timerrun; 147 int done; 148 int playing; 149 int recording; 150 int busy; 151 int pre_event_timeout; 152 int waiting; 153 }; 154 155 /* 156 * Module specific stuff, including how many sequecers 157 * we currently own. 158 */ 159 160 SYSCTL_NODE(_hw_midi, OID_AUTO, seq, CTLFLAG_RD, 0, "Midi sequencer"); 161 162 int seq_debug; 163 /* XXX: should this be moved into debug.midi? */ 164 SYSCTL_INT(_hw_midi_seq, OID_AUTO, debug, CTLFLAG_RW, &seq_debug, 0, ""); 165 166 midi_cmdtab cmdtab_seqevent[] = { 167 {SEQ_NOTEOFF, "SEQ_NOTEOFF"}, 168 {SEQ_NOTEON, "SEQ_NOTEON"}, 169 {SEQ_WAIT, "SEQ_WAIT"}, 170 {SEQ_PGMCHANGE, "SEQ_PGMCHANGE"}, 171 {SEQ_SYNCTIMER, "SEQ_SYNCTIMER"}, 172 {SEQ_MIDIPUTC, "SEQ_MIDIPUTC"}, 173 {SEQ_DRUMON, "SEQ_DRUMON"}, 174 {SEQ_DRUMOFF, "SEQ_DRUMOFF"}, 175 {SEQ_ECHO, "SEQ_ECHO"}, 176 {SEQ_AFTERTOUCH, "SEQ_AFTERTOUCH"}, 177 {SEQ_CONTROLLER, "SEQ_CONTROLLER"}, 178 {SEQ_BALANCE, "SEQ_BALANCE"}, 179 {SEQ_VOLMODE, "SEQ_VOLMODE"}, 180 {SEQ_FULLSIZE, "SEQ_FULLSIZE"}, 181 {SEQ_PRIVATE, "SEQ_PRIVATE"}, 182 {SEQ_EXTENDED, "SEQ_EXTENDED"}, 183 {EV_SEQ_LOCAL, "EV_SEQ_LOCAL"}, 184 {EV_TIMING, "EV_TIMING"}, 185 {EV_CHN_COMMON, "EV_CHN_COMMON"}, 186 {EV_CHN_VOICE, "EV_CHN_VOICE"}, 187 {EV_SYSEX, "EV_SYSEX"}, 188 {-1, NULL}, 189 }; 190 191 midi_cmdtab cmdtab_seqioctl[] = { 192 {SNDCTL_SEQ_RESET, "SNDCTL_SEQ_RESET"}, 193 {SNDCTL_SEQ_SYNC, "SNDCTL_SEQ_SYNC"}, 194 {SNDCTL_SYNTH_INFO, "SNDCTL_SYNTH_INFO"}, 195 {SNDCTL_SEQ_CTRLRATE, "SNDCTL_SEQ_CTRLRATE"}, 196 {SNDCTL_SEQ_GETOUTCOUNT, "SNDCTL_SEQ_GETOUTCOUNT"}, 197 {SNDCTL_SEQ_GETINCOUNT, "SNDCTL_SEQ_GETINCOUNT"}, 198 {SNDCTL_SEQ_PERCMODE, "SNDCTL_SEQ_PERCMODE"}, 199 {SNDCTL_FM_LOAD_INSTR, "SNDCTL_FM_LOAD_INSTR"}, 200 {SNDCTL_SEQ_TESTMIDI, "SNDCTL_SEQ_TESTMIDI"}, 201 {SNDCTL_SEQ_RESETSAMPLES, "SNDCTL_SEQ_RESETSAMPLES"}, 202 {SNDCTL_SEQ_NRSYNTHS, "SNDCTL_SEQ_NRSYNTHS"}, 203 {SNDCTL_SEQ_NRMIDIS, "SNDCTL_SEQ_NRMIDIS"}, 204 {SNDCTL_SEQ_GETTIME, "SNDCTL_SEQ_GETTIME"}, 205 {SNDCTL_MIDI_INFO, "SNDCTL_MIDI_INFO"}, 206 {SNDCTL_SEQ_THRESHOLD, "SNDCTL_SEQ_THRESHOLD"}, 207 {SNDCTL_SYNTH_MEMAVL, "SNDCTL_SYNTH_MEMAVL"}, 208 {SNDCTL_FM_4OP_ENABLE, "SNDCTL_FM_4OP_ENABLE"}, 209 {SNDCTL_PMGR_ACCESS, "SNDCTL_PMGR_ACCESS"}, 210 {SNDCTL_SEQ_PANIC, "SNDCTL_SEQ_PANIC"}, 211 {SNDCTL_SEQ_OUTOFBAND, "SNDCTL_SEQ_OUTOFBAND"}, 212 {SNDCTL_TMR_TIMEBASE, "SNDCTL_TMR_TIMEBASE"}, 213 {SNDCTL_TMR_START, "SNDCTL_TMR_START"}, 214 {SNDCTL_TMR_STOP, "SNDCTL_TMR_STOP"}, 215 {SNDCTL_TMR_CONTINUE, "SNDCTL_TMR_CONTINUE"}, 216 {SNDCTL_TMR_TEMPO, "SNDCTL_TMR_TEMPO"}, 217 {SNDCTL_TMR_SOURCE, "SNDCTL_TMR_SOURCE"}, 218 {SNDCTL_TMR_METRONOME, "SNDCTL_TMR_METRONOME"}, 219 {SNDCTL_TMR_SELECT, "SNDCTL_TMR_SELECT"}, 220 {SNDCTL_MIDI_PRETIME, "SNDCTL_MIDI_PRETIME"}, 221 {AIONWRITE, "AIONWRITE"}, 222 {AIOGSIZE, "AIOGSIZE"}, 223 {AIOSSIZE, "AIOSSIZE"}, 224 {AIOGFMT, "AIOGFMT"}, 225 {AIOSFMT, "AIOSFMT"}, 226 {AIOGMIX, "AIOGMIX"}, 227 {AIOSMIX, "AIOSMIX"}, 228 {AIOSTOP, "AIOSTOP"}, 229 {AIOSYNC, "AIOSYNC"}, 230 {AIOGCAP, "AIOGCAP"}, 231 {-1, NULL}, 232 }; 233 234 midi_cmdtab cmdtab_timer[] = { 235 {TMR_WAIT_REL, "TMR_WAIT_REL"}, 236 {TMR_WAIT_ABS, "TMR_WAIT_ABS"}, 237 {TMR_STOP, "TMR_STOP"}, 238 {TMR_START, "TMR_START"}, 239 {TMR_CONTINUE, "TMR_CONTINUE"}, 240 {TMR_TEMPO, "TMR_TEMPO"}, 241 {TMR_ECHO, "TMR_ECHO"}, 242 {TMR_CLOCK, "TMR_CLOCK"}, 243 {TMR_SPP, "TMR_SPP"}, 244 {TMR_TIMESIG, "TMR_TIMESIG"}, 245 {-1, NULL}, 246 }; 247 248 midi_cmdtab cmdtab_seqcv[] = { 249 {MIDI_NOTEOFF, "MIDI_NOTEOFF"}, 250 {MIDI_NOTEON, "MIDI_NOTEON"}, 251 {MIDI_KEY_PRESSURE, "MIDI_KEY_PRESSURE"}, 252 {-1, NULL}, 253 }; 254 255 midi_cmdtab cmdtab_seqccmn[] = { 256 {MIDI_CTL_CHANGE, "MIDI_CTL_CHANGE"}, 257 {MIDI_PGM_CHANGE, "MIDI_PGM_CHANGE"}, 258 {MIDI_CHN_PRESSURE, "MIDI_CHN_PRESSURE"}, 259 {MIDI_PITCH_BEND, "MIDI_PITCH_BEND"}, 260 {MIDI_SYSTEM_PREFIX, "MIDI_SYSTEM_PREFIX"}, 261 {-1, NULL}, 262 }; 263 264 #ifndef KOBJMETHOD_END 265 #define KOBJMETHOD_END { NULL, NULL } 266 #endif 267 268 /* 269 * static const char *mpu401_mprovider(kobj_t obj, struct mpu401 *m); 270 */ 271 272 static kobj_method_t seq_methods[] = { 273 /* KOBJMETHOD(mpu_provider,mpu401_mprovider), */ 274 KOBJMETHOD_END 275 }; 276 277 DEFINE_CLASS(sequencer, seq_methods, 0); 278 279 /* The followings are the local function. */ 280 static int seq_convertold(u_char *event, u_char *out); 281 282 /* 283 * static void seq_midiinput(struct seq_softc * scp, void *md); 284 */ 285 static void seq_reset(struct seq_softc *scp); 286 static int seq_sync(struct seq_softc *scp); 287 288 static int seq_processevent(struct seq_softc *scp, u_char *event); 289 290 static int seq_timing(struct seq_softc *scp, u_char *event); 291 static int seq_local(struct seq_softc *scp, u_char *event); 292 293 static int seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event); 294 static int seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event); 295 static int seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event); 296 297 static int seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md); 298 void seq_copytoinput(struct seq_softc *scp, u_char *event, int len); 299 int seq_modevent(module_t mod, int type, void *data); 300 struct seq_softc *seqs[10]; 301 static struct mtx seqinfo_mtx; 302 static u_long nseq = 0; 303 304 static void timer_start(struct seq_softc *t); 305 static void timer_stop(struct seq_softc *t); 306 static void timer_setvals(struct seq_softc *t, int tempo, int timerbase); 307 static void timer_wait(struct seq_softc *t, int ticks, int wait_abs); 308 static int timer_now(struct seq_softc *t); 309 310 311 static void 312 timer_start(struct seq_softc *t) 313 { 314 t->timerrun = 1; 315 getmicrotime(&t->timersub); 316 } 317 318 static void 319 timer_continue(struct seq_softc *t) 320 { 321 struct timeval now; 322 323 if (t->timerrun == 1) 324 return; 325 t->timerrun = 1; 326 getmicrotime(&now); 327 timevalsub(&now, &t->timerstop); 328 timevaladd(&t->timersub, &now); 329 } 330 331 static void 332 timer_stop(struct seq_softc *t) 333 { 334 t->timerrun = 0; 335 getmicrotime(&t->timerstop); 336 } 337 338 static void 339 timer_setvals(struct seq_softc *t, int tempo, int timerbase) 340 { 341 t->tempo = tempo; 342 t->timerbase = timerbase; 343 } 344 345 static void 346 timer_wait(struct seq_softc *t, int ticks, int wait_abs) 347 { 348 struct timeval now, when; 349 int ret; 350 unsigned long long i; 351 352 while (t->timerrun == 0) { 353 SEQ_DEBUG(2, printf("Timer wait when timer isn't running\n")); 354 /* 355 * The old sequencer used timeouts that only increased 356 * the timer when the timer was running. 357 * Hence the sequencer would stick (?) if the 358 * timer was disabled. 359 */ 360 cv_wait(&t->reset_cv, &t->seq_lock); 361 if (t->playing == 0) 362 return; 363 } 364 365 i = ticks * 60ull * 1000000ull / (t->tempo * t->timerbase); 366 367 when.tv_sec = i / 1000000; 368 when.tv_usec = i % 1000000; 369 370 #if 0 371 printf("timer_wait tempo %d timerbase %d ticks %d abs %d u_sec %llu\n", 372 t->tempo, t->timerbase, ticks, wait_abs, i); 373 #endif 374 375 if (wait_abs != 0) { 376 getmicrotime(&now); 377 timevalsub(&now, &t->timersub); 378 timevalsub(&when, &now); 379 } 380 if (when.tv_sec < 0 || when.tv_usec < 0) { 381 SEQ_DEBUG(3, 382 printf("seq_timer error negative time %lds.%06lds\n", 383 (long)when.tv_sec, (long)when.tv_usec)); 384 return; 385 } 386 i = when.tv_sec * 1000000ull; 387 i += when.tv_usec; 388 i *= hz; 389 i /= 1000000ull; 390 #if 0 391 printf("seq_timer usec %llu ticks %llu\n", 392 when.tv_sec * 1000000ull + when.tv_usec, i); 393 #endif 394 t->waiting = 1; 395 ret = cv_timedwait(&t->reset_cv, &t->seq_lock, i + 1); 396 t->waiting = 0; 397 398 if (ret != EWOULDBLOCK) 399 SEQ_DEBUG(3, printf("seq_timer didn't timeout\n")); 400 401 } 402 403 static int 404 timer_now(struct seq_softc *t) 405 { 406 struct timeval now; 407 unsigned long long i; 408 int ret; 409 410 if (t->timerrun == 0) 411 now = t->timerstop; 412 else 413 getmicrotime(&now); 414 415 timevalsub(&now, &t->timersub); 416 417 i = now.tv_sec * 1000000ull; 418 i += now.tv_usec; 419 i *= t->timerbase; 420 /* i /= t->tempo; */ 421 i /= 1000000ull; 422 423 ret = i; 424 /* 425 * printf("timer_now: %llu %d\n", i, ret); 426 */ 427 428 return ret; 429 } 430 431 static void 432 seq_eventthread(void *arg) 433 { 434 struct seq_softc *scp = arg; 435 char event[EV_SZ]; 436 437 mtx_lock(&scp->seq_lock); 438 SEQ_DEBUG(2, printf("seq_eventthread started\n")); 439 while (scp->done == 0) { 440 restart: 441 while (scp->playing == 0) { 442 cv_wait(&scp->state_cv, &scp->seq_lock); 443 if (scp->done) 444 goto done; 445 } 446 447 while (MIDIQ_EMPTY(scp->out_q)) { 448 cv_broadcast(&scp->empty_cv); 449 cv_wait(&scp->out_cv, &scp->seq_lock); 450 if (scp->playing == 0) 451 goto restart; 452 if (scp->done) 453 goto done; 454 } 455 456 MIDIQ_DEQ(scp->out_q, event, EV_SZ); 457 458 if (MIDIQ_AVAIL(scp->out_q) < scp->out_water) { 459 cv_broadcast(&scp->out_cv); 460 selwakeup(&scp->out_sel); 461 } 462 seq_processevent(scp, event); 463 } 464 465 done: 466 cv_broadcast(&scp->th_cv); 467 mtx_unlock(&scp->seq_lock); 468 SEQ_DEBUG(2, printf("seq_eventthread finished\n")); 469 kproc_exit(0); 470 } 471 472 /* 473 * seq_processevent: This maybe called by the event thread or the IOCTL 474 * handler for queued and out of band events respectively. 475 */ 476 static int 477 seq_processevent(struct seq_softc *scp, u_char *event) 478 { 479 int ret; 480 kobj_t m; 481 482 ret = 0; 483 484 if (event[0] == EV_SEQ_LOCAL) 485 ret = seq_local(scp, event); 486 else if (event[0] == EV_TIMING) 487 ret = seq_timing(scp, event); 488 else if (event[0] != EV_CHN_VOICE && 489 event[0] != EV_CHN_COMMON && 490 event[0] != EV_SYSEX && 491 event[0] != SEQ_MIDIPUTC) { 492 ret = 1; 493 SEQ_DEBUG(2, printf("seq_processevent not known %d\n", 494 event[0])); 495 } else if (seq_fetch_mid(scp, event[1], &m) != 0) { 496 ret = 1; 497 SEQ_DEBUG(2, printf("seq_processevent midi unit not found %d\n", 498 event[1])); 499 } else 500 switch (event[0]) { 501 case EV_CHN_VOICE: 502 ret = seq_chnvoice(scp, m, event); 503 break; 504 case EV_CHN_COMMON: 505 ret = seq_chncommon(scp, m, event); 506 break; 507 case EV_SYSEX: 508 ret = seq_sysex(scp, m, event); 509 break; 510 case SEQ_MIDIPUTC: 511 mtx_unlock(&scp->seq_lock); 512 ret = SYNTH_WRITERAW(m, &event[2], 1); 513 mtx_lock(&scp->seq_lock); 514 break; 515 } 516 return ret; 517 } 518 519 static int 520 seq_addunit(void) 521 { 522 struct seq_softc *scp; 523 int ret; 524 u_char *buf; 525 526 /* Allocate the softc. */ 527 ret = ENOMEM; 528 scp = malloc(sizeof(*scp), M_DEVBUF, M_NOWAIT | M_ZERO); 529 if (scp == NULL) { 530 SEQ_DEBUG(1, printf("seq_addunit: softc allocation failed.\n")); 531 goto err; 532 } 533 kobj_init((kobj_t)scp, &sequencer_class); 534 535 buf = malloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_NOWAIT | M_ZERO); 536 if (buf == NULL) 537 goto err; 538 MIDIQ_INIT(scp->in_q, buf, EV_SZ * 1024); 539 buf = malloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_NOWAIT | M_ZERO); 540 if (buf == NULL) 541 goto err; 542 MIDIQ_INIT(scp->out_q, buf, EV_SZ * 1024); 543 ret = EINVAL; 544 545 scp->midis = malloc(sizeof(kobj_t) * 32, M_TEMP, M_NOWAIT | M_ZERO); 546 scp->midi_flags = malloc(sizeof(*scp->midi_flags) * 32, M_TEMP, 547 M_NOWAIT | M_ZERO); 548 549 if (scp->midis == NULL || scp->midi_flags == NULL) 550 goto err; 551 552 scp->flags = 0; 553 554 mtx_init(&scp->seq_lock, "seqflq", NULL, 0); 555 cv_init(&scp->state_cv, "seqstate"); 556 cv_init(&scp->empty_cv, "seqempty"); 557 cv_init(&scp->reset_cv, "seqtimer"); 558 cv_init(&scp->out_cv, "seqqout"); 559 cv_init(&scp->in_cv, "seqqin"); 560 cv_init(&scp->th_cv, "seqstart"); 561 562 /* 563 * Init the damn timer 564 */ 565 566 scp->mapper = midimapper_addseq(scp, &scp->unit, &scp->mapper_cookie); 567 if (scp->mapper == NULL) 568 goto err; 569 570 scp->seqdev = make_dev(&seq_cdevsw, 571 MIDIMKMINOR(scp->unit, SND_DEV_SEQ, 0), UID_ROOT, 572 GID_WHEEL, 0666, "sequencer%d", scp->unit); 573 574 scp->musicdev = make_dev(&seq_cdevsw, 575 MIDIMKMINOR(scp->unit, SND_DEV_MUSIC, 0), UID_ROOT, 576 GID_WHEEL, 0666, "music%d", scp->unit); 577 578 if (scp->seqdev == NULL || scp->musicdev == NULL) 579 goto err; 580 /* 581 * TODO: Add to list of sequencers this module provides 582 */ 583 584 ret = 585 kproc_create 586 (seq_eventthread, scp, NULL, RFHIGHPID, 0, 587 "sequencer %02d", scp->unit); 588 589 if (ret) 590 goto err; 591 592 scp->seqdev->si_drv1 = scp->musicdev->si_drv1 = scp; 593 594 SEQ_DEBUG(2, printf("sequencer %d created scp %p\n", scp->unit, scp)); 595 596 ret = 0; 597 598 mtx_lock(&seqinfo_mtx); 599 seqs[nseq++] = scp; 600 mtx_unlock(&seqinfo_mtx); 601 602 goto ok; 603 604 err: 605 if (scp != NULL) { 606 if (scp->seqdev != NULL) 607 destroy_dev(scp->seqdev); 608 if (scp->musicdev != NULL) 609 destroy_dev(scp->musicdev); 610 /* 611 * TODO: Destroy mutex and cv 612 */ 613 if (scp->midis != NULL) 614 free(scp->midis, M_TEMP); 615 if (scp->midi_flags != NULL) 616 free(scp->midi_flags, M_TEMP); 617 if (scp->out_q.b) 618 free(scp->out_q.b, M_TEMP); 619 if (scp->in_q.b) 620 free(scp->in_q.b, M_TEMP); 621 free(scp, M_DEVBUF); 622 } 623 ok: 624 return ret; 625 } 626 627 static int 628 seq_delunit(int unit) 629 { 630 struct seq_softc *scp = seqs[unit]; 631 int i; 632 633 //SEQ_DEBUG(4, printf("seq_delunit: %d\n", unit)); 634 SEQ_DEBUG(1, printf("seq_delunit: 1 \n")); 635 mtx_lock(&scp->seq_lock); 636 637 scp->playing = 0; 638 scp->done = 1; 639 cv_broadcast(&scp->out_cv); 640 cv_broadcast(&scp->state_cv); 641 cv_broadcast(&scp->reset_cv); 642 SEQ_DEBUG(1, printf("seq_delunit: 2 \n")); 643 cv_wait(&scp->th_cv, &scp->seq_lock); 644 SEQ_DEBUG(1, printf("seq_delunit: 3.0 \n")); 645 mtx_unlock(&scp->seq_lock); 646 SEQ_DEBUG(1, printf("seq_delunit: 3.1 \n")); 647 648 cv_destroy(&scp->state_cv); 649 SEQ_DEBUG(1, printf("seq_delunit: 4 \n")); 650 cv_destroy(&scp->empty_cv); 651 SEQ_DEBUG(1, printf("seq_delunit: 5 \n")); 652 cv_destroy(&scp->reset_cv); 653 SEQ_DEBUG(1, printf("seq_delunit: 6 \n")); 654 cv_destroy(&scp->out_cv); 655 SEQ_DEBUG(1, printf("seq_delunit: 7 \n")); 656 cv_destroy(&scp->in_cv); 657 SEQ_DEBUG(1, printf("seq_delunit: 8 \n")); 658 cv_destroy(&scp->th_cv); 659 660 SEQ_DEBUG(1, printf("seq_delunit: 10 \n")); 661 if (scp->seqdev) 662 destroy_dev(scp->seqdev); 663 SEQ_DEBUG(1, printf("seq_delunit: 11 \n")); 664 if (scp->musicdev) 665 destroy_dev(scp->musicdev); 666 SEQ_DEBUG(1, printf("seq_delunit: 12 \n")); 667 scp->seqdev = scp->musicdev = NULL; 668 if (scp->midis != NULL) 669 free(scp->midis, M_TEMP); 670 SEQ_DEBUG(1, printf("seq_delunit: 13 \n")); 671 if (scp->midi_flags != NULL) 672 free(scp->midi_flags, M_TEMP); 673 SEQ_DEBUG(1, printf("seq_delunit: 14 \n")); 674 free(scp->out_q.b, M_TEMP); 675 SEQ_DEBUG(1, printf("seq_delunit: 15 \n")); 676 free(scp->in_q.b, M_TEMP); 677 678 SEQ_DEBUG(1, printf("seq_delunit: 16 \n")); 679 680 mtx_destroy(&scp->seq_lock); 681 SEQ_DEBUG(1, printf("seq_delunit: 17 \n")); 682 free(scp, M_DEVBUF); 683 684 mtx_lock(&seqinfo_mtx); 685 for (i = unit; i < (nseq - 1); i++) 686 seqs[i] = seqs[i + 1]; 687 nseq--; 688 mtx_unlock(&seqinfo_mtx); 689 690 return 0; 691 } 692 693 int 694 seq_modevent(module_t mod, int type, void *data) 695 { 696 int retval, r; 697 698 retval = 0; 699 700 switch (type) { 701 case MOD_LOAD: 702 mtx_init(&seqinfo_mtx, "seqmod", NULL, 0); 703 retval = seq_addunit(); 704 break; 705 706 case MOD_UNLOAD: 707 while (nseq) { 708 r = seq_delunit(nseq - 1); 709 if (r) { 710 retval = r; 711 break; 712 } 713 } 714 if (nseq == 0) { 715 retval = 0; 716 mtx_destroy(&seqinfo_mtx); 717 } 718 break; 719 720 default: 721 break; 722 } 723 724 return retval; 725 } 726 727 static int 728 seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md) 729 { 730 731 if (unit > scp->midi_number || unit < 0) 732 return EINVAL; 733 734 *md = scp->midis[unit]; 735 736 return 0; 737 } 738 739 int 740 mseq_open(struct cdev *i_dev, int flags, int mode, struct thread *td) 741 { 742 struct seq_softc *scp = i_dev->si_drv1; 743 int i; 744 745 if (scp == NULL) 746 return ENXIO; 747 748 SEQ_DEBUG(3, printf("seq_open: scp %p unit %d, flags 0x%x.\n", 749 scp, scp->unit, flags)); 750 751 /* 752 * Mark this device busy. 753 */ 754 755 mtx_lock(&scp->seq_lock); 756 if (scp->busy) { 757 mtx_unlock(&scp->seq_lock); 758 SEQ_DEBUG(2, printf("seq_open: unit %d is busy.\n", scp->unit)); 759 return EBUSY; 760 } 761 scp->fflags = flags; 762 /* 763 if ((scp->fflags & O_NONBLOCK) != 0) 764 scp->flags |= SEQ_F_NBIO; 765 */ 766 scp->music = MIDIDEV(i_dev) == SND_DEV_MUSIC; 767 768 /* 769 * Enumerate the available midi devices 770 */ 771 scp->midi_number = 0; 772 scp->maxunits = midimapper_open(scp->mapper, &scp->mapper_cookie); 773 774 if (scp->maxunits == 0) 775 SEQ_DEBUG(2, printf("seq_open: no midi devices\n")); 776 777 for (i = 0; i < scp->maxunits; i++) { 778 scp->midis[scp->midi_number] = 779 midimapper_fetch_synth(scp->mapper, scp->mapper_cookie, i); 780 if (scp->midis[scp->midi_number]) { 781 if (SYNTH_OPEN(scp->midis[scp->midi_number], scp, 782 scp->fflags) != 0) 783 scp->midis[scp->midi_number] = NULL; 784 else { 785 scp->midi_flags[scp->midi_number] = 786 SYNTH_QUERY(scp->midis[scp->midi_number]); 787 scp->midi_number++; 788 } 789 } 790 } 791 792 timer_setvals(scp, 60, 100); 793 794 timer_start(scp); 795 timer_stop(scp); 796 /* 797 * actually, if we're in rdonly mode, we should start the timer 798 */ 799 /* 800 * TODO: Handle recording now 801 */ 802 803 scp->out_water = MIDIQ_SIZE(scp->out_q) / 2; 804 805 scp->busy = 1; 806 mtx_unlock(&scp->seq_lock); 807 808 SEQ_DEBUG(2, printf("seq_open: opened, mode %s.\n", 809 scp->music ? "music" : "sequencer")); 810 SEQ_DEBUG(2, 811 printf("Sequencer %d %p opened maxunits %d midi_number %d:\n", 812 scp->unit, scp, scp->maxunits, scp->midi_number)); 813 for (i = 0; i < scp->midi_number; i++) 814 SEQ_DEBUG(3, printf(" midi %d %p\n", i, scp->midis[i])); 815 816 return 0; 817 } 818 819 /* 820 * mseq_close 821 */ 822 int 823 mseq_close(struct cdev *i_dev, int flags, int mode, struct thread *td) 824 { 825 int i; 826 struct seq_softc *scp = i_dev->si_drv1; 827 int ret; 828 829 if (scp == NULL) 830 return ENXIO; 831 832 SEQ_DEBUG(2, printf("seq_close: unit %d.\n", scp->unit)); 833 834 mtx_lock(&scp->seq_lock); 835 836 ret = ENXIO; 837 if (scp->busy == 0) 838 goto err; 839 840 seq_reset(scp); 841 seq_sync(scp); 842 843 for (i = 0; i < scp->midi_number; i++) 844 if (scp->midis[i]) 845 SYNTH_CLOSE(scp->midis[i]); 846 847 midimapper_close(scp->mapper, scp->mapper_cookie); 848 849 timer_stop(scp); 850 851 scp->busy = 0; 852 ret = 0; 853 854 err: 855 SEQ_DEBUG(3, printf("seq_close: closed ret = %d.\n", ret)); 856 mtx_unlock(&scp->seq_lock); 857 return ret; 858 } 859 860 int 861 mseq_read(struct cdev *i_dev, struct uio *uio, int ioflag) 862 { 863 int retval, used; 864 struct seq_softc *scp = i_dev->si_drv1; 865 866 #define SEQ_RSIZE 32 867 u_char buf[SEQ_RSIZE]; 868 869 if (scp == NULL) 870 return ENXIO; 871 872 SEQ_DEBUG(7, printf("mseq_read: unit %d, resid %zd.\n", 873 scp->unit, uio->uio_resid)); 874 875 mtx_lock(&scp->seq_lock); 876 if ((scp->fflags & FREAD) == 0) { 877 SEQ_DEBUG(2, printf("mseq_read: unit %d is not for reading.\n", 878 scp->unit)); 879 retval = EIO; 880 goto err1; 881 } 882 /* 883 * Begin recording. 884 */ 885 /* 886 * if ((scp->flags & SEQ_F_READING) == 0) 887 */ 888 /* 889 * TODO, start recording if not alread 890 */ 891 892 /* 893 * I think the semantics are to return as soon 894 * as possible. 895 * Second thought, it doens't seem like midimoutain 896 * expects that at all. 897 * TODO: Look up in some sort of spec 898 */ 899 900 while (uio->uio_resid > 0) { 901 while (MIDIQ_EMPTY(scp->in_q)) { 902 retval = EWOULDBLOCK; 903 /* 904 * I wish I knew which one to care about 905 */ 906 907 if (scp->fflags & O_NONBLOCK) 908 goto err1; 909 if (ioflag & O_NONBLOCK) 910 goto err1; 911 912 retval = cv_wait_sig(&scp->in_cv, &scp->seq_lock); 913 if (retval == EINTR) 914 goto err1; 915 } 916 917 used = MIN(MIDIQ_LEN(scp->in_q), uio->uio_resid); 918 used = MIN(used, SEQ_RSIZE); 919 920 SEQ_DEBUG(8, printf("midiread: uiomove cc=%d\n", used)); 921 MIDIQ_DEQ(scp->in_q, buf, used); 922 retval = uiomove(buf, used, uio); 923 if (retval) 924 goto err1; 925 } 926 927 retval = 0; 928 err1: 929 mtx_unlock(&scp->seq_lock); 930 SEQ_DEBUG(6, printf("mseq_read: ret %d, resid %zd.\n", 931 retval, uio->uio_resid)); 932 933 return retval; 934 } 935 936 int 937 mseq_write(struct cdev *i_dev, struct uio *uio, int ioflag) 938 { 939 u_char event[EV_SZ], newevent[EV_SZ], ev_code; 940 struct seq_softc *scp = i_dev->si_drv1; 941 int retval; 942 int used; 943 944 SEQ_DEBUG(7, printf("seq_write: unit %d, resid %zd.\n", 945 scp->unit, uio->uio_resid)); 946 947 if (scp == NULL) 948 return ENXIO; 949 950 mtx_lock(&scp->seq_lock); 951 952 if ((scp->fflags & FWRITE) == 0) { 953 SEQ_DEBUG(2, printf("seq_write: unit %d is not for writing.\n", 954 scp->unit)); 955 retval = EIO; 956 goto err0; 957 } 958 while (uio->uio_resid > 0) { 959 while (MIDIQ_AVAIL(scp->out_q) == 0) { 960 retval = EWOULDBLOCK; 961 if (scp->fflags & O_NONBLOCK) 962 goto err0; 963 if (ioflag & O_NONBLOCK) 964 goto err0; 965 SEQ_DEBUG(8, printf("seq_write cvwait\n")); 966 967 scp->playing = 1; 968 cv_broadcast(&scp->out_cv); 969 cv_broadcast(&scp->state_cv); 970 971 retval = cv_wait_sig(&scp->out_cv, &scp->seq_lock); 972 /* 973 * We slept, maybe things have changed since last 974 * dying check 975 */ 976 if (retval == EINTR) 977 goto err0; 978 #if 0 979 /* 980 * Useless test 981 */ 982 if (scp != i_dev->si_drv1) 983 retval = ENXIO; 984 #endif 985 } 986 987 used = MIN(uio->uio_resid, 4); 988 989 SEQ_DEBUG(8, printf("seqout: resid %zd len %jd avail %jd\n", 990 uio->uio_resid, (intmax_t)MIDIQ_LEN(scp->out_q), 991 (intmax_t)MIDIQ_AVAIL(scp->out_q))); 992 993 if (used != 4) { 994 retval = ENXIO; 995 goto err0; 996 } 997 retval = uiomove(event, used, uio); 998 if (retval) 999 goto err0; 1000 1001 ev_code = event[0]; 1002 SEQ_DEBUG(8, printf("seq_write: unit %d, event %s.\n", 1003 scp->unit, midi_cmdname(ev_code, cmdtab_seqevent))); 1004 1005 /* Have a look at the event code. */ 1006 if (ev_code == SEQ_FULLSIZE) { 1007 1008 /* 1009 * TODO: restore code for SEQ_FULLSIZE 1010 */ 1011 #if 0 1012 /* 1013 * A long event, these are the patches/samples for a 1014 * synthesizer. 1015 */ 1016 midiunit = *(u_short *)&event[2]; 1017 mtx_lock(&sd->seq_lock); 1018 ret = lookup_mididev(scp, midiunit, LOOKUP_OPEN, &md); 1019 mtx_unlock(&sd->seq_lock); 1020 if (ret != 0) 1021 return (ret); 1022 1023 SEQ_DEBUG(printf("seq_write: loading a patch to the unit %d.\n", midiunit)); 1024 1025 ret = md->synth.loadpatch(md, *(short *)&event[0], buf, 1026 p + 4, count, 0); 1027 return (ret); 1028 #else 1029 /* 1030 * For now, just flush the darn buffer 1031 */ 1032 SEQ_DEBUG(2, 1033 printf("seq_write: SEQ_FULLSIZE flusing buffer.\n")); 1034 while (uio->uio_resid > 0) { 1035 retval = uiomove(event, EV_SZ, uio); 1036 if (retval) 1037 goto err0; 1038 1039 } 1040 retval = 0; 1041 goto err0; 1042 #endif 1043 } 1044 retval = EINVAL; 1045 if (ev_code >= 128) { 1046 1047 /* 1048 * Some sort of an extended event. The size is eight 1049 * bytes. scoop extra info. 1050 */ 1051 if (scp->music && ev_code == SEQ_EXTENDED) { 1052 SEQ_DEBUG(2, printf("seq_write: invalid level two event %x.\n", ev_code)); 1053 goto err0; 1054 } 1055 if (uiomove((caddr_t)&event[4], 4, uio)) { 1056 SEQ_DEBUG(2, 1057 printf("seq_write: user memory mangled?\n")); 1058 goto err0; 1059 } 1060 } else { 1061 /* 1062 * Size four event. 1063 */ 1064 if (scp->music) { 1065 SEQ_DEBUG(2, printf("seq_write: four byte event in music mode.\n")); 1066 goto err0; 1067 } 1068 } 1069 if (ev_code == SEQ_MIDIPUTC) { 1070 /* 1071 * TODO: event[2] is unit number to receive char. 1072 * Range check it. 1073 */ 1074 } 1075 if (scp->music) { 1076 #ifdef not_ever_ever 1077 if (event[0] == EV_TIMING && 1078 (event[1] == TMR_START || event[1] == TMR_STOP)) { 1079 /* 1080 * For now, try to make midimoutain work by 1081 * forcing these events to be processed 1082 * immediatly. 1083 */ 1084 seq_processevent(scp, event); 1085 } else 1086 MIDIQ_ENQ(scp->out_q, event, EV_SZ); 1087 #else 1088 MIDIQ_ENQ(scp->out_q, event, EV_SZ); 1089 #endif 1090 } else { 1091 if (seq_convertold(event, newevent) > 0) 1092 MIDIQ_ENQ(scp->out_q, newevent, EV_SZ); 1093 #if 0 1094 else 1095 goto err0; 1096 #endif 1097 } 1098 1099 } 1100 1101 scp->playing = 1; 1102 cv_broadcast(&scp->state_cv); 1103 cv_broadcast(&scp->out_cv); 1104 1105 retval = 0; 1106 1107 err0: 1108 SEQ_DEBUG(6, 1109 printf("seq_write done: leftover buffer length %zd retval %d\n", 1110 uio->uio_resid, retval)); 1111 mtx_unlock(&scp->seq_lock); 1112 return retval; 1113 } 1114 1115 int 1116 mseq_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, 1117 struct thread *td) 1118 { 1119 int midiunit, ret, tmp; 1120 struct seq_softc *scp = i_dev->si_drv1; 1121 struct synth_info *synthinfo; 1122 struct midi_info *midiinfo; 1123 u_char event[EV_SZ]; 1124 u_char newevent[EV_SZ]; 1125 1126 kobj_t md; 1127 1128 /* 1129 * struct snd_size *sndsize; 1130 */ 1131 1132 if (scp == NULL) 1133 return ENXIO; 1134 1135 SEQ_DEBUG(6, printf("seq_ioctl: unit %d, cmd %s.\n", 1136 scp->unit, midi_cmdname(cmd, cmdtab_seqioctl))); 1137 1138 ret = 0; 1139 1140 switch (cmd) { 1141 case SNDCTL_SEQ_GETTIME: 1142 /* 1143 * ioctl needed by libtse 1144 */ 1145 mtx_lock(&scp->seq_lock); 1146 *(int *)arg = timer_now(scp); 1147 mtx_unlock(&scp->seq_lock); 1148 SEQ_DEBUG(6, printf("seq_ioctl: gettime %d.\n", *(int *)arg)); 1149 ret = 0; 1150 break; 1151 case SNDCTL_TMR_METRONOME: 1152 /* fallthrough */ 1153 case SNDCTL_TMR_SOURCE: 1154 /* 1155 * Not implemented 1156 */ 1157 ret = 0; 1158 break; 1159 case SNDCTL_TMR_TEMPO: 1160 event[1] = TMR_TEMPO; 1161 event[4] = *(int *)arg & 0xFF; 1162 event[5] = (*(int *)arg >> 8) & 0xFF; 1163 event[6] = (*(int *)arg >> 16) & 0xFF; 1164 event[7] = (*(int *)arg >> 24) & 0xFF; 1165 goto timerevent; 1166 case SNDCTL_TMR_TIMEBASE: 1167 event[1] = TMR_TIMERBASE; 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; 1172 goto timerevent; 1173 case SNDCTL_TMR_START: 1174 event[1] = TMR_START; 1175 goto timerevent; 1176 case SNDCTL_TMR_STOP: 1177 event[1] = TMR_STOP; 1178 goto timerevent; 1179 case SNDCTL_TMR_CONTINUE: 1180 event[1] = TMR_CONTINUE; 1181 timerevent: 1182 event[0] = EV_TIMING; 1183 mtx_lock(&scp->seq_lock); 1184 if (!scp->music) { 1185 ret = EINVAL; 1186 mtx_unlock(&scp->seq_lock); 1187 break; 1188 } 1189 seq_processevent(scp, event); 1190 mtx_unlock(&scp->seq_lock); 1191 break; 1192 case SNDCTL_TMR_SELECT: 1193 SEQ_DEBUG(2, 1194 printf("seq_ioctl: SNDCTL_TMR_SELECT not supported\n")); 1195 ret = EINVAL; 1196 break; 1197 case SNDCTL_SEQ_SYNC: 1198 if (mode == O_RDONLY) { 1199 ret = 0; 1200 break; 1201 } 1202 mtx_lock(&scp->seq_lock); 1203 ret = seq_sync(scp); 1204 mtx_unlock(&scp->seq_lock); 1205 break; 1206 case SNDCTL_SEQ_PANIC: 1207 /* fallthrough */ 1208 case SNDCTL_SEQ_RESET: 1209 /* 1210 * SNDCTL_SEQ_PANIC == SNDCTL_SEQ_RESET 1211 */ 1212 mtx_lock(&scp->seq_lock); 1213 seq_reset(scp); 1214 mtx_unlock(&scp->seq_lock); 1215 ret = 0; 1216 break; 1217 case SNDCTL_SEQ_TESTMIDI: 1218 mtx_lock(&scp->seq_lock); 1219 /* 1220 * TODO: SNDCTL_SEQ_TESTMIDI now means "can I write to the 1221 * device?". 1222 */ 1223 mtx_unlock(&scp->seq_lock); 1224 break; 1225 #if 0 1226 case SNDCTL_SEQ_GETINCOUNT: 1227 if (mode == O_WRONLY) 1228 *(int *)arg = 0; 1229 else { 1230 mtx_lock(&scp->seq_lock); 1231 *(int *)arg = scp->in_q.rl; 1232 mtx_unlock(&scp->seq_lock); 1233 SEQ_DEBUG(printf("seq_ioctl: incount %d.\n", 1234 *(int *)arg)); 1235 } 1236 ret = 0; 1237 break; 1238 case SNDCTL_SEQ_GETOUTCOUNT: 1239 if (mode == O_RDONLY) 1240 *(int *)arg = 0; 1241 else { 1242 mtx_lock(&scp->seq_lock); 1243 *(int *)arg = scp->out_q.fl; 1244 mtx_unlock(&scp->seq_lock); 1245 SEQ_DEBUG(printf("seq_ioctl: outcount %d.\n", 1246 *(int *)arg)); 1247 } 1248 ret = 0; 1249 break; 1250 #endif 1251 case SNDCTL_SEQ_CTRLRATE: 1252 if (*(int *)arg != 0) { 1253 ret = EINVAL; 1254 break; 1255 } 1256 mtx_lock(&scp->seq_lock); 1257 *(int *)arg = scp->timerbase; 1258 mtx_unlock(&scp->seq_lock); 1259 SEQ_DEBUG(3, printf("seq_ioctl: ctrlrate %d.\n", *(int *)arg)); 1260 ret = 0; 1261 break; 1262 /* 1263 * TODO: ioctl SNDCTL_SEQ_RESETSAMPLES 1264 */ 1265 #if 0 1266 case SNDCTL_SEQ_RESETSAMPLES: 1267 mtx_lock(&scp->seq_lock); 1268 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md); 1269 mtx_unlock(&scp->seq_lock); 1270 if (ret != 0) 1271 break; 1272 ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg, 1273 SND_DEV_MIDIN), cmd, arg, mode, td); 1274 break; 1275 #endif 1276 case SNDCTL_SEQ_NRSYNTHS: 1277 mtx_lock(&scp->seq_lock); 1278 *(int *)arg = scp->midi_number; 1279 mtx_unlock(&scp->seq_lock); 1280 SEQ_DEBUG(3, printf("seq_ioctl: synths %d.\n", *(int *)arg)); 1281 ret = 0; 1282 break; 1283 case SNDCTL_SEQ_NRMIDIS: 1284 mtx_lock(&scp->seq_lock); 1285 if (scp->music) 1286 *(int *)arg = 0; 1287 else { 1288 /* 1289 * TODO: count the numbder of devices that can WRITERAW 1290 */ 1291 *(int *)arg = scp->midi_number; 1292 } 1293 mtx_unlock(&scp->seq_lock); 1294 SEQ_DEBUG(3, printf("seq_ioctl: midis %d.\n", *(int *)arg)); 1295 ret = 0; 1296 break; 1297 /* 1298 * TODO: ioctl SNDCTL_SYNTH_MEMAVL 1299 */ 1300 #if 0 1301 case SNDCTL_SYNTH_MEMAVL: 1302 mtx_lock(&scp->seq_lock); 1303 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md); 1304 mtx_unlock(&scp->seq_lock); 1305 if (ret != 0) 1306 break; 1307 ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg, 1308 SND_DEV_MIDIN), cmd, arg, mode, td); 1309 break; 1310 #endif 1311 case SNDCTL_SEQ_OUTOFBAND: 1312 for (ret = 0; ret < EV_SZ; ret++) 1313 event[ret] = (u_char)arg[0]; 1314 1315 mtx_lock(&scp->seq_lock); 1316 if (scp->music) 1317 ret = seq_processevent(scp, event); 1318 else { 1319 if (seq_convertold(event, newevent) > 0) 1320 ret = seq_processevent(scp, newevent); 1321 else 1322 ret = EINVAL; 1323 } 1324 mtx_unlock(&scp->seq_lock); 1325 break; 1326 case SNDCTL_SYNTH_INFO: 1327 synthinfo = (struct synth_info *)arg; 1328 midiunit = synthinfo->device; 1329 mtx_lock(&scp->seq_lock); 1330 if (seq_fetch_mid(scp, midiunit, &md) == 0) { 1331 bzero(synthinfo, sizeof(*synthinfo)); 1332 synthinfo->name[0] = 'f'; 1333 synthinfo->name[1] = 'a'; 1334 synthinfo->name[2] = 'k'; 1335 synthinfo->name[3] = 'e'; 1336 synthinfo->name[4] = 's'; 1337 synthinfo->name[5] = 'y'; 1338 synthinfo->name[6] = 'n'; 1339 synthinfo->name[7] = 't'; 1340 synthinfo->name[8] = 'h'; 1341 synthinfo->device = midiunit; 1342 synthinfo->synth_type = SYNTH_TYPE_MIDI; 1343 synthinfo->capabilities = scp->midi_flags[midiunit]; 1344 ret = 0; 1345 } else 1346 ret = EINVAL; 1347 mtx_unlock(&scp->seq_lock); 1348 break; 1349 case SNDCTL_MIDI_INFO: 1350 midiinfo = (struct midi_info *)arg; 1351 midiunit = midiinfo->device; 1352 mtx_lock(&scp->seq_lock); 1353 if (seq_fetch_mid(scp, midiunit, &md) == 0) { 1354 bzero(midiinfo, sizeof(*midiinfo)); 1355 midiinfo->name[0] = 'f'; 1356 midiinfo->name[1] = 'a'; 1357 midiinfo->name[2] = 'k'; 1358 midiinfo->name[3] = 'e'; 1359 midiinfo->name[4] = 'm'; 1360 midiinfo->name[5] = 'i'; 1361 midiinfo->name[6] = 'd'; 1362 midiinfo->name[7] = 'i'; 1363 midiinfo->device = midiunit; 1364 midiinfo->capabilities = scp->midi_flags[midiunit]; 1365 /* 1366 * TODO: What devtype? 1367 */ 1368 midiinfo->dev_type = 0x01; 1369 ret = 0; 1370 } else 1371 ret = EINVAL; 1372 mtx_unlock(&scp->seq_lock); 1373 break; 1374 case SNDCTL_SEQ_THRESHOLD: 1375 mtx_lock(&scp->seq_lock); 1376 RANGE(*(int *)arg, 1, MIDIQ_SIZE(scp->out_q) - 1); 1377 scp->out_water = *(int *)arg; 1378 mtx_unlock(&scp->seq_lock); 1379 SEQ_DEBUG(3, printf("seq_ioctl: water %d.\n", *(int *)arg)); 1380 ret = 0; 1381 break; 1382 case SNDCTL_MIDI_PRETIME: 1383 tmp = *(int *)arg; 1384 if (tmp < 0) 1385 tmp = 0; 1386 mtx_lock(&scp->seq_lock); 1387 scp->pre_event_timeout = (hz * tmp) / 10; 1388 *(int *)arg = scp->pre_event_timeout; 1389 mtx_unlock(&scp->seq_lock); 1390 SEQ_DEBUG(3, printf("seq_ioctl: pretime %d.\n", *(int *)arg)); 1391 ret = 0; 1392 break; 1393 case SNDCTL_FM_4OP_ENABLE: 1394 case SNDCTL_PMGR_IFACE: 1395 case SNDCTL_PMGR_ACCESS: 1396 /* 1397 * Patch manager and fm are ded, ded, ded. 1398 */ 1399 /* fallthrough */ 1400 default: 1401 /* 1402 * TODO: Consider ioctl default case. 1403 * Old code used to 1404 * if ((scp->fflags & O_ACCMODE) == FREAD) { 1405 * ret = EIO; 1406 * break; 1407 * } 1408 * Then pass on the ioctl to device 0 1409 */ 1410 SEQ_DEBUG(2, 1411 printf("seq_ioctl: unsupported IOCTL %ld.\n", cmd)); 1412 ret = EINVAL; 1413 break; 1414 } 1415 1416 return ret; 1417 } 1418 1419 int 1420 mseq_poll(struct cdev *i_dev, int events, struct thread *td) 1421 { 1422 int ret, lim; 1423 struct seq_softc *scp = i_dev->si_drv1; 1424 1425 SEQ_DEBUG(3, printf("seq_poll: unit %d.\n", scp->unit)); 1426 SEQ_DEBUG(1, printf("seq_poll: unit %d.\n", scp->unit)); 1427 1428 mtx_lock(&scp->seq_lock); 1429 1430 ret = 0; 1431 1432 /* Look up the apropriate queue and select it. */ 1433 if ((events & (POLLOUT | POLLWRNORM)) != 0) { 1434 /* Start playing. */ 1435 scp->playing = 1; 1436 cv_broadcast(&scp->state_cv); 1437 cv_broadcast(&scp->out_cv); 1438 1439 lim = scp->out_water; 1440 1441 if (MIDIQ_AVAIL(scp->out_q) < lim) 1442 /* No enough space, record select. */ 1443 selrecord(td, &scp->out_sel); 1444 else 1445 /* We can write now. */ 1446 ret |= events & (POLLOUT | POLLWRNORM); 1447 } 1448 if ((events & (POLLIN | POLLRDNORM)) != 0) { 1449 /* TODO: Start recording. */ 1450 1451 /* Find out the boundary. */ 1452 lim = 1; 1453 if (MIDIQ_LEN(scp->in_q) < lim) 1454 /* No data ready, record select. */ 1455 selrecord(td, &scp->in_sel); 1456 else 1457 /* We can read now. */ 1458 ret |= events & (POLLIN | POLLRDNORM); 1459 } 1460 mtx_unlock(&scp->seq_lock); 1461 1462 return (ret); 1463 } 1464 1465 #if 0 1466 static void 1467 sein_qtr(void *p, void /* mididev_info */ *md) 1468 { 1469 struct seq_softc *scp; 1470 1471 scp = (struct seq_softc *)p; 1472 1473 mtx_lock(&scp->seq_lock); 1474 1475 /* Restart playing if we have the data to output. */ 1476 if (scp->queueout_pending) 1477 seq_callback(scp, SEQ_CB_START | SEQ_CB_WR); 1478 /* Check the midi device if we are reading. */ 1479 if ((scp->flags & SEQ_F_READING) != 0) 1480 seq_midiinput(scp, md); 1481 1482 mtx_unlock(&scp->seq_lock); 1483 } 1484 1485 #endif 1486 /* 1487 * seq_convertold 1488 * Was the old playevent. Use this to convert and old 1489 * style /dev/sequencer event to a /dev/music event 1490 */ 1491 static int 1492 seq_convertold(u_char *event, u_char *out) 1493 { 1494 int used; 1495 u_char dev, chn, note, vel; 1496 1497 out[0] = out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = 1498 out[7] = 0; 1499 1500 dev = 0; 1501 chn = event[1]; 1502 note = event[2]; 1503 vel = event[3]; 1504 1505 used = 0; 1506 1507 restart: 1508 /* 1509 * TODO: Debug statement 1510 */ 1511 switch (event[0]) { 1512 case EV_TIMING: 1513 case EV_CHN_VOICE: 1514 case EV_CHN_COMMON: 1515 case EV_SYSEX: 1516 case EV_SEQ_LOCAL: 1517 out[0] = event[0]; 1518 out[1] = event[1]; 1519 out[2] = event[2]; 1520 out[3] = event[3]; 1521 out[4] = event[4]; 1522 out[5] = event[5]; 1523 out[6] = event[6]; 1524 out[7] = event[7]; 1525 used += 8; 1526 break; 1527 case SEQ_NOTEOFF: 1528 out[0] = EV_CHN_VOICE; 1529 out[1] = dev; 1530 out[2] = MIDI_NOTEOFF; 1531 out[3] = chn; 1532 out[4] = note; 1533 out[5] = 255; 1534 used += 4; 1535 break; 1536 1537 case SEQ_NOTEON: 1538 out[0] = EV_CHN_VOICE; 1539 out[1] = dev; 1540 out[2] = MIDI_NOTEON; 1541 out[3] = chn; 1542 out[4] = note; 1543 out[5] = vel; 1544 used += 4; 1545 break; 1546 1547 /* 1548 * wait delay = (event[2] << 16) + (event[3] << 8) + event[4] 1549 */ 1550 1551 case SEQ_PGMCHANGE: 1552 out[0] = EV_CHN_COMMON; 1553 out[1] = dev; 1554 out[2] = MIDI_PGM_CHANGE; 1555 out[3] = chn; 1556 out[4] = note; 1557 out[5] = vel; 1558 used += 4; 1559 break; 1560 /* 1561 out[0] = EV_TIMING; 1562 out[1] = dev; 1563 out[2] = MIDI_PGM_CHANGE; 1564 out[3] = chn; 1565 out[4] = note; 1566 out[5] = vel; 1567 SEQ_DEBUG(4,printf("seq_playevent: synctimer\n")); 1568 break; 1569 */ 1570 1571 case SEQ_MIDIPUTC: 1572 SEQ_DEBUG(4, 1573 printf("seq_playevent: put data 0x%02x, unit %d.\n", 1574 event[1], event[2])); 1575 /* 1576 * Pass through to the midi device. 1577 * device = event[2] 1578 * data = event[1] 1579 */ 1580 out[0] = SEQ_MIDIPUTC; 1581 out[1] = dev; 1582 out[2] = chn; 1583 used += 4; 1584 break; 1585 #ifdef notyet 1586 case SEQ_ECHO: 1587 /* 1588 * This isn't handled here yet because I don't know if I can 1589 * just use four bytes events. There might be consequences 1590 * in the _read routing 1591 */ 1592 if (seq_copytoinput(scp, event, 4) == EAGAIN) { 1593 ret = QUEUEFULL; 1594 break; 1595 } 1596 ret = MORE; 1597 break; 1598 #endif 1599 case SEQ_EXTENDED: 1600 switch (event[1]) { 1601 case SEQ_NOTEOFF: 1602 case SEQ_NOTEON: 1603 case SEQ_PGMCHANGE: 1604 event++; 1605 used = 4; 1606 goto restart; 1607 break; 1608 case SEQ_AFTERTOUCH: 1609 /* 1610 * SYNTH_AFTERTOUCH(md, event[3], event[4]) 1611 */ 1612 case SEQ_BALANCE: 1613 /* 1614 * SYNTH_PANNING(md, event[3], (char)event[4]) 1615 */ 1616 case SEQ_CONTROLLER: 1617 /* 1618 * SYNTH_CONTROLLER(md, event[3], event[4], *(short *)&event[5]) 1619 */ 1620 case SEQ_VOLMODE: 1621 /* 1622 * SYNTH_VOLUMEMETHOD(md, event[3]) 1623 */ 1624 default: 1625 SEQ_DEBUG(2, 1626 printf("seq_convertold: SEQ_EXTENDED type %d" 1627 "not handled\n", event[1])); 1628 break; 1629 } 1630 break; 1631 case SEQ_WAIT: 1632 out[0] = EV_TIMING; 1633 out[1] = TMR_WAIT_REL; 1634 out[4] = event[2]; 1635 out[5] = event[3]; 1636 out[6] = event[4]; 1637 1638 SEQ_DEBUG(5, printf("SEQ_WAIT %d", 1639 event[2] + (event[3] << 8) + (event[4] << 24))); 1640 1641 used += 4; 1642 break; 1643 1644 case SEQ_ECHO: 1645 case SEQ_SYNCTIMER: 1646 case SEQ_PRIVATE: 1647 default: 1648 SEQ_DEBUG(2, 1649 printf("seq_convertold: event type %d not handled %d %d %d\n", 1650 event[0], event[1], event[2], event[3])); 1651 break; 1652 } 1653 return used; 1654 } 1655 1656 /* 1657 * Writting to the sequencer buffer never blocks and drops 1658 * input which cannot be queued 1659 */ 1660 void 1661 seq_copytoinput(struct seq_softc *scp, u_char *event, int len) 1662 { 1663 1664 mtx_assert(&scp->seq_lock, MA_OWNED); 1665 1666 if (MIDIQ_AVAIL(scp->in_q) < len) { 1667 /* 1668 * ENOROOM? EINPUTDROPPED? ETOUGHLUCK? 1669 */ 1670 SEQ_DEBUG(2, printf("seq_copytoinput: queue full\n")); 1671 } else { 1672 MIDIQ_ENQ(scp->in_q, event, len); 1673 selwakeup(&scp->in_sel); 1674 cv_broadcast(&scp->in_cv); 1675 } 1676 1677 } 1678 1679 static int 1680 seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event) 1681 { 1682 int ret, voice; 1683 u_char cmd, chn, note, parm; 1684 1685 ret = 0; 1686 cmd = event[2]; 1687 chn = event[3]; 1688 note = event[4]; 1689 parm = event[5]; 1690 1691 mtx_assert(&scp->seq_lock, MA_OWNED); 1692 1693 SEQ_DEBUG(5, printf("seq_chnvoice: unit %d, dev %d, cmd %s," 1694 " chn %d, note %d, parm %d.\n", scp->unit, event[1], 1695 midi_cmdname(cmd, cmdtab_seqcv), chn, note, parm)); 1696 1697 voice = SYNTH_ALLOC(md, chn, note); 1698 1699 mtx_unlock(&scp->seq_lock); 1700 1701 switch (cmd) { 1702 case MIDI_NOTEON: 1703 if (note < 128 || note == 255) { 1704 #if 0 1705 if (scp->music && chn == 9) { 1706 /* 1707 * This channel is a percussion. The note 1708 * number is the patch number. 1709 */ 1710 /* 1711 mtx_unlock(&scp->seq_lock); 1712 if (SYNTH_SETINSTR(md, voice, 128 + note) 1713 == EAGAIN) { 1714 mtx_lock(&scp->seq_lock); 1715 return (QUEUEFULL); 1716 } 1717 mtx_lock(&scp->seq_lock); 1718 */ 1719 note = 60; /* Middle C. */ 1720 } 1721 #endif 1722 if (scp->music) { 1723 /* 1724 mtx_unlock(&scp->seq_lock); 1725 if (SYNTH_SETUPVOICE(md, voice, chn) 1726 == EAGAIN) { 1727 mtx_lock(&scp->seq_lock); 1728 return (QUEUEFULL); 1729 } 1730 mtx_lock(&scp->seq_lock); 1731 */ 1732 } 1733 SYNTH_STARTNOTE(md, voice, note, parm); 1734 } 1735 break; 1736 case MIDI_NOTEOFF: 1737 SYNTH_KILLNOTE(md, voice, note, parm); 1738 break; 1739 case MIDI_KEY_PRESSURE: 1740 SYNTH_AFTERTOUCH(md, voice, parm); 1741 break; 1742 default: 1743 ret = 1; 1744 SEQ_DEBUG(2, printf("seq_chnvoice event type %d not handled\n", 1745 event[1])); 1746 break; 1747 } 1748 1749 mtx_lock(&scp->seq_lock); 1750 return ret; 1751 } 1752 1753 static int 1754 seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event) 1755 { 1756 int ret; 1757 u_short w14; 1758 u_char cmd, chn, p1; 1759 1760 ret = 0; 1761 cmd = event[2]; 1762 chn = event[3]; 1763 p1 = event[4]; 1764 w14 = *(u_short *)&event[6]; 1765 1766 SEQ_DEBUG(5, printf("seq_chncommon: unit %d, dev %d, cmd %s, chn %d," 1767 " p1 %d, w14 %d.\n", scp->unit, event[1], 1768 midi_cmdname(cmd, cmdtab_seqccmn), chn, p1, w14)); 1769 mtx_unlock(&scp->seq_lock); 1770 switch (cmd) { 1771 case MIDI_PGM_CHANGE: 1772 SEQ_DEBUG(4, printf("seq_chncommon pgmchn chn %d pg %d\n", 1773 chn, p1)); 1774 SYNTH_SETINSTR(md, chn, p1); 1775 break; 1776 case MIDI_CTL_CHANGE: 1777 SEQ_DEBUG(4, printf("seq_chncommon ctlch chn %d pg %d %d\n", 1778 chn, p1, w14)); 1779 SYNTH_CONTROLLER(md, chn, p1, w14); 1780 break; 1781 case MIDI_PITCH_BEND: 1782 if (scp->music) { 1783 /* 1784 * TODO: MIDI_PITCH_BEND 1785 */ 1786 #if 0 1787 mtx_lock(&md->synth.vc_mtx); 1788 md->synth.chn_info[chn].bender_value = w14; 1789 if (md->midiunit >= 0) { 1790 /* 1791 * Handle all of the notes playing on this 1792 * channel. 1793 */ 1794 key = ((int)chn << 8); 1795 for (i = 0; i < md->synth.alloc.max_voice; i++) 1796 if ((md->synth.alloc.map[i] & 0xff00) == key) { 1797 mtx_unlock(&md->synth.vc_mtx); 1798 mtx_unlock(&scp->seq_lock); 1799 if (md->synth.bender(md, i, w14) == EAGAIN) { 1800 mtx_lock(&scp->seq_lock); 1801 return (QUEUEFULL); 1802 } 1803 mtx_lock(&scp->seq_lock); 1804 } 1805 } else { 1806 mtx_unlock(&md->synth.vc_mtx); 1807 mtx_unlock(&scp->seq_lock); 1808 if (md->synth.bender(md, chn, w14) == EAGAIN) { 1809 mtx_lock(&scp->seq_lock); 1810 return (QUEUEFULL); 1811 } 1812 mtx_lock(&scp->seq_lock); 1813 } 1814 #endif 1815 } else 1816 SYNTH_BENDER(md, chn, w14); 1817 break; 1818 default: 1819 ret = 1; 1820 SEQ_DEBUG(2, 1821 printf("seq_chncommon event type %d not handled.\n", 1822 event[1])); 1823 break; 1824 1825 } 1826 mtx_lock(&scp->seq_lock); 1827 return ret; 1828 } 1829 1830 static int 1831 seq_timing(struct seq_softc *scp, u_char *event) 1832 { 1833 int param; 1834 int ret; 1835 1836 ret = 0; 1837 param = event[4] + (event[5] << 8) + 1838 (event[6] << 16) + (event[7] << 24); 1839 1840 SEQ_DEBUG(5, printf("seq_timing: unit %d, cmd %d, param %d.\n", 1841 scp->unit, event[1], param)); 1842 switch (event[1]) { 1843 case TMR_WAIT_REL: 1844 timer_wait(scp, param, 0); 1845 break; 1846 case TMR_WAIT_ABS: 1847 timer_wait(scp, param, 1); 1848 break; 1849 case TMR_START: 1850 timer_start(scp); 1851 cv_broadcast(&scp->reset_cv); 1852 break; 1853 case TMR_STOP: 1854 timer_stop(scp); 1855 /* 1856 * The following cv_broadcast isn't needed since we only 1857 * wait for 0->1 transitions. It probably won't hurt 1858 */ 1859 cv_broadcast(&scp->reset_cv); 1860 break; 1861 case TMR_CONTINUE: 1862 timer_continue(scp); 1863 cv_broadcast(&scp->reset_cv); 1864 break; 1865 case TMR_TEMPO: 1866 if (param < 8) 1867 param = 8; 1868 if (param > 360) 1869 param = 360; 1870 SEQ_DEBUG(4, printf("Timer set tempo %d\n", param)); 1871 timer_setvals(scp, param, scp->timerbase); 1872 break; 1873 case TMR_TIMERBASE: 1874 if (param < 1) 1875 param = 1; 1876 if (param > 1000) 1877 param = 1000; 1878 SEQ_DEBUG(4, printf("Timer set timerbase %d\n", param)); 1879 timer_setvals(scp, scp->tempo, param); 1880 break; 1881 case TMR_ECHO: 1882 /* 1883 * TODO: Consider making 4-byte events for /dev/sequencer 1884 * PRO: Maybe needed by legacy apps 1885 * CON: soundcard.h has been warning for a while many years 1886 * to expect 8 byte events. 1887 */ 1888 #if 0 1889 if (scp->music) 1890 seq_copytoinput(scp, event, 8); 1891 else { 1892 param = (param << 8 | SEQ_ECHO); 1893 seq_copytoinput(scp, (u_char *)¶m, 4); 1894 } 1895 #else 1896 seq_copytoinput(scp, event, 8); 1897 #endif 1898 break; 1899 default: 1900 SEQ_DEBUG(2, printf("seq_timing event type %d not handled.\n", 1901 event[1])); 1902 ret = 1; 1903 break; 1904 } 1905 return ret; 1906 } 1907 1908 static int 1909 seq_local(struct seq_softc *scp, u_char *event) 1910 { 1911 int ret; 1912 1913 ret = 0; 1914 mtx_assert(&scp->seq_lock, MA_OWNED); 1915 1916 SEQ_DEBUG(5, printf("seq_local: unit %d, cmd %d\n", scp->unit, 1917 event[1])); 1918 switch (event[1]) { 1919 default: 1920 SEQ_DEBUG(1, printf("seq_local event type %d not handled\n", 1921 event[1])); 1922 ret = 1; 1923 break; 1924 } 1925 return ret; 1926 } 1927 1928 static int 1929 seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event) 1930 { 1931 int i, l; 1932 1933 mtx_assert(&scp->seq_lock, MA_OWNED); 1934 SEQ_DEBUG(5, printf("seq_sysex: unit %d device %d\n", scp->unit, 1935 event[1])); 1936 l = 0; 1937 for (i = 0; i < 6 && event[i + 2] != 0xff; i++) 1938 l = i + 1; 1939 if (l > 0) { 1940 mtx_unlock(&scp->seq_lock); 1941 if (SYNTH_SENDSYSEX(md, &event[2], l) == EAGAIN) { 1942 mtx_lock(&scp->seq_lock); 1943 return 1; 1944 } 1945 mtx_lock(&scp->seq_lock); 1946 } 1947 return 0; 1948 } 1949 1950 /* 1951 * Reset no longer closes the raw devices nor seq_sync's 1952 * Callers are IOCTL and seq_close 1953 */ 1954 static void 1955 seq_reset(struct seq_softc *scp) 1956 { 1957 int chn, i; 1958 kobj_t m; 1959 1960 mtx_assert(&scp->seq_lock, MA_OWNED); 1961 1962 SEQ_DEBUG(5, printf("seq_reset: unit %d.\n", scp->unit)); 1963 1964 /* 1965 * Stop reading and writing. 1966 */ 1967 1968 /* scp->recording = 0; */ 1969 scp->playing = 0; 1970 cv_broadcast(&scp->state_cv); 1971 cv_broadcast(&scp->out_cv); 1972 cv_broadcast(&scp->reset_cv); 1973 1974 /* 1975 * For now, don't reset the timers. 1976 */ 1977 MIDIQ_CLEAR(scp->in_q); 1978 MIDIQ_CLEAR(scp->out_q); 1979 1980 for (i = 0; i < scp->midi_number; i++) { 1981 m = scp->midis[i]; 1982 mtx_unlock(&scp->seq_lock); 1983 SYNTH_RESET(m); 1984 for (chn = 0; chn < 16; chn++) { 1985 SYNTH_CONTROLLER(m, chn, 123, 0); 1986 SYNTH_CONTROLLER(m, chn, 121, 0); 1987 SYNTH_BENDER(m, chn, 1 << 13); 1988 } 1989 mtx_lock(&scp->seq_lock); 1990 } 1991 } 1992 1993 /* 1994 * seq_sync 1995 * *really* flush the output queue 1996 * flush the event queue, then flush the synthsisers. 1997 * Callers are IOCTL and close 1998 */ 1999 2000 #define SEQ_SYNC_TIMEOUT 8 2001 static int 2002 seq_sync(struct seq_softc *scp) 2003 { 2004 int i, rl, sync[16], done; 2005 2006 mtx_assert(&scp->seq_lock, MA_OWNED); 2007 2008 SEQ_DEBUG(4, printf("seq_sync: unit %d.\n", scp->unit)); 2009 2010 /* 2011 * Wait until output queue is empty. Check every so often to see if 2012 * the queue is moving along. If it isn't just abort. 2013 */ 2014 while (!MIDIQ_EMPTY(scp->out_q)) { 2015 2016 if (!scp->playing) { 2017 scp->playing = 1; 2018 cv_broadcast(&scp->state_cv); 2019 cv_broadcast(&scp->out_cv); 2020 } 2021 rl = MIDIQ_LEN(scp->out_q); 2022 2023 i = cv_timedwait_sig(&scp->out_cv, 2024 &scp->seq_lock, SEQ_SYNC_TIMEOUT * hz); 2025 2026 if (i == EINTR || i == ERESTART) { 2027 if (i == EINTR) { 2028 /* 2029 * XXX: I don't know why we stop playing 2030 */ 2031 scp->playing = 0; 2032 cv_broadcast(&scp->out_cv); 2033 } 2034 return i; 2035 } 2036 if (i == EWOULDBLOCK && rl == MIDIQ_LEN(scp->out_q) && 2037 scp->waiting == 0) { 2038 /* 2039 * A queue seems to be stuck up. Give up and clear 2040 * queues. 2041 */ 2042 MIDIQ_CLEAR(scp->out_q); 2043 scp->playing = 0; 2044 cv_broadcast(&scp->state_cv); 2045 cv_broadcast(&scp->out_cv); 2046 cv_broadcast(&scp->reset_cv); 2047 2048 /* 2049 * TODO: Consider if the raw devices need to be flushed 2050 */ 2051 2052 SEQ_DEBUG(1, printf("seq_sync queue stuck, aborting\n")); 2053 2054 return i; 2055 } 2056 } 2057 2058 scp->playing = 0; 2059 /* 2060 * Since syncing a midi device might block, unlock scp->seq_lock. 2061 */ 2062 2063 mtx_unlock(&scp->seq_lock); 2064 for (i = 0; i < scp->midi_number; i++) 2065 sync[i] = 1; 2066 2067 do { 2068 done = 1; 2069 for (i = 0; i < scp->midi_number; i++) 2070 if (sync[i]) { 2071 if (SYNTH_INSYNC(scp->midis[i]) == 0) 2072 sync[i] = 0; 2073 else 2074 done = 0; 2075 } 2076 if (!done) 2077 DELAY(5000); 2078 2079 } while (!done); 2080 2081 mtx_lock(&scp->seq_lock); 2082 return 0; 2083 } 2084 2085 char * 2086 midi_cmdname(int cmd, midi_cmdtab *tab) 2087 { 2088 while (tab->name != NULL) { 2089 if (cmd == tab->cmd) 2090 return (tab->name); 2091 tab++; 2092 } 2093 2094 return ("unknown"); 2095 } 2096