Lines Matching full:scp

280  * static void seq_midiinput(struct seq_softc * scp, void *md);
282 static void seq_reset(struct seq_softc *scp);
283 static int seq_sync(struct seq_softc *scp);
285 static int seq_processevent(struct seq_softc *scp, u_char *event);
287 static int seq_timing(struct seq_softc *scp, u_char *event);
288 static int seq_local(struct seq_softc *scp, u_char *event);
290 static int seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event);
291 static int seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event);
292 static int seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event);
294 static int seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md);
295 void seq_copytoinput(struct seq_softc *scp, u_char *event, int len);
430 struct seq_softc *scp = arg;
433 mtx_lock(&scp->seq_lock);
435 while (scp->done == 0) {
437 while (scp->playing == 0) {
438 cv_wait(&scp->state_cv, &scp->seq_lock);
439 if (scp->done)
443 while (MIDIQ_EMPTY(scp->out_q)) {
444 cv_broadcast(&scp->empty_cv);
445 cv_wait(&scp->out_cv, &scp->seq_lock);
446 if (scp->playing == 0)
448 if (scp->done)
452 MIDIQ_DEQ(scp->out_q, event, EV_SZ);
454 if (MIDIQ_AVAIL(scp->out_q) < scp->out_water) {
455 cv_broadcast(&scp->out_cv);
456 selwakeup(&scp->out_sel);
458 seq_processevent(scp, event);
462 cv_broadcast(&scp->th_cv);
463 mtx_unlock(&scp->seq_lock);
473 seq_processevent(struct seq_softc *scp, u_char *event)
481 ret = seq_local(scp, event);
483 ret = seq_timing(scp, event);
491 } else if (seq_fetch_mid(scp, event[1], &m) != 0) {
498 ret = seq_chnvoice(scp, m, event);
501 ret = seq_chncommon(scp, m, event);
504 ret = seq_sysex(scp, m, event);
507 mtx_unlock(&scp->seq_lock);
509 mtx_lock(&scp->seq_lock);
518 struct seq_softc *scp;
524 scp = malloc(sizeof(*scp), M_DEVBUF, M_NOWAIT | M_ZERO);
525 if (scp == NULL) {
529 kobj_init((kobj_t)scp, &sequencer_class);
534 MIDIQ_INIT(scp->in_q, buf, EV_SZ * 1024);
538 MIDIQ_INIT(scp->out_q, buf, EV_SZ * 1024);
541 scp->midis = malloc(sizeof(kobj_t) * 32, M_TEMP, M_NOWAIT | M_ZERO);
542 scp->midi_flags = malloc(sizeof(*scp->midi_flags) * 32, M_TEMP,
545 if (scp->midis == NULL || scp->midi_flags == NULL)
548 scp->flags = 0;
550 mtx_init(&scp->seq_lock, "seqflq", NULL, 0);
551 cv_init(&scp->state_cv, "seqstate");
552 cv_init(&scp->empty_cv, "seqempty");
553 cv_init(&scp->reset_cv, "seqtimer");
554 cv_init(&scp->out_cv, "seqqout");
555 cv_init(&scp->in_cv, "seqqin");
556 cv_init(&scp->th_cv, "seqstart");
562 scp->mapper = midimapper_addseq(scp, &scp->unit, &scp->mapper_cookie);
563 if (scp->mapper == NULL)
566 scp->seqdev = make_dev(&seq_cdevsw, SND_DEV_SEQ, UID_ROOT, GID_WHEEL,
567 0666, "sequencer%d", scp->unit);
569 scp->musicdev = make_dev(&seq_cdevsw, SND_DEV_MUSIC, UID_ROOT,
570 GID_WHEEL, 0666, "music%d", scp->unit);
572 if (scp->seqdev == NULL || scp->musicdev == NULL)
580 (seq_eventthread, scp, NULL, RFHIGHPID, 0,
581 "sequencer %02d", scp->unit);
586 scp->seqdev->si_drv1 = scp->musicdev->si_drv1 = scp;
588 SEQ_DEBUG(2, printf("sequencer %d created scp %p\n", scp->unit, scp));
593 seqs[nseq++] = scp;
599 if (scp != NULL) {
600 if (scp->seqdev != NULL)
601 destroy_dev(scp->seqdev);
602 if (scp->musicdev != NULL)
603 destroy_dev(scp->musicdev);
607 if (scp->midis != NULL)
608 free(scp->midis, M_TEMP);
609 if (scp->midi_flags != NULL)
610 free(scp->midi_flags, M_TEMP);
611 if (scp->out_q.b)
612 free(scp->out_q.b, M_TEMP);
613 if (scp->in_q.b)
614 free(scp->in_q.b, M_TEMP);
615 free(scp, M_DEVBUF);
624 struct seq_softc *scp = seqs[unit];
629 mtx_lock(&scp->seq_lock);
631 scp->playing = 0;
632 scp->done = 1;
633 cv_broadcast(&scp->out_cv);
634 cv_broadcast(&scp->state_cv);
635 cv_broadcast(&scp->reset_cv);
637 cv_wait(&scp->th_cv, &scp->seq_lock);
639 mtx_unlock(&scp->seq_lock);
642 cv_destroy(&scp->state_cv);
644 cv_destroy(&scp->empty_cv);
646 cv_destroy(&scp->reset_cv);
648 cv_destroy(&scp->out_cv);
650 cv_destroy(&scp->in_cv);
652 cv_destroy(&scp->th_cv);
655 if (scp->seqdev)
656 destroy_dev(scp->seqdev);
658 if (scp->musicdev)
659 destroy_dev(scp->musicdev);
661 scp->seqdev = scp->musicdev = NULL;
662 if (scp->midis != NULL)
663 free(scp->midis, M_TEMP);
665 if (scp->midi_flags != NULL)
666 free(scp->midi_flags, M_TEMP);
668 free(scp->out_q.b, M_TEMP);
670 free(scp->in_q.b, M_TEMP);
674 mtx_destroy(&scp->seq_lock);
676 free(scp, M_DEVBUF);
722 seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md)
725 if (unit >= scp->midi_number || unit < 0)
728 *md = scp->midis[unit];
736 struct seq_softc *scp = i_dev->si_drv1;
739 if (scp == NULL)
742 SEQ_DEBUG(3, printf("seq_open: scp %p unit %d, flags 0x%x.\n",
743 scp, scp->unit, flags));
750 mtx_lock(&scp->seq_lock);
751 if (scp->busy) {
752 mtx_unlock(&scp->seq_lock);
754 SEQ_DEBUG(2, printf("seq_open: unit %d is busy.\n", scp->unit));
757 scp->fflags = flags;
759 if ((scp->fflags & O_NONBLOCK) != 0)
760 scp->flags |= SEQ_F_NBIO;
762 scp->music = MIDIDEV(i_dev) == SND_DEV_MUSIC;
767 scp->midi_number = 0;
768 scp->maxunits = midimapper_open_locked(scp->mapper, &scp->mapper_cookie);
770 if (scp->maxunits == 0)
773 for (i = 0; i < scp->maxunits; i++) {
774 scp->midis[scp->midi_number] =
775 midimapper_fetch_synth_locked(scp->mapper,
776 scp->mapper_cookie, i);
777 if (scp->midis[scp->midi_number]) {
778 if (SYNTH_OPEN(scp->midis[scp->midi_number], scp,
779 scp->fflags) != 0)
780 scp->midis[scp->midi_number] = NULL;
782 scp->midi_flags[scp->midi_number] =
783 SYNTH_QUERY(scp->midis[scp->midi_number]);
784 scp->midi_number++;
790 timer_setvals(scp, 60, 100);
792 timer_start(scp);
793 timer_stop(scp);
801 scp->out_water = MIDIQ_SIZE(scp->out_q) / 2;
803 scp->busy = 1;
804 mtx_unlock(&scp->seq_lock);
807 scp->music ? "music" : "sequencer"));
810 scp->unit, scp, scp->maxunits, scp->midi_number));
811 for (i = 0; i < scp->midi_number; i++)
812 SEQ_DEBUG(3, printf(" midi %d %p\n", i, scp->midis[i]));
824 struct seq_softc *scp = i_dev->si_drv1;
827 if (scp == NULL)
830 SEQ_DEBUG(2, printf("seq_close: unit %d.\n", scp->unit));
832 mtx_lock(&scp->seq_lock);
835 if (scp->busy == 0)
838 seq_reset(scp);
839 seq_sync(scp);
841 for (i = 0; i < scp->midi_number; i++)
842 if (scp->midis[i])
843 SYNTH_CLOSE(scp->midis[i]);
845 midimapper_close(scp->mapper, scp->mapper_cookie);
847 timer_stop(scp);
849 scp->busy = 0;
854 mtx_unlock(&scp->seq_lock);
862 struct seq_softc *scp = i_dev->si_drv1;
867 if (scp == NULL)
871 scp->unit, uio->uio_resid));
873 mtx_lock(&scp->seq_lock);
874 if ((scp->fflags & FREAD) == 0) {
876 scp->unit));
884 * if ((scp->flags & SEQ_F_READING) == 0)
899 while (MIDIQ_EMPTY(scp->in_q)) {
905 if (scp->fflags & O_NONBLOCK)
910 retval = cv_wait_sig(&scp->in_cv, &scp->seq_lock);
915 used = MIN(MIDIQ_LEN(scp->in_q), uio->uio_resid);
919 MIDIQ_DEQ(scp->in_q, buf, used);
920 mtx_unlock(&scp->seq_lock);
922 mtx_lock(&scp->seq_lock);
929 mtx_unlock(&scp->seq_lock);
940 struct seq_softc *scp = i_dev->si_drv1;
945 scp->unit, uio->uio_resid));
947 if (scp == NULL)
950 mtx_lock(&scp->seq_lock);
952 if ((scp->fflags & FWRITE) == 0) {
954 scp->unit));
959 while (MIDIQ_AVAIL(scp->out_q) == 0) {
961 if (scp->fflags & O_NONBLOCK)
967 scp->playing = 1;
968 cv_broadcast(&scp->out_cv);
969 cv_broadcast(&scp->state_cv);
971 retval = cv_wait_sig(&scp->out_cv, &scp->seq_lock);
982 if (scp != i_dev->si_drv1)
990 uio->uio_resid, (intmax_t)MIDIQ_LEN(scp->out_q),
991 (intmax_t)MIDIQ_AVAIL(scp->out_q)));
997 mtx_unlock(&scp->seq_lock);
999 mtx_lock(&scp->seq_lock);
1005 scp->unit, midi_cmdname(ev_code, cmdtab_seqevent)));
1019 ret = lookup_mididev(scp, midiunit, LOOKUP_OPEN, &md);
1036 mtx_unlock(&scp->seq_lock);
1038 mtx_lock(&scp->seq_lock);
1054 if (scp->music && ev_code == SEQ_EXTENDED) {
1058 mtx_unlock(&scp->seq_lock);
1063 mtx_lock(&scp->seq_lock);
1073 if (scp->music) {
1084 if (scp->music) {
1093 seq_processevent(scp, event);
1095 MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1097 MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1101 MIDIQ_ENQ(scp->out_q, newevent, EV_SZ);
1109 scp->playing = 1;
1110 cv_broadcast(&scp->state_cv);
1111 cv_broadcast(&scp->out_cv);
1119 mtx_unlock(&scp->seq_lock);
1128 struct seq_softc *scp = i_dev->si_drv1;
1140 if (scp == NULL)
1144 scp->unit, midi_cmdname(cmd, cmdtab_seqioctl)));
1153 mtx_lock(&scp->seq_lock);
1154 *(int *)arg = timer_now(scp);
1155 mtx_unlock(&scp->seq_lock);
1191 mtx_lock(&scp->seq_lock);
1192 if (!scp->music) {
1194 mtx_unlock(&scp->seq_lock);
1197 seq_processevent(scp, event);
1198 mtx_unlock(&scp->seq_lock);
1210 mtx_lock(&scp->seq_lock);
1211 ret = seq_sync(scp);
1212 mtx_unlock(&scp->seq_lock);
1220 mtx_lock(&scp->seq_lock);
1221 seq_reset(scp);
1222 mtx_unlock(&scp->seq_lock);
1226 mtx_lock(&scp->seq_lock);
1231 mtx_unlock(&scp->seq_lock);
1238 mtx_lock(&scp->seq_lock);
1239 *(int *)arg = scp->in_q.rl;
1240 mtx_unlock(&scp->seq_lock);
1250 mtx_lock(&scp->seq_lock);
1251 *(int *)arg = scp->out_q.fl;
1252 mtx_unlock(&scp->seq_lock);
1264 mtx_lock(&scp->seq_lock);
1265 *(int *)arg = scp->timerbase;
1266 mtx_unlock(&scp->seq_lock);
1275 mtx_lock(&scp->seq_lock);
1276 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1277 mtx_unlock(&scp->seq_lock);
1285 mtx_lock(&scp->seq_lock);
1286 *(int *)arg = scp->midi_number;
1287 mtx_unlock(&scp->seq_lock);
1292 mtx_lock(&scp->seq_lock);
1293 if (scp->music)
1299 *(int *)arg = scp->midi_number;
1301 mtx_unlock(&scp->seq_lock);
1310 mtx_lock(&scp->seq_lock);
1311 ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1312 mtx_unlock(&scp->seq_lock);
1323 mtx_lock(&scp->seq_lock);
1324 if (scp->music)
1325 ret = seq_processevent(scp, event);
1328 ret = seq_processevent(scp, newevent);
1332 mtx_unlock(&scp->seq_lock);
1337 mtx_lock(&scp->seq_lock);
1338 if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1351 synthinfo->capabilities = scp->midi_flags[midiunit];
1355 mtx_unlock(&scp->seq_lock);
1360 mtx_lock(&scp->seq_lock);
1361 if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1372 midiinfo->capabilities = scp->midi_flags[midiunit];
1380 mtx_unlock(&scp->seq_lock);
1383 mtx_lock(&scp->seq_lock);
1384 RANGE(*(int *)arg, 1, MIDIQ_SIZE(scp->out_q) - 1);
1385 scp->out_water = *(int *)arg;
1386 mtx_unlock(&scp->seq_lock);
1394 mtx_lock(&scp->seq_lock);
1395 scp->pre_event_timeout = (hz * tmp) / 10;
1396 *(int *)arg = scp->pre_event_timeout;
1397 mtx_unlock(&scp->seq_lock);
1412 * if ((scp->fflags & O_ACCMODE) == FREAD) {
1431 struct seq_softc *scp = i_dev->si_drv1;
1433 SEQ_DEBUG(3, printf("seq_poll: unit %d.\n", scp->unit));
1434 SEQ_DEBUG(1, printf("seq_poll: unit %d.\n", scp->unit));
1436 mtx_lock(&scp->seq_lock);
1443 scp->playing = 1;
1444 cv_broadcast(&scp->state_cv);
1445 cv_broadcast(&scp->out_cv);
1447 lim = scp->out_water;
1449 if (MIDIQ_AVAIL(scp->out_q) < lim)
1451 selrecord(td, &scp->out_sel);
1461 if (MIDIQ_LEN(scp->in_q) < lim)
1463 selrecord(td, &scp->in_sel);
1468 mtx_unlock(&scp->seq_lock);
1477 struct seq_softc *scp;
1479 scp = (struct seq_softc *)p;
1481 mtx_lock(&scp->seq_lock);
1484 if (scp->queueout_pending)
1485 seq_callback(scp, SEQ_CB_START | SEQ_CB_WR);
1487 if ((scp->flags & SEQ_F_READING) != 0)
1488 seq_midiinput(scp, md);
1490 mtx_unlock(&scp->seq_lock);
1600 if (seq_copytoinput(scp, event, 4) == EAGAIN) {
1669 seq_copytoinput(struct seq_softc *scp, u_char *event, int len)
1672 mtx_assert(&scp->seq_lock, MA_OWNED);
1674 if (MIDIQ_AVAIL(scp->in_q) < len) {
1680 MIDIQ_ENQ(scp->in_q, event, len);
1681 selwakeup(&scp->in_sel);
1682 cv_broadcast(&scp->in_cv);
1688 seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event)
1699 mtx_assert(&scp->seq_lock, MA_OWNED);
1702 " chn %d, note %d, parm %d.\n", scp->unit, event[1],
1707 mtx_unlock(&scp->seq_lock);
1713 if (scp->music && chn == 9) {
1719 mtx_unlock(&scp->seq_lock);
1722 mtx_lock(&scp->seq_lock);
1725 mtx_lock(&scp->seq_lock);
1730 if (scp->music) {
1732 mtx_unlock(&scp->seq_lock);
1735 mtx_lock(&scp->seq_lock);
1738 mtx_lock(&scp->seq_lock);
1757 mtx_lock(&scp->seq_lock);
1762 seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event)
1775 " p1 %d, w14 %d.\n", scp->unit, event[1],
1777 mtx_unlock(&scp->seq_lock);
1790 if (scp->music) {
1806 mtx_unlock(&scp->seq_lock);
1808 mtx_lock(&scp->seq_lock);
1811 mtx_lock(&scp->seq_lock);
1815 mtx_unlock(&scp->seq_lock);
1817 mtx_lock(&scp->seq_lock);
1820 mtx_lock(&scp->seq_lock);
1833 mtx_lock(&scp->seq_lock);
1838 seq_timing(struct seq_softc *scp, u_char *event)
1848 scp->unit, event[1], param));
1851 timer_wait(scp, param, 0);
1854 timer_wait(scp, param, 1);
1857 timer_start(scp);
1858 cv_broadcast(&scp->reset_cv);
1861 timer_stop(scp);
1866 cv_broadcast(&scp->reset_cv);
1869 timer_continue(scp);
1870 cv_broadcast(&scp->reset_cv);
1878 timer_setvals(scp, param, scp->timerbase);
1886 timer_setvals(scp, scp->tempo, param);
1896 if (scp->music)
1897 seq_copytoinput(scp, event, 8);
1900 seq_copytoinput(scp, (u_char *)&param, 4);
1903 seq_copytoinput(scp, event, 8);
1916 seq_local(struct seq_softc *scp, u_char *event)
1921 mtx_assert(&scp->seq_lock, MA_OWNED);
1923 SEQ_DEBUG(5, printf("seq_local: unit %d, cmd %d\n", scp->unit,
1936 seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event)
1940 mtx_assert(&scp->seq_lock, MA_OWNED);
1941 SEQ_DEBUG(5, printf("seq_sysex: unit %d device %d\n", scp->unit,
1947 mtx_unlock(&scp->seq_lock);
1949 mtx_lock(&scp->seq_lock);
1952 mtx_lock(&scp->seq_lock);
1962 seq_reset(struct seq_softc *scp)
1967 mtx_assert(&scp->seq_lock, MA_OWNED);
1969 SEQ_DEBUG(5, printf("seq_reset: unit %d.\n", scp->unit));
1975 /* scp->recording = 0; */
1976 scp->playing = 0;
1977 cv_broadcast(&scp->state_cv);
1978 cv_broadcast(&scp->out_cv);
1979 cv_broadcast(&scp->reset_cv);
1984 MIDIQ_CLEAR(scp->in_q);
1985 MIDIQ_CLEAR(scp->out_q);
1987 for (i = 0; i < scp->midi_number; i++) {
1988 m = scp->midis[i];
1989 mtx_unlock(&scp->seq_lock);
1996 mtx_lock(&scp->seq_lock);
2009 seq_sync(struct seq_softc *scp)
2013 mtx_assert(&scp->seq_lock, MA_OWNED);
2015 SEQ_DEBUG(4, printf("seq_sync: unit %d.\n", scp->unit));
2021 while (!MIDIQ_EMPTY(scp->out_q)) {
2022 if (!scp->playing) {
2023 scp->playing = 1;
2024 cv_broadcast(&scp->state_cv);
2025 cv_broadcast(&scp->out_cv);
2027 rl = MIDIQ_LEN(scp->out_q);
2029 i = cv_timedwait_sig(&scp->out_cv,
2030 &scp->seq_lock, SEQ_SYNC_TIMEOUT * hz);
2037 scp->playing = 0;
2038 cv_broadcast(&scp->out_cv);
2042 if (i == EWOULDBLOCK && rl == MIDIQ_LEN(scp->out_q) &&
2043 scp->waiting == 0) {
2048 MIDIQ_CLEAR(scp->out_q);
2049 scp->playing = 0;
2050 cv_broadcast(&scp->state_cv);
2051 cv_broadcast(&scp->out_cv);
2052 cv_broadcast(&scp->reset_cv);
2064 scp->playing = 0;
2066 * Since syncing a midi device might block, unlock scp->seq_lock.
2069 mtx_unlock(&scp->seq_lock);
2070 for (i = 0; i < scp->midi_number; i++)
2075 for (i = 0; i < scp->midi_number; i++)
2077 if (SYNTH_INSYNC(scp->midis[i]) == 0)
2087 mtx_lock(&scp->seq_lock);