summaryrefslogtreecommitdiff
path: root/sys/dev/sequencer.c
diff options
context:
space:
mode:
authoraugustss <augustss@NetBSD.org>1998-08-12 21:31:28 +0000
committeraugustss <augustss@NetBSD.org>1998-08-12 21:31:28 +0000
commit391ef355d502c4f981208e7e26df4b0f9d63af34 (patch)
treedff000de66f9f709acf76330c6842e151fdc7f95 /sys/dev/sequencer.c
parent651d704733fd0d5444c93a83742fe13b4cf0003c (diff)
Handle SYSEX messages.
Diffstat (limited to 'sys/dev/sequencer.c')
-rw-r--r--sys/dev/sequencer.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/sys/dev/sequencer.c b/sys/dev/sequencer.c
index 28d69ef39cb..0d0d826fe28 100644
--- a/sys/dev/sequencer.c
+++ b/sys/dev/sequencer.c
@@ -1,4 +1,4 @@
-/* $NetBSD: sequencer.c,v 1.3 1998/08/12 18:11:53 augustss Exp $ */
+/* $NetBSD: sequencer.c,v 1.4 1998/08/12 21:31:28 augustss Exp $ */
/*
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -116,6 +116,7 @@ int seq_do_chnvoice __P((struct sequencer_softc *, seq_event_rec *));
int seq_do_chncommon __P((struct sequencer_softc *, seq_event_rec *));
int seq_do_timing __P((struct sequencer_softc *, seq_event_rec *));
int seq_do_local __P((struct sequencer_softc *, seq_event_rec *));
+int seq_do_sysex __P((struct sequencer_softc *, seq_event_rec *));
int seq_do_fullsize __P((struct sequencer_softc *, seq_event_rec *,
struct uio *));
int seq_timer __P((struct sequencer_softc *, int, int, seq_event_rec *));
@@ -679,6 +680,8 @@ seq_do_command(sc, b)
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];
@@ -811,6 +814,34 @@ seq_do_local(sc, b)
}
int
+seq_do_sysex(sc, b)
+ 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);
+ md = sc->devs[dev];
+
+ if (!sc->doingsysex) {
+ c = MIDI_SYSEX_START;
+ midiout(md, &c, 1, 0);
+ sc->doingsysex = 1;
+ }
+
+ for (i = 0; i < 6 && buf[i] != 0xff; i++)
+ ;
+ midiout(md, &c, i, 0);
+ if (i < 6)
+ sc->doingsysex = 0;
+ return (0);
+}
+
+int
seq_timer(sc, cmd, parm, b)
struct sequencer_softc *sc;
int cmd, parm;