=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sndiod/opt.c,v retrieving revision 1.6 retrieving revision 1.7 diff -c -r1.6 -r1.7 *** src/usr.bin/sndiod/opt.c 2021/01/29 11:25:05 1.6 --- src/usr.bin/sndiod/opt.c 2021/03/03 10:13:06 1.7 *************** *** 1,4 **** ! /* $OpenBSD: opt.c,v 1.6 2021/01/29 11:25:05 ratchov Exp $ */ /* * Copyright (c) 2008-2011 Alexandre Ratchov * --- 1,4 ---- ! /* $OpenBSD: opt.c,v 1.7 2021/03/03 10:13:06 ratchov Exp $ */ /* * Copyright (c) 2008-2011 Alexandre Ratchov * *************** *** 17,27 **** --- 17,170 ---- #include #include "dev.h" + #include "midi.h" #include "opt.h" + #include "sysex.h" #include "utils.h" struct opt *opt_list; + void opt_midi_imsg(void *, unsigned char *, int); + void opt_midi_omsg(void *, unsigned char *, int); + void opt_midi_fill(void *, int); + void opt_midi_exit(void *); + + struct midiops opt_midiops = { + opt_midi_imsg, + opt_midi_omsg, + opt_midi_fill, + opt_midi_exit + }; + + void + opt_midi_imsg(void *arg, unsigned char *msg, int len) + { + #ifdef DEBUG + struct opt *o = arg; + + log_puts(o->name); + log_puts(": can't receive midi messages\n"); + panic(); + #endif + } + + void + opt_midi_omsg(void *arg, unsigned char *msg, int len) + { + struct opt *o = arg; + struct sysex *x; + unsigned int fps, chan; + + if ((msg[0] & MIDI_CMDMASK) == MIDI_CTL && msg[1] == MIDI_CTL_VOL) { + chan = msg[0] & MIDI_CHANMASK; + if (chan >= DEV_NSLOT) + return; + if (slot_array[chan].opt == NULL || + slot_array[chan].opt->dev != o->dev) + return; + slot_setvol(slot_array + chan, msg[2]); + ctl_onval(CTL_SLOT_LEVEL, slot_array + chan, NULL, msg[2]); + return; + } + x = (struct sysex *)msg; + if (x->start != SYSEX_START) + return; + if (len < SYSEX_SIZE(empty)) + return; + switch (x->type) { + case SYSEX_TYPE_RT: + if (x->id0 == SYSEX_CONTROL && x->id1 == SYSEX_MASTER) { + if (len == SYSEX_SIZE(master)) { + dev_master(o->dev, x->u.master.coarse); + if (o->dev->master_enabled) { + ctl_onval(CTL_DEV_MASTER, o->dev, NULL, + x->u.master.coarse); + } + } + return; + } + if (x->id0 != SYSEX_MMC) + return; + switch (x->id1) { + case SYSEX_MMC_STOP: + if (len != SYSEX_SIZE(stop)) + return; + if (!o->mmc) + return; + if (log_level >= 2) { + log_puts(o->name); + log_puts(": mmc stop\n"); + } + dev_mmcstop(o->dev); + break; + case SYSEX_MMC_START: + if (len != SYSEX_SIZE(start)) + return; + if (!o->mmc) + return; + if (log_level >= 2) { + log_puts(o->name); + log_puts(": mmc start\n"); + } + dev_mmcstart(o->dev); + break; + case SYSEX_MMC_LOC: + if (len != SYSEX_SIZE(loc) || + x->u.loc.len != SYSEX_MMC_LOC_LEN || + x->u.loc.cmd != SYSEX_MMC_LOC_CMD) + return; + if (!o->mmc) + return; + switch (x->u.loc.hr >> 5) { + case MTC_FPS_24: + fps = 24; + break; + case MTC_FPS_25: + fps = 25; + break; + case MTC_FPS_30: + fps = 30; + break; + default: + dev_mmcstop(o->dev); + return; + } + dev_mmcloc(o->dev, + (x->u.loc.hr & 0x1f) * 3600 * MTC_SEC + + x->u.loc.min * 60 * MTC_SEC + + x->u.loc.sec * MTC_SEC + + x->u.loc.fr * (MTC_SEC / fps)); + break; + } + break; + case SYSEX_TYPE_EDU: + if (x->id0 != SYSEX_AUCAT || x->id1 != SYSEX_AUCAT_DUMPREQ) + return; + if (len != SYSEX_SIZE(dumpreq)) + return; + dev_midi_dump(o->dev); + break; + } + } + + void + opt_midi_fill(void *arg, int count) + { + /* nothing to do */ + } + + void + opt_midi_exit(void *arg) + { + struct opt *o = arg; + + if (log_level >= 1) { + log_puts(o->name); + log_puts(": midi end point died\n"); + panic(); + } + } + /* * create a new audio sub-device "configuration" */ *************** *** 66,71 **** --- 209,225 ---- o = xmalloc(sizeof(struct opt)); o->num = num; o->dev = d; + + /* + * XXX: below, we allocate a midi input buffer, since we don't + * receive raw midi data, so no need to allocate a input + * ibuf. Possibly set imsg & fill callbacks to NULL and + * use this to in midi_new() to check if buffers need to be + * allocated + */ + o->midi = midi_new(&opt_midiops, o, MODE_MIDIIN | MODE_MIDIOUT); + midi_tag(o->midi, o->num); + if (mode & MODE_PLAY) { o->pmin = pmin; o->pmax = pmax; *************** *** 144,149 **** --- 298,304 ---- } #endif } + midi_del(o->midi); *po = o->next; xfree(o); }