diff options
author | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2013-03-15 09:10:53 +0000 |
---|---|---|
committer | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2013-03-15 09:10:53 +0000 |
commit | 49aac2bac6f6269f9e44cf55dc4de415e2a24efc (patch) | |
tree | 85a487a578e55d597c61aea9298132b9ed5c669a /sys/dev | |
parent | 34d0cca60db6731f475f499a11e845c965fd5519 (diff) |
Delete the sequencer(4) driver, since its not used any longer. Diff
mostly from armani.
ok miod, mpi, jsg and help from sthen
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/midi.c | 101 | ||||
-rw-r--r-- | sys/dev/midivar.h | 15 | ||||
-rw-r--r-- | sys/dev/sequencer.c | 1282 | ||||
-rw-r--r-- | sys/dev/sequencervar.h | 105 |
4 files changed, 2 insertions, 1501 deletions
diff --git a/sys/dev/midi.c b/sys/dev/midi.c index db3913acfec..453524f68b4 100644 --- a/sys/dev/midi.c +++ b/sys/dev/midi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: midi.c,v 1.28 2012/04/17 07:58:47 ratchov Exp $ */ +/* $OpenBSD: midi.c,v 1.29 2013/03/15 09:10:52 ratchov Exp $ */ /* * Copyright (c) 2003, 2004 Alexandre Ratchov @@ -16,16 +16,6 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* - * TODO - * - put the sequencer stuff in sequencer.c and sequencervar.h - * there is no reason to have it here. The sequencer - * driver need only to open the midi hw_if thus it does not - * need this driver - */ - -#include "sequencer.h" - #include <sys/param.h> #include <sys/fcntl.h> #include <sys/systm.h> @@ -67,13 +57,6 @@ void midi_out_do(struct midi_softc *); void midi_attach(struct midi_softc *, struct device *); -#if NSEQUENCER > 0 -int midi_unit_count(void); -void midi_toevent(struct midi_softc *, int); -int midi_writebytes(int, u_char *, int); -void midiseq_in(struct midi_dev *, u_char *, int); -#endif - struct cfattach midi_ca = { sizeof(struct midi_softc), midiprobe, midiattach, mididetach }; @@ -107,12 +90,6 @@ midi_iintr(void *addr, int data) if (sc->isdying || !sc->isopen || !(sc->flags & FREAD)) return; -#if NSEQUENCER > 0 - if (sc->seqopen) { - midi_toevent(sc, data); - return; - } -#endif if (MIDIBUF_ISFULL(mb)) return; /* discard data */ @@ -482,11 +459,6 @@ midiopen(dev_t dev, int flags, int mode, struct proc *p) if (err) return err; sc->isopen = 1; -#if NSEQUENCER > 0 - sc->seq_md = 0; - sc->seqopen = 0; - sc->evstatus = 0xff; -#endif return 0; } @@ -644,74 +616,3 @@ midi_unit_count(void) return midi_cd.cd_ndevs; } - -#if NSEQUENCER > 0 -#define MIDI_EVLEN(status) (midi_evlen[((status) >> 4) & 7]) -unsigned midi_evlen[] = { 2, 2, 2, 2, 1, 1, 2 }; - -void -midi_toevent(struct midi_softc *sc, int data) -{ - unsigned char mesg[3]; - - if (data >= 0xf8) { /* is it a realtime message ? */ - switch(data) { - case 0xf8: /* midi timer tic */ - case 0xfa: /* midi timer start */ - case 0xfb: /* midi timer continue (after stop) */ - case 0xfc: /* midi timer stop */ - mesg[0] = data; - midiseq_in(sc->seq_md, mesg, 1); - break; - default: - break; - } - } else if (data >= 0x80) { /* is it a common or voice message ? */ - sc->evstatus = data; - sc->evindex = 0; - } else { /* else it is a data byte */ - /* strip common messages and bogus data */ - if (sc->evstatus >= 0xf0 || sc->evstatus < 0x80) - return; - - sc->evdata[sc->evindex++] = data; - if (sc->evindex == MIDI_EVLEN(sc->evstatus)) { - sc->evindex = 0; - mesg[0] = sc->evstatus; - mesg[1] = sc->evdata[0]; - mesg[2] = sc->evdata[1]; - midiseq_in(sc->seq_md, mesg, 1 + MIDI_EVLEN(sc->evstatus)); - } - } -} - - -int -midi_writebytes(int unit, unsigned char *mesg, int mesglen) -{ - struct midi_softc *sc = midi_cd.cd_devs[unit]; - struct midi_buffer *mb = &sc->outbuf; - unsigned count; - int s; - - s = splaudio(); - if (mesglen > MIDIBUF_AVAIL(mb)) { - splx(s); - return EWOULDBLOCK; - } - - while (mesglen > 0) { - count = MIDIBUF_SIZE - MIDIBUF_END(mb); - if (count > MIDIBUF_AVAIL(mb)) count = MIDIBUF_AVAIL(mb); - if (count > mesglen) count = mesglen; - bcopy(mesg, mb->data + MIDIBUF_END(mb), count); - mb->used += count; - mesg += count; - mesglen -= count; - midi_out_start(sc); - } - splx(s); - return 0; -} - -#endif /* NSEQUENCER > 0 */ diff --git a/sys/dev/midivar.h b/sys/dev/midivar.h index e2987e5c3f7..bbdad7b1622 100644 --- a/sys/dev/midivar.h +++ b/sys/dev/midivar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: midivar.h,v 1.6 2012/03/30 08:18:19 ratchov Exp $ */ +/* $OpenBSD: midivar.h,v 1.7 2013/03/15 09:10:52 ratchov Exp $ */ /* * Copyright (c) 2003, 2004 Alexandre Ratchov @@ -30,12 +30,6 @@ #define MIDI_UNIT(a) ((a) & 0xff) #define MIDI_DEV2SC(a) (midi_cd.cd_devs[MIDI_UNIT(a)]) -#include "sequencer.h" - -#if NSEQUENCER > 0 -struct midi_dev; /* defined in sequencervar.h */ -#endif - /* * simple ring buffer */ @@ -91,13 +85,6 @@ struct midi_softc { struct timeout timeo; struct midi_buffer inbuf; struct midi_buffer outbuf; -#if NSEQUENCER > 0 - int seqopen; - struct midi_dev *seq_md; /* structure that links us with the seq. */ - int evindex; - unsigned char evstatus; - unsigned char evdata[2]; -#endif /* NSEQUENCER > 0 */ }; #endif /* _SYS_DEV_MIDIVAR_H_ */ diff --git a/sys/dev/sequencer.c b/sys/dev/sequencer.c deleted file mode 100644 index c50750cf05e..00000000000 --- a/sys/dev/sequencer.c +++ /dev/null @@ -1,1282 +0,0 @@ -/* $OpenBSD: sequencer.c,v 1.22 2011/07/02 22:20:07 nicm Exp $ */ -/* $NetBSD: sequencer.c,v 1.13 1998/11/25 22:17:07 augustss Exp $ */ - -/* - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Lennart Augustsson (augustss@netbsd.org). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <sys/param.h> -#include <sys/ioctl.h> -#include <sys/fcntl.h> -#include <sys/vnode.h> -#include <sys/selinfo.h> -#include <sys/poll.h> -#include <sys/malloc.h> -#include <sys/proc.h> -#include <sys/systm.h> -#include <sys/syslog.h> -#include <sys/kernel.h> -#include <sys/signalvar.h> -#include <sys/conf.h> -#include <sys/audioio.h> -#include <sys/midiio.h> -#include <sys/device.h> - -#include <dev/midi_if.h> -#include <dev/midivar.h> -#include <dev/sequencervar.h> - -#ifndef splaudio -#define splaudio() splbio() /* XXX found in audio_if.h normally */ -#endif - -#define ADDTIMEVAL(a, b) ( \ - (a)->tv_sec += (b)->tv_sec, \ - (a)->tv_usec += (b)->tv_usec, \ - (a)->tv_usec >= 1000000 ? ((a)->tv_sec++, (a)->tv_usec -= 1000000) : 0\ - ) - -#define SUBTIMEVAL(a, b) ( \ - (a)->tv_sec -= (b)->tv_sec, \ - (a)->tv_usec -= (b)->tv_usec, \ - (a)->tv_usec < 0 ? ((a)->tv_sec--, (a)->tv_usec += 1000000) : 0\ - ) - -#ifdef AUDIO_DEBUG -#define DPRINTF(x) if (sequencerdebug) printf x -#define DPRINTFN(n,x) if (sequencerdebug >= (n)) printf x -int sequencerdebug = 0; -#else -#define DPRINTF(x) -#define DPRINTFN(n,x) -#endif - -#define SEQ_CMD(b) ((b)->arr[0]) - -#define SEQ_EDEV(b) ((b)->arr[1]) -#define SEQ_ECMD(b) ((b)->arr[2]) -#define SEQ_ECHAN(b) ((b)->arr[3]) -#define SEQ_ENOTE(b) ((b)->arr[4]) -#define SEQ_EPARM(b) ((b)->arr[5]) - -#define SEQ_EP1(b) ((b)->arr[4]) -#define SEQ_EP2(b) ((b)->arr[5]) - -#define SEQ_XCMD(b) ((b)->arr[1]) -#define SEQ_XDEV(b) ((b)->arr[2]) -#define SEQ_XCHAN(b) ((b)->arr[3]) -#define SEQ_XNOTE(b) ((b)->arr[4]) -#define SEQ_XVEL(b) ((b)->arr[5]) - -#define SEQ_TCMD(b) ((b)->arr[1]) -#define SEQ_TPARM(b) ((b)->arr[4]) - -#define SEQ_NOTE_MAX 128 -#define SEQ_NOTE_XXX 255 -#define SEQ_VEL_OFF 0 - -#define RECALC_TICK(t) ((t)->tick = 60 * 1000000L / ((t)->tempo * (t)->timebase)) - -struct sequencer_softc seqdevs[NSEQUENCER]; - -void sequencerattach(int); -void seq_reset(struct sequencer_softc *); -int seq_do_command(struct sequencer_softc *, seq_event_rec *); -int seq_do_extcommand(struct sequencer_softc *, seq_event_rec *); -int seq_do_chnvoice(struct sequencer_softc *, seq_event_rec *); -int seq_do_chncommon(struct sequencer_softc *, seq_event_rec *); -int seq_do_timing(struct sequencer_softc *, seq_event_rec *); -int seq_do_local(struct sequencer_softc *, seq_event_rec *); -int seq_do_sysex(struct sequencer_softc *, seq_event_rec *); -int seq_do_fullsize(struct sequencer_softc *, seq_event_rec *, - struct uio *); -int seq_timer(struct sequencer_softc *, int, int, seq_event_rec *); -static int seq_input_event(struct sequencer_softc *, seq_event_rec *); -int seq_drain(struct sequencer_softc *); -void seq_startoutput(struct sequencer_softc *); -void seq_timeout(void *); -int seq_to_new(seq_event_rec *, struct uio *); -static int seq_sleep_timo(int *, char *, int); -static int seq_sleep(int *, char *); -static void seq_wakeup(int *); - -struct midi_softc; -int midiseq_out(struct midi_dev *, u_char *, u_int, int); -struct midi_dev *midiseq_open(int, int); -void midiseq_close(struct midi_dev *); -void midiseq_reset(struct midi_dev *); -int midiseq_noteon(struct midi_dev *, int, int, int); -int midiseq_noteoff(struct midi_dev *, int, int, int); -int midiseq_keypressure(struct midi_dev *, int, int, int); -int midiseq_pgmchange(struct midi_dev *, int, int); -int midiseq_chnpressure(struct midi_dev *, int, int); -int midiseq_ctlchange(struct midi_dev *, int, int, int); -int midiseq_pitchbend(struct midi_dev *, int, int); -int midiseq_loadpatch(struct midi_dev *, struct sysex_info *, - struct uio *); -int midiseq_putc(struct midi_dev *, int); -void midiseq_in(struct midi_dev *, u_char *, int); - -void -sequencerattach(int n) -{ -} - -int -sequenceropen(dev_t dev, int flags, int ifmt, struct proc *p) -{ - int unit = SEQUENCERUNIT(dev); - struct sequencer_softc *sc; - struct midi_dev *md; - int nmidi; - - DPRINTF(("sequenceropen\n")); - - if (unit >= NSEQUENCER) - return (ENXIO); - sc = &seqdevs[unit]; - if (sc->isopen) - return (EBUSY); - if (SEQ_IS_OLD(dev)) - sc->mode = SEQ_OLD; - else - sc->mode = SEQ_NEW; - sc->isopen++; - sc->flags = flags & (FREAD|FWRITE); - sc->rchan = 0; - sc->wchan = 0; - sc->pbus = 0; - sc->async = 0; - sc->input_stamp = ~0; - - sc->nmidi = 0; - nmidi = midi_unit_count(); - - sc->devs = malloc(nmidi * sizeof(struct midi_dev *), - M_DEVBUF, M_WAITOK); - for (unit = 0; unit < nmidi; unit++) { - md = midiseq_open(unit, flags); - if (md) { - sc->devs[sc->nmidi++] = md; - md->seq = sc; - } - } - - sc->timer.timebase = 100; - sc->timer.tempo = 60; - sc->doingsysex = 0; - RECALC_TICK(&sc->timer); - sc->timer.last = 0; - microtime(&sc->timer.start); - - SEQ_QINIT(&sc->inq); - SEQ_QINIT(&sc->outq); - sc->lowat = SEQ_MAXQ / 2; - timeout_set(&sc->timo, seq_timeout, sc); - - seq_reset(sc); - - DPRINTF(("sequenceropen: mode=%d, nmidi=%d\n", sc->mode, sc->nmidi)); - return (0); -} - -static int -seq_sleep_timo(int *chan, char *label, int timo) -{ - int st; - - if (!label) - label = "seq"; - - DPRINTFN(5, ("seq_sleep_timo: %p %s %d\n", chan, label, timo)); - *chan = 1; - st = tsleep(chan, PWAIT | PCATCH, label, timo); - *chan = 0; -#ifdef MIDI_DEBUG - if (st != 0) - printf("seq_sleep: %d\n", st); -#endif - return (st); -} - -static int -seq_sleep(int *chan, char *label) -{ - return (seq_sleep_timo(chan, label, 0)); -} - -static void -seq_wakeup(int *chan) -{ - if (*chan) { - DPRINTFN(5, ("seq_wakeup: %p\n", chan)); - wakeup(chan); - *chan = 0; - } -} - -int -seq_drain(struct sequencer_softc *sc) -{ - int error; - - DPRINTFN(3, ("seq_drain: %p, len=%d\n", sc, SEQ_QLEN(&sc->outq))); - seq_startoutput(sc); - error = 0; - while(!SEQ_QEMPTY(&sc->outq) && !error) - error = seq_sleep_timo(&sc->wchan, "seq_dr", 60*hz); - return (error); -} - -void -seq_timeout(void *addr) -{ - struct sequencer_softc *sc = addr; - DPRINTFN(4, ("seq_timeout: %p\n", sc)); - sc->timeout = 0; - seq_startoutput(sc); - if (SEQ_QLEN(&sc->outq) < sc->lowat) { - seq_wakeup(&sc->wchan); - selwakeup(&sc->wsel); - if (sc->async) - psignal(sc->async, SIGIO); - } - -} - -void -seq_startoutput(struct sequencer_softc *sc) -{ - struct sequencer_queue *q = &sc->outq; - seq_event_rec cmd; - - if (sc->timeout) - return; - DPRINTFN(4, ("seq_startoutput: %p, len=%d\n", sc, SEQ_QLEN(q))); - while(!SEQ_QEMPTY(q) && !sc->timeout) { - SEQ_QGET(q, cmd); - seq_do_command(sc, &cmd); - } -} - -int -sequencerclose(dev_t dev, int flags, int ifmt, struct proc *p) -{ - struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)]; - int n, s; - - DPRINTF(("sequencerclose: %p\n", sc)); - - seq_drain(sc); - s = splaudio(); - if (sc->timeout) { - timeout_del(&sc->timo); - sc->timeout = 0; - } - splx(s); - - for (n = 0; n < sc->nmidi; n++) - midiseq_close(sc->devs[n]); - free(sc->devs, M_DEVBUF); - sc->isopen = 0; - return (0); -} - -static int -seq_input_event(struct sequencer_softc *sc, seq_event_rec *cmd) -{ - struct sequencer_queue *q = &sc->inq; - - DPRINTFN(2, ("seq_input_event: %02x %02x %02x %02x %02x %02x %02x %02x\n", - cmd->arr[0], cmd->arr[1], cmd->arr[2], cmd->arr[3], - cmd->arr[4], cmd->arr[5], cmd->arr[6], cmd->arr[7])); - if (SEQ_QFULL(q)) - return (ENOMEM); - SEQ_QPUT(q, *cmd); - seq_wakeup(&sc->rchan); - selwakeup(&sc->rsel); - if (sc->async) - psignal(sc->async, SIGIO); - return (0); -} - -void -seq_event_intr(void *addr, seq_event_rec *iev) -{ - struct sequencer_softc *sc = addr; - union { - u_int32_t l; - u_int8_t b[4]; - } u; - u_long t; - struct timeval now; - seq_event_rec ev; - - microtime(&now); - SUBTIMEVAL(&now, &sc->timer.start); - t = now.tv_sec * 1000000 + now.tv_usec; - t /= sc->timer.tick; - if (t != sc->input_stamp) { - ev.arr[0] = SEQ_TIMING; - ev.arr[1] = TMR_WAIT_ABS; - ev.arr[2] = 0; - ev.arr[3] = 0; - u.l = t; - ev.arr[4] = u.b[0]; - ev.arr[5] = u.b[1]; - ev.arr[6] = u.b[2]; - ev.arr[7] = u.b[3]; - seq_input_event(sc, &ev); - sc->input_stamp = t; - } - seq_input_event(sc, iev); -} - -int -sequencerread(dev_t dev, struct uio *uio, int ioflag) -{ - struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)]; - struct sequencer_queue *q = &sc->inq; - seq_event_rec ev; - int error, s; - - DPRINTFN(20, ("sequencerread: %p, count=%d, ioflag=%x\n", - sc, uio->uio_resid, ioflag)); - - if (sc->mode == SEQ_OLD) { - DPRINTF(("sequencerread: old read\n")); - return (EINVAL); /* XXX unimplemented */ - } - - error = 0; - while (SEQ_QEMPTY(q)) { - if (ioflag & IO_NDELAY) - return (EWOULDBLOCK); - else { - error = seq_sleep(&sc->rchan, "seq rd"); - if (error) - return (error); - } - } - s = splaudio(); - while (uio->uio_resid >= sizeof ev && !error && !SEQ_QEMPTY(q)) { - SEQ_QGET(q, ev); - error = uiomove((caddr_t)&ev, sizeof ev, uio); - } - splx(s); - return (error); -} - -int -sequencerwrite(dev_t dev, struct uio *uio, int ioflag) -{ - struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)]; - struct sequencer_queue *q = &sc->outq; - int error; - seq_event_rec cmdbuf; - int size; - - DPRINTFN(2, ("sequencerwrite: %p, count=%d\n", sc, uio->uio_resid)); - - error = 0; - size = sc->mode == SEQ_NEW ? sizeof cmdbuf : SEQOLD_CMDSIZE; - while (uio->uio_resid >= size) { - error = uiomove((caddr_t)&cmdbuf, size, uio); - if (error) - break; - if (sc->mode == SEQ_OLD) - if (seq_to_new(&cmdbuf, uio)) - continue; - if (SEQ_CMD(&cmdbuf) == SEQ_FULLSIZE) { - /* We do it like OSS does, asynchronously */ - error = seq_do_fullsize(sc, &cmdbuf, uio); - if (error) - break; - continue; - } - while (SEQ_QFULL(q)) { - seq_startoutput(sc); - if (SEQ_QFULL(q)) { - if (ioflag & IO_NDELAY) - return (EWOULDBLOCK); - error = seq_sleep(&sc->wchan, "seq_wr"); - if (error) - return (error); - } - } - SEQ_QPUT(q, cmdbuf); - } - seq_startoutput(sc); - -#ifdef SEQUENCER_DEBUG - if (error) - DPRINTFN(2, ("sequencerwrite: error=%d\n", error)); -#endif - return (error); -} - -int -sequencerioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) -{ - struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)]; - struct synth_info *si; - struct midi_dev *md; - int devno; - int error; - int t; - - DPRINTFN(2, ("sequencerioctl: %p cmd=0x%08lx\n", sc, cmd)); - - error = 0; - switch (cmd) { - case FIONBIO: - /* All handled in the upper FS layer. */ - break; - - case FIOASYNC: - if (*(int *)addr) { - if (sc->async) - return (EBUSY); - sc->async = p; - DPRINTF(("sequencer_ioctl: FIOASYNC %p\n", p)); - } else - sc->async = 0; - break; - - case SEQUENCER_RESET: - seq_reset(sc); - break; - - case SEQUENCER_PANIC: - seq_reset(sc); - /* Do more? OSS doesn't */ - break; - - case SEQUENCER_SYNC: - if (sc->flags == FREAD) - return (0); - seq_drain(sc); - error = 0; - break; - - case SEQUENCER_INFO: - si = (struct synth_info*)addr; - devno = si->device; - if (devno < 0 || devno >= sc->nmidi) - return (EINVAL); - md = sc->devs[devno]; - strncpy(si->name, md->name, sizeof si->name); - si->synth_type = SYNTH_TYPE_MIDI; - si->synth_subtype = md->subtype; - si->nr_voices = md->nr_voices; - si->instr_bank_size = md->instr_bank_size; - si->capabilities = md->capabilities; - break; - - case SEQUENCER_NRSYNTHS: - *(int *)addr = sc->nmidi; - break; - - case SEQUENCER_NRMIDIS: - *(int *)addr = sc->nmidi; - break; - - case SEQUENCER_OUTOFBAND: - DPRINTFN(3, ("sequencer_ioctl: OOB=%02x %02x %02x %02x %02x %02x %02x %02x\n", - *(u_char *)addr, *(u_char *)(addr+1), - *(u_char *)(addr+2), *(u_char *)(addr+3), - *(u_char *)(addr+4), *(u_char *)(addr+5), - *(u_char *)(addr+6), *(u_char *)(addr+7))); - error = seq_do_command(sc, (seq_event_rec *)addr); - break; - - case SEQUENCER_TMR_TIMEBASE: - t = *(int *)addr; - if (t < 1) - t = 1; - if (t > 1000) - t = 1000; - sc->timer.timebase = t; - *(int *)addr = t; - RECALC_TICK(&sc->timer); - break; - - case SEQUENCER_TMR_START: - error = seq_timer(sc, TMR_START, 0, 0); - break; - - case SEQUENCER_TMR_STOP: - error = seq_timer(sc, TMR_STOP, 0, 0); - break; - - case SEQUENCER_TMR_CONTINUE: - error = seq_timer(sc, TMR_CONTINUE, 0, 0); - break; - - case SEQUENCER_TMR_TEMPO: - t = *(int *)addr; - if (t < 8) - t = 8; - if (t > 250) - t = 250; - sc->timer.tempo = t; - *(int *)addr = t; - RECALC_TICK(&sc->timer); - break; - - case SEQUENCER_TMR_SOURCE: - *(int *)addr = SEQUENCER_TMR_INTERNAL; - break; - - case SEQUENCER_TMR_METRONOME: - /* noop */ - break; - - case SEQUENCER_THRESHOLD: - t = SEQ_MAXQ - *(int *)addr / sizeof (seq_event_rec); - if (t < 1) - t = 1; - if (t > SEQ_MAXQ) - t = SEQ_MAXQ; - sc->lowat = t; - break; - - case SEQUENCER_CTRLRATE: - *(int *)addr = (sc->timer.tempo*sc->timer.timebase + 30) / 60; - break; - - case SEQUENCER_GETTIME: - { - struct timeval now; - u_long t; - microtime(&now); - SUBTIMEVAL(&now, &sc->timer.start); - t = now.tv_sec * 1000000 + now.tv_usec; - t /= sc->timer.tick; - *(int *)addr = t; - break; - } - - default: - DPRINTF(("sequencer_ioctl: unimpl %08lx\n", cmd)); - error = ENOTTY; - break; - } - return (error); -} - -int -sequencerpoll(dev_t dev, int events, struct proc *p) -{ - struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)]; - int revents = 0; - - DPRINTF(("sequencerpoll: %p rw=0x%x\n", sc, events)); - - if (events & (POLLIN | POLLRDNORM)) { - if (!SEQ_QEMPTY(&sc->inq)) - revents |= events & (POLLIN | POLLRDNORM); - } - if (events & (POLLOUT | POLLWRNORM)) { - if (SEQ_QLEN(&sc->outq) < sc->lowat) - revents |= events & (POLLOUT | POLLWRNORM); - } - if (revents == 0) { - if (events & (POLLIN | POLLRDNORM)) - selrecord(p, &sc->rsel); - if (events & (POLLOUT | POLLWRNORM)) - selrecord(p, &sc->wsel); - } - return (revents); -} - -int -sequencerkqfilter(dev_t dev, struct knote *kn) -{ - return (ENXIO); -} - -void -seq_reset(struct sequencer_softc *sc) -{ - int i, chn; - struct midi_dev *md; - - for (i = 0; i < sc->nmidi; i++) { - md = sc->devs[i]; - midiseq_reset(md); - for (chn = 0; chn < MAXCHAN; chn++) { - midiseq_ctlchange(md, chn, MIDI_CTRL_ALLOFF, 0); - midiseq_ctlchange(md, chn, MIDI_CTRL_RESET, 0); - midiseq_pitchbend(md, chn, MIDI_BEND_NEUTRAL); - } - } -} - -int -seq_do_command(struct sequencer_softc *sc, seq_event_rec *b) -{ - int dev; - - DPRINTFN(4, ("seq_do_command: %p cmd=0x%02x\n", sc, SEQ_CMD(b))); - - switch(SEQ_CMD(b)) { - case SEQ_LOCAL: - return (seq_do_local(sc, b)); - case SEQ_TIMING: - return (seq_do_timing(sc, b)); - case SEQ_CHN_VOICE: - return (seq_do_chnvoice(sc, b)); - case SEQ_CHN_COMMON: - return (seq_do_chncommon(sc, b)); - case SEQ_SYSEX: - return (seq_do_sysex(sc, b)); - /* COMPAT */ - case SEQOLD_MIDIPUTC: - dev = b->arr[2]; - if (dev < 0 || dev >= sc->nmidi) - return (ENXIO); - return (midiseq_putc(sc->devs[dev], b->arr[1])); - default: - DPRINTF(("seq_do_command: unimpl command %02x\n", - SEQ_CMD(b))); - return (EINVAL); - } -} - -int -seq_do_chnvoice(struct sequencer_softc *sc, seq_event_rec *b) -{ - int cmd, dev, chan, note, parm, voice; - int error; - struct midi_dev *md; - - dev = SEQ_EDEV(b); - if (dev < 0 || dev >= sc->nmidi) - return (ENXIO); - md = sc->devs[dev]; - cmd = SEQ_ECMD(b); - chan = SEQ_ECHAN(b); - note = SEQ_ENOTE(b); - parm = SEQ_EPARM(b); - DPRINTFN(2,("seq_do_chnvoice: cmd=%02x dev=%d chan=%d note=%d parm=%d\n", - cmd, dev, chan, note, parm)); - voice = chan; - if (cmd == MIDI_NOTEON && parm == 0) { - cmd = MIDI_NOTEOFF; - parm = MIDI_HALF_VEL; - } - switch(cmd) { - case MIDI_NOTEON: - DPRINTFN(5, ("seq_do_chnvoice: noteon %p %d %d %d\n", - md, voice, note, parm)); - error = midiseq_noteon(md, voice, note, parm); - break; - case MIDI_NOTEOFF: - error = midiseq_noteoff(md, voice, note, parm); - break; - case MIDI_KEY_PRESSURE: - error = midiseq_keypressure(md, voice, note, parm); - break; - default: - DPRINTF(("seq_do_chnvoice: unimpl command %02x\n", cmd)); - error = EINVAL; - break; - } - return (error); -} - -int -seq_do_chncommon(struct sequencer_softc *sc, seq_event_rec *b) -{ - int cmd, dev, chan, p1, w14; - int error; - struct midi_dev *md; - union { - int16_t s; - u_int8_t b[2]; - } u; - - dev = SEQ_EDEV(b); - if (dev < 0 || dev >= sc->nmidi) - return (ENXIO); - md = sc->devs[dev]; - cmd = SEQ_ECMD(b); - chan = SEQ_ECHAN(b); - p1 = SEQ_EP1(b); - u.b[0] = b->arr[6]; - u.b[1] = b->arr[7]; - w14 = u.s; - DPRINTFN(2,("seq_do_chncommon: %02x\n", cmd)); - - error = 0; - switch(cmd) { - case MIDI_PGM_CHANGE: - error = midiseq_pgmchange(md, chan, p1); - break; - case MIDI_CTL_CHANGE: - if (chan > 15 || p1 > 127) - return (0); /* EINVAL */ - error = midiseq_ctlchange(md, chan, p1, w14); - break; - case MIDI_PITCH_BEND: - error = midiseq_pitchbend(md, chan, w14); - break; - case MIDI_CHN_PRESSURE: - error = midiseq_chnpressure(md, chan, p1); - break; - default: - DPRINTF(("seq_do_chncommon: unimpl command %02x\n", cmd)); - error = EINVAL; - break; - } - return (error); -} - -int -seq_do_timing(struct sequencer_softc *sc, seq_event_rec *b) -{ - union { - int32_t i; - u_int8_t b[4]; - } u; - - u.b[0] = b->arr[4]; - u.b[1] = b->arr[5]; - u.b[2] = b->arr[6]; - u.b[3] = b->arr[7]; - return (seq_timer(sc, SEQ_TCMD(b), u.i, b)); -} - -int -seq_do_local(struct sequencer_softc *sc, seq_event_rec *b) -{ - return (EINVAL); -} - -int -seq_do_sysex(struct sequencer_softc *sc, seq_event_rec *b) -{ - int dev, i; - struct midi_dev *md; - u_int8_t c, *buf = &b->arr[2]; - - dev = SEQ_EDEV(b); - if (dev < 0 || dev >= sc->nmidi) - return (ENXIO); - DPRINTF(("seq_do_sysex: dev=%d\n", dev)); - md = sc->devs[dev]; - - if (!sc->doingsysex) { - c = MIDI_SYSEX_START; - midiseq_out(md, &c, 1, 0); - sc->doingsysex = 1; - } - - for (i = 0; i < 6 && buf[i] != 0xff; i++) - ; - midiseq_out(md, buf, i, 0); - if (i < 6 || (i > 0 && buf[i-1] == MIDI_SYSEX_END)) - sc->doingsysex = 0; - return (0); -} - -int -seq_timer(struct sequencer_softc *sc, int cmd, int parm, seq_event_rec *b) -{ - struct syn_timer *t = &sc->timer; - struct timeval when; - int ticks; - int error; - long long usec; - - DPRINTFN(2,("seq_timer: %02x %d\n", cmd, parm)); - - error = 0; - switch(cmd) { - case TMR_WAIT_REL: - parm += t->last; - /* FALLTHROUGH */ - case TMR_WAIT_ABS: - t->last = parm; - usec = (long long)parm * (long long)t->tick; /* convert to usec */ - when.tv_sec = usec / 1000000; - when.tv_usec = usec % 1000000; - DPRINTFN(4, ("seq_timer: parm=%d, sleep when=%ld.%06ld", parm, - when.tv_sec, when.tv_usec)); - ADDTIMEVAL(&when, &t->start); /* abstime for end */ - ticks = hzto(&when); - DPRINTFN(4, (" when+start=%ld.%06ld, ticks=%d\n", - when.tv_sec, when.tv_usec, ticks)); - if (ticks > 0) { -#ifdef DIAGNOSTIC - if (ticks > 20 * hz) { - /* Waiting more than 20s */ - printf("seq_timer: funny ticks=%d, usec=%lld, parm=%d, tick=%ld\n", - ticks, usec, parm, t->tick); - } -#endif - sc->timeout = 1; - timeout_add(&sc->timo, ticks); - } -#ifdef SEQUENCER_DEBUG - else if (ticks < 0) - DPRINTF(("seq_timer: ticks = %d\n", ticks)); -#endif - break; - case TMR_START: - microtime(&t->start); - t->running = 1; - break; - case TMR_STOP: - microtime(&t->stop); - t->running = 0; - break; - case TMR_CONTINUE: - microtime(&when); - SUBTIMEVAL(&when, &t->stop); - ADDTIMEVAL(&t->start, &when); - t->running = 1; - break; - case TMR_TEMPO: - /* parm is ticks per minute / timebase */ - if (parm < 8) - parm = 8; - if (parm > 360) - parm = 360; - t->tempo = parm; - RECALC_TICK(t); - break; - case TMR_ECHO: - error = seq_input_event(sc, b); - break; - case TMR_RESET: - t->last = 0; - microtime(&t->start); - break; - default: - DPRINTF(("seq_timer: unknown %02x\n", cmd)); - error = EINVAL; - break; - } - return (error); -} - -int -seq_do_fullsize(struct sequencer_softc *sc, seq_event_rec *b, struct uio *uio) -{ - struct sysex_info sysex; - u_int dev; - -#ifdef DIAGNOSTIC - if (sizeof(seq_event_rec) != SEQ_SYSEX_HDRSIZE) { - printf("seq_do_fullsize: sysex size ??\n"); - return (EINVAL); - } -#endif - memcpy(&sysex, b, sizeof sysex); - dev = sysex.device_no; - DPRINTFN(2, ("seq_do_fullsize: fmt=%04x, dev=%d, len=%d\n", - sysex.key, dev, sysex.len)); - return (midiseq_loadpatch(sc->devs[dev], &sysex, uio)); -} - -/* Convert an old sequencer event to a new one. */ -int -seq_to_new(seq_event_rec *ev, struct uio *uio) -{ - int cmd, chan, note, parm; - u_int32_t delay; - int error; - - cmd = SEQ_CMD(ev); - chan = ev->arr[1]; - note = ev->arr[2]; - parm = ev->arr[3]; - DPRINTFN(3, ("seq_to_new: 0x%02x %d %d %d\n", cmd, chan, note, parm)); - - if (cmd >= 0x80) { - /* Fill the event record */ - if (uio->uio_resid >= sizeof *ev - SEQOLD_CMDSIZE) { - error = uiomove(&ev->arr[SEQOLD_CMDSIZE], - sizeof *ev - SEQOLD_CMDSIZE, uio); - if (error) - return (error); - } else - return (EINVAL); - } - - switch(cmd) { - case SEQOLD_NOTEOFF: - note = 255; - SEQ_ECMD(ev) = MIDI_NOTEOFF; - goto onoff; - case SEQOLD_NOTEON: - SEQ_ECMD(ev) = MIDI_NOTEON; - onoff: - SEQ_CMD(ev) = SEQ_CHN_VOICE; - SEQ_EDEV(ev) = 0; - SEQ_ECHAN(ev) = chan; - SEQ_ENOTE(ev) = note; - SEQ_EPARM(ev) = parm; - break; - case SEQOLD_WAIT: - delay = *(u_int32_t *)ev->arr >> 8; - SEQ_CMD(ev) = SEQ_TIMING; - SEQ_TCMD(ev) = TMR_WAIT_REL; - *(u_int32_t *)&ev->arr[4] = delay; - break; - case SEQOLD_SYNCTIMER: - SEQ_CMD(ev) = SEQ_TIMING; - SEQ_TCMD(ev) = TMR_RESET; - break; - case SEQOLD_PGMCHANGE: - SEQ_ECMD(ev) = MIDI_PGM_CHANGE; - SEQ_CMD(ev) = SEQ_CHN_COMMON; - SEQ_EDEV(ev) = 0; - SEQ_ECHAN(ev) = chan; - SEQ_EP1(ev) = note; - break; - case SEQOLD_MIDIPUTC: - break; /* interpret in normal mode */ - case SEQOLD_ECHO: - case SEQOLD_PRIVATE: - case SEQOLD_EXTENDED: - default: - DPRINTF(("seq_to_new: not impl 0x%02x\n", cmd)); - return (EINVAL); - /* In case new events show up */ - case SEQ_TIMING: - case SEQ_CHN_VOICE: - case SEQ_CHN_COMMON: - case SEQ_FULLSIZE: - break; - } - return (0); -} - -/**********************************************/ - -void -midiseq_in(struct midi_dev *md, u_char *msg, int len) -{ - int unit = md->unit; - seq_event_rec ev; - int status, chan; - - DPRINTFN(2, ("midiseq_in: %p %02x %02x %02x\n", - md, msg[0], msg[1], msg[2])); - - status = MIDI_GET_STATUS(msg[0]); - chan = MIDI_GET_CHAN(msg[0]); - switch (status) { - case MIDI_NOTEON: - if (msg[2] == 0) { - status = MIDI_NOTEOFF; - msg[2] = MIDI_HALF_VEL; - } - /* FALLTHROUGH */ - case MIDI_NOTEOFF: - case MIDI_KEY_PRESSURE: - SEQ_MK_CHN_VOICE(&ev, unit, status, chan, msg[1], msg[2]); - break; - case MIDI_CTL_CHANGE: - SEQ_MK_CHN_COMMON(&ev, unit, status, chan, msg[1], 0, msg[2]); - break; - case MIDI_PGM_CHANGE: - case MIDI_CHN_PRESSURE: - SEQ_MK_CHN_COMMON(&ev, unit, status, chan, msg[1], 0, 0); - break; - case MIDI_PITCH_BEND: - SEQ_MK_CHN_COMMON(&ev, unit, status, chan, 0, 0, - (msg[1] & 0x7f) | ((msg[2] & 0x7f) << 7)); - break; - default: - return; - } - seq_event_intr(md->seq, &ev); -} - -struct midi_dev * -midiseq_open(int unit, int flags) -{ - extern struct cfdriver midi_cd; - int error; - struct midi_dev *md; - struct midi_softc *sc; - struct midi_info mi; - - DPRINTFN(2, ("midiseq_open: %d %d\n", unit, flags)); - error = midiopen(makedev(0, unit), flags, 0, 0); - if (error) - return (0); - sc = midi_cd.cd_devs[unit]; - sc->seqopen = 1; - md = malloc(sizeof *md, M_DEVBUF, M_WAITOK | M_ZERO); - sc->seq_md = md; - md->msc = sc; - midi_getinfo(makedev(0, unit), &mi); - md->unit = unit; - md->name = mi.name; - md->subtype = 0; - md->nr_voices = 128; /* XXX */ - md->instr_bank_size = 128; /* XXX */ - if (mi.props & MIDI_PROP_CAN_INPUT) - md->capabilities |= SYNTH_CAP_INPUT; - return (md); -} - -void -midiseq_close(struct midi_dev *md) -{ - DPRINTFN(2, ("midiseq_close: %d\n", md->unit)); - midiclose(makedev(0, md->unit), 0, 0, 0); - free(md, M_DEVBUF); -} - -void -midiseq_reset(struct midi_dev *md) -{ - /* XXX send GM reset? */ - DPRINTFN(3, ("midiseq_reset: %d\n", md->unit)); -} - -int -midiseq_out(struct midi_dev *md, u_char *buf, u_int cc, int chk) -{ - DPRINTFN(5, ("midiseq_out: m=%p, unit=%d, buf[0]=0x%02x, cc=%d\n", - md->msc, md->unit, buf[0], cc)); - - /* The MIDI "status" byte does not have to be repeated. */ - if (chk && md->last_cmd == buf[0]) - buf++, cc--; - else - md->last_cmd = buf[0]; - return (midi_writebytes(md->unit, buf, cc)); -} - -int -midiseq_noteon(struct midi_dev *md, int chan, int note, int vel) -{ - u_char buf[3]; - - DPRINTFN(6, ("midiseq_noteon 0x%02x %d %d\n", - MIDI_NOTEON | chan, note, vel)); - if (chan < 0 || chan > 15 || - note < 0 || note > 127) - return (EINVAL); - if (vel < 0) vel = 0; - if (vel > 127) vel = 127; - buf[0] = MIDI_NOTEON | chan; - buf[1] = note; - buf[2] = vel; - return (midiseq_out(md, buf, 3, 1)); -} - -int -midiseq_noteoff(struct midi_dev *md, int chan, int note, int vel) -{ - u_char buf[3]; - - if (chan < 0 || chan > 15 || - note < 0 || note > 127) - return (EINVAL); - if (vel < 0) vel = 0; - if (vel > 127) vel = 127; - buf[0] = MIDI_NOTEOFF | chan; - buf[1] = note; - buf[2] = vel; - return (midiseq_out(md, buf, 3, 1)); -} - -int -midiseq_keypressure(struct midi_dev *md, int chan, int note, int vel) -{ - u_char buf[3]; - - if (chan < 0 || chan > 15 || - note < 0 || note > 127) - return (EINVAL); - if (vel < 0) vel = 0; - if (vel > 127) vel = 127; - buf[0] = MIDI_KEY_PRESSURE | chan; - buf[1] = note; - buf[2] = vel; - return (midiseq_out(md, buf, 3, 1)); -} - -int -midiseq_pgmchange(struct midi_dev *md, int chan, int parm) -{ - u_char buf[2]; - - if (chan < 0 || chan > 15 || - parm < 0 || parm > 127) - return (EINVAL); - buf[0] = MIDI_PGM_CHANGE | chan; - buf[1] = parm; - return (midiseq_out(md, buf, 2, 1)); -} - -int -midiseq_chnpressure(struct midi_dev *md, int chan, int parm) -{ - u_char buf[2]; - - if (chan < 0 || chan > 15 || - parm < 0 || parm > 127) - return (EINVAL); - buf[0] = MIDI_CHN_PRESSURE | chan; - buf[1] = parm; - return (midiseq_out(md, buf, 2, 1)); -} - -int -midiseq_ctlchange(struct midi_dev *md, int chan, int parm, int w14) -{ - u_char buf[3]; - - if (chan < 0 || chan > 15 || - parm < 0 || parm > 127) - return (EINVAL); - buf[0] = MIDI_CTL_CHANGE | chan; - buf[1] = parm; - buf[2] = w14 & 0x7f; - return (midiseq_out(md, buf, 3, 1)); -} - -int -midiseq_pitchbend(struct midi_dev *md, int chan, int parm) -{ - u_char buf[3]; - - if (chan < 0 || chan > 15) - return (EINVAL); - buf[0] = MIDI_PITCH_BEND | chan; - buf[1] = parm & 0x7f; - buf[2] = (parm >> 7) & 0x7f; - return (midiseq_out(md, buf, 3, 1)); -} - -int -midiseq_loadpatch(struct midi_dev *md, struct sysex_info *sysex, struct uio *uio) -{ - u_char c, buf[128]; - int i, cc, error; - - if (sysex->key != SEQ_SYSEX_PATCH) { - DPRINTF(("midiseq_loadpatch: bad patch key 0x%04x\n", - sysex->key)); - return (EINVAL); - } - if (uio->uio_resid < sysex->len) - /* adjust length, should be an error */ - sysex->len = uio->uio_resid; - - DPRINTFN(2, ("midiseq_loadpatch: len=%d\n", sysex->len)); - if (sysex->len == 0) - return (EINVAL); - error = uiomove(&c, 1, uio); - if (error) - return error; - if (c != MIDI_SYSEX_START) /* must start like this */ - return (EINVAL); - error = midiseq_out(md, &c, 1, 0); - if (error) - return (error); - --sysex->len; - while (sysex->len > 0) { - cc = sysex->len; - if (cc > sizeof buf) - cc = sizeof buf; - error = uiomove(buf, cc, uio); - if (error) - break; - for(i = 0; i < cc && !MIDI_IS_STATUS(buf[i]); i++) - ; - error = midiseq_out(md, buf, i, 0); - if (error) - break; - sysex->len -= i; - if (i != cc) - break; - } - /* Any leftover data in uio is rubbish; - * the SYSEX should be one write ending in SYSEX_END. - */ - uio->uio_resid = 0; - c = MIDI_SYSEX_END; - return (midiseq_out(md, &c, 1, 0)); -} - -int -midiseq_putc(struct midi_dev *md, int data) -{ - u_char c = data; - DPRINTFN(4,("midiseq_putc: 0x%02x\n", data)); - return (midiseq_out(md, &c, 1, 0)); -} - -#include "midi.h" -#if NMIDI == 0 -/* - * If someone has a sequencer, but no midi devices there will - * be unresolved references, so we provide little stubs. - */ - -int -midi_unit_count(void) -{ - return (0); -} - -int -midiopen(dev_t dev, int flags, int ifmt, struct proc *p) -{ - return (ENXIO); -} - -struct cfdriver midi_cd; - -void -midi_getinfo(dev_t dev, struct midi_info *mi) -{ -} - -int -midiclose(dev_t dev, int flags, int ifmt, struct proc *p) -{ - return (ENXIO); -} - -int -midi_writebytes(int unit, u_char *buf, int cc) -{ - return (ENXIO); -} -#endif /* NMIDI == 0 */ diff --git a/sys/dev/sequencervar.h b/sys/dev/sequencervar.h deleted file mode 100644 index cfa0231021a..00000000000 --- a/sys/dev/sequencervar.h +++ /dev/null @@ -1,105 +0,0 @@ -/* $OpenBSD: sequencervar.h,v 1.4 2008/06/26 05:42:14 ray Exp $ */ -/* $NetBSD: sequencervar.h,v 1.5 1998/11/25 22:17:07 augustss Exp $ */ - -/* - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Lennart Augustsson (augustss@netbsd.org). - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -struct midi_softc; - -struct syn_timer { - struct timeval start, stop; - int tempo, timebase; - u_long last; - u_long tick; - int running; -}; - -#define SEQ_MAXQ 256 -struct sequencer_queue { - seq_event_rec buf[SEQ_MAXQ]; - u_int in; /* input index in buf */ - u_int out; /* output index in buf */ - u_int count; /* filled slots in buf */ -}; -#define SEQ_QINIT(q) ((q)->in = (q)->out = (q)->count = 0) -#define SEQ_QEMPTY(q) ((q)->count == 0) -#define SEQ_QFULL(q) ((q)->count >= SEQ_MAXQ) -#define SEQ_QPUT(q, e) ((q)->buf[(q)->in++] = (e), (q)->in %= SEQ_MAXQ, (q)->count++) -#define SEQ_QGET(q, e) ((e) = (q)->buf[(q)->out++], (q)->out %= SEQ_MAXQ, (q)->count--) -#define SEQ_QLEN(q) ((q)->count) - -struct sequencer_softc; - -#define MAXCHAN 16 -struct midi_dev { - char *name; - int subtype; - int capabilities; - int nr_voices; - int instr_bank_size; - int unit; - u_char last_cmd; - struct sequencer_softc *seq; - struct midi_softc *msc; -}; - -struct sequencer_softc { - struct device dev; - struct device *sc_dev; /* Hardware device struct */ - int isopen; /* Open indicator */ - int flags; /* Open flags */ - int mode; -#define SEQ_OLD 0 -#define SEQ_NEW 1 - int rchan, wchan; - int pbus; - struct selinfo wsel; /* write selector */ - struct selinfo rsel; /* read selector */ - struct proc *async; /* process who wants audio SIGIO */ - struct timeout timo; /* timeout handle */ - - char doingsysex; /* doing a SEQ_SYSEX */ - - int nmidi; /* number of MIDI devices */ - struct midi_dev **devs; - struct syn_timer timer; - - struct sequencer_queue outq; /* output event queue */ - u_int lowat; /* output queue low water mark */ - char timeout; /* timeout has been set */ - - struct sequencer_queue inq; /* input event queue */ - u_long input_stamp; -}; - -void seq_event_intr(void *, seq_event_rec *); - -#define SEQUENCERUNIT(d) ((d) & 0x7f) -#define SEQ_IS_OLD(d) ((d) & 0x80) - |