sequencer.c revision 1.2 1 /* $NetBSD: sequencer.c,v 1.2 1998/08/07 00:28:20 augustss Exp $ */
2
3 /*
4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * Author: Lennart Augustsson
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the NetBSD
20 * Foundation, Inc. and its contributors.
21 * 4. Neither the name of The NetBSD Foundation nor the names of its
22 * contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 #include "sequencer.h"
39 #if NSEQUENCER > 0
40
41 #include <sys/param.h>
42 #include <sys/ioctl.h>
43 #include <sys/fcntl.h>
44 #include <sys/vnode.h>
45 #include <sys/select.h>
46 #include <sys/poll.h>
47 #include <sys/malloc.h>
48 #include <sys/proc.h>
49 #include <sys/systm.h>
50 #include <sys/syslog.h>
51 #include <sys/kernel.h>
52 #include <sys/signalvar.h>
53 #include <sys/conf.h>
54 #include <sys/audioio.h>
55 #include <sys/midiio.h>
56 #include <sys/device.h>
57
58 #include <dev/audio_if.h>
59 #include <dev/midivar.h>
60 #include <dev/sequencervar.h>
61
62 #define ADDTIMEVAL(a, b) ( \
63 (a)->tv_sec += (b)->tv_sec, \
64 (a)->tv_usec += (b)->tv_usec, \
65 (a)->tv_usec > 1000000 ? ((a)->tv_sec++, (a)->tv_usec -= 1000000) : 0\
66 )
67
68 #define SUBTIMEVAL(a, b) ( \
69 (a)->tv_sec -= (b)->tv_sec, \
70 (a)->tv_usec -= (b)->tv_usec, \
71 (a)->tv_usec < 0 ? ((a)->tv_sec--, (a)->tv_usec += 1000000) : 0\
72 )
73
74 #ifdef AUDIO_DEBUG
75 #define DPRINTF(x) if (sequencerdebug) printf x
76 #define DPRINTFN(n,x) if (sequencerdebug >= (n)) printf x
77 int sequencerdebug = 0;
78 #else
79 #define DPRINTF(x)
80 #define DPRINTFN(n,x)
81 #endif
82
83 #define SEQ_CMD(b) ((b)->arr[0])
84
85 #define SEQ_EDEV(b) ((b)->arr[1])
86 #define SEQ_ECMD(b) ((b)->arr[2])
87 #define SEQ_ECHAN(b) ((b)->arr[3])
88 #define SEQ_ENOTE(b) ((b)->arr[4])
89 #define SEQ_EPARM(b) ((b)->arr[5])
90
91 #define SEQ_EP1(b) ((b)->arr[4])
92 #define SEQ_EP2(b) ((b)->arr[5])
93
94 #define SEQ_XCMD(b) ((b)->arr[1])
95 #define SEQ_XDEV(b) ((b)->arr[2])
96 #define SEQ_XCHAN(b) ((b)->arr[3])
97 #define SEQ_XNOTE(b) ((b)->arr[4])
98 #define SEQ_XVEL(b) ((b)->arr[5])
99
100 #define SEQ_TCMD(b) ((b)->arr[1])
101 #define SEQ_TPARM(b) ((b)->arr[4])
102
103 #define SEQ_NOTE_MAX 128
104 #define SEQ_NOTE_XXX 255
105 #define SEQ_VEL_OFF 0
106
107 #define RECALC_TICK(t) ((t)->tick = 60 * 1000000L / ((t)->tempo * (t)->timebase))
108
109 struct sequencer_softc seqdevs[NSEQUENCER];
110
111 void sequencerattach __P((int));
112 void seq_reset __P((struct sequencer_softc *));
113 int seq_do_command __P((struct sequencer_softc *, seq_event_rec *));
114 int seq_do_extcommand __P((struct sequencer_softc *, seq_event_rec *));
115 int seq_do_chnvoice __P((struct sequencer_softc *, seq_event_rec *));
116 int seq_do_chncommon __P((struct sequencer_softc *, seq_event_rec *));
117 int seq_do_timing __P((struct sequencer_softc *, seq_event_rec *));
118 int seq_do_local __P((struct sequencer_softc *, seq_event_rec *));
119 int seq_do_fullsize __P((struct sequencer_softc *, seq_event_rec *, struct uio *));
120 int seq_timer __P((struct sequencer_softc *, int, int, seq_event_rec *));
121 int seq_input_event __P((struct sequencer_softc *, seq_event_rec *));
122 int seq_drain __P((struct sequencer_softc *));
123 void seq_startoutput __P((struct sequencer_softc *));
124 void seq_timeout __P((void *));
125 int seq_to_new __P((seq_event_rec *, struct uio *));
126 static int seq_sleep_timo(int *, char *, int);
127 static int seq_sleep(int *, char *);
128 static void seq_wakeup(int *);
129
130 struct midi_softc;
131 int midiout __P((struct midi_dev *, u_char *, u_int, int));
132 struct midi_dev *midisyn_open __P((int, int));
133 void midisyn_close __P((struct midi_dev *));
134 void midisyn_reset __P((struct midi_dev *));
135 int midisyn_noteon __P((struct midi_dev *, int, int, int));
136 int midisyn_noteoff __P((struct midi_dev *, int, int, int));
137 int midisyn_keypressure __P((struct midi_dev *, int, int, int));
138 int midisyn_pgmchange __P((struct midi_dev *, int, int));
139 int midisyn_ctlchange __P((struct midi_dev *, int, int, int));
140 int midisyn_pitchbend __P((struct midi_dev *, int, int));
141 int midisyn_loadpatch __P((struct midi_dev *, struct sysex_info *, struct uio *));
142 int midisyn_putc __P((struct midi_dev *, int));
143 void midisyn_in __P((struct midi_dev *, u_char *, int));
144
145 void
146 sequencerattach(n)
147 int n;
148 {
149 }
150
151 int
152 sequenceropen(dev, flags, ifmt, p)
153 dev_t dev;
154 int flags, ifmt;
155 struct proc *p;
156 {
157 int unit = SEQUENCERUNIT(dev);
158 struct sequencer_softc *sc;
159 struct midi_dev *md;
160 int nmidi;
161
162 DPRINTF(("sequenceropen\n"));
163
164 if (unit >= NSEQUENCER)
165 return (ENXIO);
166 sc = &seqdevs[unit];
167 if (sc->isopen)
168 return EBUSY;
169 if (SEQ_IS_OLD(unit))
170 sc->mode = SEQ_OLD;
171 else
172 sc->mode = SEQ_NEW;
173 sc->isopen++;
174 sc->flags = flags & (FREAD|FWRITE);
175 sc->rchan = 0;
176 sc->wchan = 0;
177 sc->pbus = 0;
178 sc->async = 0;
179 sc->input_stamp = ~0;
180
181 sc->nmidi = 0;
182 nmidi = midi_unit_count();
183
184 sc->devs = malloc(nmidi * sizeof(struct midi_dev *),
185 M_DEVBUF, M_WAITOK);
186 for (unit = 0; unit < nmidi; unit++) {
187 md = midisyn_open(unit, flags);
188 if (md) {
189 sc->devs[sc->nmidi++] = md;
190 md->seq = sc;
191 }
192 }
193
194 sc->timer.timebase = 100;
195 sc->timer.tempo = 60;
196 RECALC_TICK(&sc->timer);
197 sc->timer.last = 0;
198 microtime(&sc->timer.start);
199
200 SEQ_QINIT(&sc->inq);
201 SEQ_QINIT(&sc->outq);
202 sc->lowat = SEQ_MAXQ / 2;
203
204 DPRINTF(("sequenceropen: mode=%d, nmidi=%d\n", sc->mode, sc->nmidi));
205 return 0;
206 }
207
208 static int
209 seq_sleep_timo(chan, label, timo)
210 int *chan;
211 char *label;
212 int timo;
213 {
214 int st;
215
216 if (!label)
217 label = "seq";
218
219 DPRINTFN(5, ("seq_sleep_timo: %p %s %d\n", chan, label, timo));
220 *chan = 1;
221 st = tsleep(chan, PWAIT | PCATCH, label, timo);
222 *chan = 0;
223 #ifdef MIDI_DEBUG
224 if (st != 0)
225 printf("seq_sleep: %d\n", st);
226 #endif
227 return st;
228 }
229
230 static int
231 seq_sleep(chan, label)
232 int *chan;
233 char *label;
234 {
235 return seq_sleep_timo(chan, label, 0);
236 }
237
238 static void
239 seq_wakeup(chan)
240 int *chan;
241 {
242 if (*chan) {
243 DPRINTFN(5, ("seq_wakeup: %p\n", chan));
244 wakeup(chan);
245 *chan = 0;
246 }
247 }
248
249 int
250 seq_drain(sc)
251 struct sequencer_softc *sc;
252 {
253 int error;
254
255 DPRINTFN(3, ("seq_drain: %p, len=%d\n", sc, SEQ_QLEN(&sc->outq)));
256 seq_startoutput(sc);
257 error = 0;
258 while(!SEQ_QEMPTY(&sc->outq) && !error)
259 error = seq_sleep_timo(&sc->wchan, "seq dr", 30*hz);
260 return error;
261 }
262
263 void
264 seq_timeout(addr)
265 void *addr;
266 {
267 struct sequencer_softc *sc = addr;
268 DPRINTFN(4, ("seq_timeout: %p\n", sc));
269 sc->timeout = 0;
270 seq_startoutput(sc);
271 if (SEQ_QLEN(&sc->outq) < sc->lowat) {
272 seq_wakeup(&sc->wchan);
273 selwakeup(&sc->wsel);
274 if (sc->async)
275 psignal(sc->async, SIGIO);
276 }
277
278 }
279
280 void
281 seq_startoutput(sc)
282 struct sequencer_softc *sc;
283 {
284 struct sequencer_queue *q = &sc->outq;
285 seq_event_rec cmd;
286
287 if (sc->timeout)
288 return;
289 DPRINTFN(4, ("seq_startoutput: %p, len=%d\n", sc, SEQ_QLEN(q)));
290 while(!SEQ_QEMPTY(q) && !sc->timeout) {
291 SEQ_QGET(q, cmd);
292 seq_do_command(sc, &cmd);
293 }
294 }
295
296 int
297 sequencerclose(dev, flags, ifmt, p)
298 dev_t dev;
299 int flags, ifmt;
300 struct proc *p;
301 {
302 struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)];
303 int n;
304
305 DPRINTF(("sequencerclose: %p\n", sc));
306
307 seq_drain(sc);
308 seq_reset(sc);
309
310 for (n = 0; n < sc->nmidi; n++)
311 midisyn_close(sc->devs[n]);
312 free(sc->devs, M_DEVBUF);
313 sc->isopen = 0;
314 return (0);
315 }
316
317 int
318 seq_input_event(sc, cmd)
319 struct sequencer_softc *sc;
320 seq_event_rec *cmd;
321 {
322 struct sequencer_queue *q = &sc->inq;
323
324 DPRINTFN(2, ("seq_input_event: %02x %02x %02x %02x %02x %02x %02x %02x\n",
325 cmd->arr[0], cmd->arr[1], cmd->arr[2], cmd->arr[3],
326 cmd->arr[4], cmd->arr[5], cmd->arr[6], cmd->arr[7]));
327 if (SEQ_QFULL(q))
328 return (ENOMEM);
329 SEQ_QPUT(q, *cmd);
330 seq_wakeup(&sc->rchan);
331 selwakeup(&sc->rsel);
332 if (sc->async)
333 psignal(sc->async, SIGIO);
334 return 0;
335 }
336
337 void
338 seq_event_intr(addr, iev)
339 void *addr;
340 seq_event_rec *iev;
341 {
342 struct sequencer_softc *sc = addr;
343 union {
344 u_int32_t l;
345 u_int8_t b[4];
346 } u;
347 u_long t;
348 struct timeval now;
349 seq_event_rec ev;
350
351 microtime(&now);
352 SUBTIMEVAL(&now, &sc->timer.start);
353 t = now.tv_sec * 1000000 + now.tv_usec;
354 t /= sc->timer.tick;
355 if (t != sc->input_stamp) {
356 ev.arr[0] = SEQ_TIMING;
357 ev.arr[1] = TMR_WAIT_ABS;
358 ev.arr[2] = 0;
359 ev.arr[3] = 0;
360 u.l = t;
361 ev.arr[4] = u.b[0];
362 ev.arr[5] = u.b[1];
363 ev.arr[6] = u.b[2];
364 ev.arr[7] = u.b[3];
365 seq_input_event(sc, &ev);
366 sc->input_stamp = t;
367 }
368 seq_input_event(sc, iev);
369 }
370
371 int
372 sequencerread(dev, uio, ioflag)
373 dev_t dev;
374 struct uio *uio;
375 int ioflag;
376 {
377 struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)];
378 struct sequencer_queue *q = &sc->inq;
379 seq_event_rec ev;
380 int error, s;
381
382 DPRINTFN(4, ("sequencerread: %p, count=%d, ioflag=%x\n",
383 sc, uio->uio_resid, ioflag));
384
385 if (sc->mode == SEQ_OLD) {
386 return (EINVAL); /* XXX unimplemented */
387 }
388
389 error = 0;
390 while (SEQ_QEMPTY(q)) {
391 if (ioflag & IO_NDELAY)
392 return EWOULDBLOCK;
393 else {
394 error = seq_sleep(&sc->rchan, "seq rd");
395 if (error)
396 return error;
397 }
398 }
399 s = splaudio();
400 while (uio->uio_resid >= sizeof ev && !error && !SEQ_QEMPTY(q)) {
401 SEQ_QGET(q, ev);
402 error = uiomove(&ev, sizeof ev, uio);
403 }
404 splx(s);
405 return error;
406 }
407
408 int
409 sequencerwrite(dev, uio, ioflag)
410 dev_t dev;
411 struct uio *uio;
412 int ioflag;
413 {
414 struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)];
415 struct sequencer_queue *q = &sc->outq;
416 int error;
417 seq_event_rec cmdbuf;
418 int size;
419
420 DPRINTFN(2, ("sequencerwrite: %p, count=%d\n", sc, uio->uio_resid));
421
422 error = 0;
423 size = sc->mode == SEQ_NEW ? sizeof cmdbuf : SEQOLD_CMDSIZE;
424 while (uio->uio_resid >= size) {
425 error = uiomove(&cmdbuf, size, uio);
426 if (error)
427 break;
428 if (sc->mode == SEQ_OLD)
429 if (seq_to_new(&cmdbuf, uio))
430 continue;
431 if (SEQ_CMD(&cmdbuf) == SEQ_FULLSIZE) {
432 /* We do it like OSS does, asynchronously */
433 error = seq_do_fullsize(sc, &cmdbuf, uio);
434 if (error)
435 break;
436 continue;
437 }
438 while (SEQ_QFULL(q)) {
439 seq_startoutput(sc);
440 if (SEQ_QFULL(q)) {
441 if (ioflag & IO_NDELAY)
442 return EWOULDBLOCK;
443 error = seq_sleep(&sc->wchan, "seq wr");
444 if (error)
445 return error;
446 }
447 }
448 SEQ_QPUT(q, cmdbuf);
449 }
450 seq_startoutput(sc);
451
452 #ifdef SEQUENCER_DEBUG
453 if (error)
454 DPRINTFN(2, ("sequencerwrite: error=%d\n", error));
455 #endif
456 return error;
457 }
458
459 int
460 sequencerioctl(dev, cmd, addr, flag, p)
461 dev_t dev;
462 u_long cmd;
463 caddr_t addr;
464 int flag;
465 struct proc *p;
466 {
467 struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)];
468 struct synth_info *si;
469 struct midi_dev *md;
470 int devno;
471 int error;
472 int t;
473
474 DPRINTFN(2, ("sequencerioctl: %p cmd=0x%08lx\n", sc, cmd));
475
476 error = 0;
477 switch (cmd) {
478 case FIONBIO:
479 /* All handled in the upper FS layer. */
480 break;
481
482 case FIOASYNC:
483 if (*(int *)addr) {
484 if (sc->async)
485 return EBUSY;
486 sc->async = p;
487 DPRINTF(("sequencer_ioctl: FIOASYNC %p\n", p));
488 } else
489 sc->async = 0;
490 break;
491
492 case SEQUENCER_RESET:
493 seq_reset(sc);
494 break;
495
496 case SEQUENCER_PANIC:
497 seq_reset(sc);
498 /* Do more? OSS doesn't */
499 break;
500
501 case SEQUENCER_SYNC:
502 if (sc->flags == FREAD)
503 return 0;
504 seq_drain(sc);
505 error = 0;
506 break;
507
508 case SEQUENCER_INFO:
509 si = (struct synth_info*)addr;
510 devno = si->device;
511 if (devno < 0 || devno >= sc->nmidi)
512 return EINVAL;
513 md = sc->devs[devno];
514 strncpy(si->name, md->name, sizeof si->name);
515 si->synth_type = SYNTH_TYPE_MIDI;
516 si->synth_subtype = md->subtype;
517 si->nr_voices = md->nr_voices;
518 si->instr_bank_size = md->instr_bank_size;
519 si->capabilities = md->capabilities;
520 break;
521
522 case SEQUENCER_NRSYNTHS:
523 *(int *)addr = 0;
524 break;
525
526 case SEQUENCER_NRMIDIS:
527 *(int *)addr = sc->nmidi;
528 break;
529
530 case SEQUENCER_OUTOFBAND:
531 DPRINTFN(3, ("sequencer_ioctl: OOB=%02x %02x %02x %02x %02x %02x %02x %02x\n",
532 *(u_char *)addr, *(u_char *)(addr+1),
533 *(u_char *)(addr+2), *(u_char *)(addr+3),
534 *(u_char *)(addr+4), *(u_char *)(addr+5),
535 *(u_char *)(addr+6), *(u_char *)(addr+7)));
536 error = seq_do_command(sc, (seq_event_rec *)addr);
537 break;
538
539 case SEQUENCER_TMR_TIMEBASE:
540 t = *(int *)addr;
541 if (t < 1)
542 t = 1;
543 if (t > 1000)
544 t = 1000;
545 sc->timer.timebase = t;
546 *(int *)addr = t;
547 RECALC_TICK(&sc->timer);
548 break;
549
550 case SEQUENCER_TMR_START:
551 error = seq_timer(sc, TMR_START, 0, 0);
552 break;
553
554 case SEQUENCER_TMR_STOP:
555 error = seq_timer(sc, TMR_STOP, 0, 0);
556 break;
557
558 case SEQUENCER_TMR_CONTINUE:
559 error = seq_timer(sc, TMR_CONTINUE, 0, 0);
560 break;
561
562 case SEQUENCER_TMR_TEMPO:
563 t = *(int *)addr;
564 if (t < 8)
565 t = 8;
566 if (t > 250)
567 t = 250;
568 sc->timer.tempo = t;
569 *(int *)addr = t;
570 RECALC_TICK(&sc->timer);
571 break;
572
573 case SEQUENCER_TMR_SOURCE:
574 *(int *)addr = SEQUENCER_TMR_INTERNAL;
575 break;
576
577 case SEQUENCER_TMR_METRONOME:
578 /* noop */
579 break;
580
581 case SEQUENCER_THRESHOLD:
582 t = SEQ_MAXQ - *(int *)addr / sizeof (seq_event_rec);
583 if (t < 1)
584 t = 1;
585 if (t > SEQ_MAXQ)
586 t = SEQ_MAXQ;
587 sc->lowat = t;
588 break;
589
590 case SEQUENCER_CTRLRATE:
591 *(int *)addr = (sc->timer.tempo * sc->timer.timebase + 30) / 60;
592 break;
593
594 case SEQUENCER_GETTIME:
595 {
596 struct timeval now;
597 u_long t;
598 microtime(&now);
599 SUBTIMEVAL(&now, &sc->timer.start);
600 t = now.tv_sec * 1000000 + now.tv_usec;
601 t /= sc->timer.tick;
602 *(int *)addr = t;
603 break;
604 }
605
606 default:
607 DPRINTF(("sequencer_ioctl: unimpl %08lx\n", cmd));
608 error = EINVAL;
609 break;
610 }
611 return error;
612 }
613
614 int
615 sequencerpoll(dev, events, p)
616 dev_t dev;
617 int events;
618 struct proc *p;
619 {
620 struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)];
621 int revents = 0;
622
623 DPRINTF(("sequencerpoll: %p events=0x%x\n", sc, events));
624
625 if (events & (POLLIN | POLLRDNORM))
626 if (!SEQ_QEMPTY(&sc->inq))
627 revents |= events & (POLLIN | POLLRDNORM);
628
629 if (events & (POLLOUT | POLLWRNORM))
630 if (SEQ_QLEN(&sc->outq) < sc->lowat)
631 revents |= events & (POLLOUT | POLLWRNORM);
632
633 if (revents == 0) {
634 if (events & (POLLIN | POLLRDNORM))
635 selrecord(p, &sc->rsel);
636
637 if (events & (POLLOUT | POLLWRNORM))
638 selrecord(p, &sc->wsel);
639 }
640
641 return revents;
642 }
643
644 void
645 seq_reset(sc)
646 struct sequencer_softc *sc;
647 {
648 int i, chn;
649 struct midi_dev *md;
650
651 for (i = 0; i < sc->nmidi; i++) {
652 md = sc->devs[i];
653 midisyn_reset(md);
654 for (chn = 0; chn < MAXCHAN; chn++) {
655 midisyn_ctlchange(md, chn, MIDI_CTRL_ALLOFF, 0);
656 midisyn_ctlchange(md, chn, MIDI_CTRL_RESET, 0);
657 midisyn_pitchbend(md, chn, MIDI_BEND_NEUTRAL);
658 }
659 }
660 }
661
662 int
663 seq_do_command(sc, b)
664 struct sequencer_softc *sc;
665 seq_event_rec *b;
666 {
667 int dev;
668
669 DPRINTFN(4, ("seq_do_command: %p cmd=0x%02x\n", sc, SEQ_CMD(b)));
670
671 switch(SEQ_CMD(b)) {
672 case SEQ_LOCAL:
673 return seq_do_local(sc, b);
674 case SEQ_TIMING:
675 return seq_do_timing(sc, b);
676 case SEQ_CHN_VOICE:
677 return seq_do_chnvoice(sc, b);
678 case SEQ_CHN_COMMON:
679 return seq_do_chncommon(sc, b);
680 /* COMPAT */
681 case SEQOLD_MIDIPUTC:
682 dev = b->arr[2];
683 if (dev < 0 || dev >= sc->nmidi)
684 return (ENXIO);
685 return midisyn_putc(sc->devs[dev], b->arr[1]);
686 default:
687 DPRINTF(("seq_do_command: unimpl command %02x\n", SEQ_CMD(b)));
688 return (EINVAL);
689 }
690 }
691
692 int
693 seq_do_chnvoice(sc, b)
694 struct sequencer_softc *sc;
695 seq_event_rec *b;
696 {
697 int cmd, dev, chan, note, parm, voice;
698 int error;
699 struct midi_dev *md;
700
701 dev = SEQ_EDEV(b);
702 if (dev < 0 || dev >= sc->nmidi)
703 return ENXIO;
704 md = sc->devs[dev];
705 cmd = SEQ_ECMD(b);
706 chan = SEQ_ECHAN(b);
707 note = SEQ_ENOTE(b);
708 parm = SEQ_EPARM(b);
709 DPRINTFN(2,("seq_do_chnvoice: cmd=%02x dev=%d chan=%d note=%d parm=%d\n",
710 cmd, dev, chan, note, parm));
711 voice = chan;
712 if (cmd == MIDI_NOTEON && parm == 0) {
713 cmd = MIDI_NOTEOFF;
714 parm = MIDI_HALF_VEL;
715 }
716 switch(cmd) {
717 case MIDI_NOTEON:
718 DPRINTFN(5, ("seq_do_chnvoice: noteon %p %d %d %d\n", md, voice, note, parm));
719 error = midisyn_noteon(md, voice, note, parm);
720 break;
721 case MIDI_NOTEOFF:
722 error = midisyn_noteoff(md, voice, note, parm);
723 break;
724 case MIDI_KEY_PRESSURE:
725 error = midisyn_keypressure(md, voice, note, parm);
726 break;
727 default:
728 DPRINTF(("seq_do_chnvoice: unimpl command %02x\n", cmd));
729 error = EINVAL;
730 break;
731 }
732 return error;
733 }
734
735 int
736 seq_do_chncommon(sc, b)
737 struct sequencer_softc *sc;
738 seq_event_rec *b;
739 {
740 int cmd, dev, chan, p1, w14;
741 int error;
742 struct midi_dev *md;
743 union {
744 int16_t s;
745 u_int8_t b[2];
746 } u;
747
748 dev = SEQ_EDEV(b);
749 if (dev < 0 || dev >= sc->nmidi)
750 return ENXIO;
751 md = sc->devs[dev];
752 cmd = SEQ_ECMD(b);
753 chan = SEQ_ECHAN(b);
754 p1 = SEQ_EP1(b);
755 u.b[0] = b->arr[6];
756 u.b[1] = b->arr[7];
757 w14 = u.s;
758 DPRINTFN(2,("seq_do_chncommon: %02x\n", cmd));
759
760 error = 0;
761 switch(cmd) {
762 case MIDI_PGM_CHANGE:
763 md->chan_info[chan].pgm_num = p1;
764 error = midisyn_pgmchange(md, chan, p1);
765 break;
766 case MIDI_CTL_CHANGE:
767 if (chan > 15 || p1 > 127)
768 return 0; /* EINVAL */
769 md->chan_info[chan].controllers[p1] = w14 & 0x7f;
770 if (p1 < 32)
771 md->chan_info[chan].controllers[p1 + 32] = 0;
772 error = midisyn_ctlchange(md, chan, p1, w14);
773 break;
774 case MIDI_PITCH_BEND:
775 md->chan_info[chan].bender_value = w14;
776 error = midisyn_pitchbend(md, chan, w14);
777 break;
778 default:
779 DPRINTF(("seq_do_chncommon: unimpl command %02x\n", cmd));
780 error = EINVAL;
781 break;
782 }
783 return (error);
784 }
785
786 int
787 seq_do_timing(sc, b)
788 struct sequencer_softc *sc;
789 seq_event_rec *b;
790 {
791 union {
792 int32_t i;
793 u_int8_t b[4];
794 } u;
795 u.b[0] = b->arr[4];
796 u.b[1] = b->arr[5];
797 u.b[2] = b->arr[6];
798 u.b[3] = b->arr[7];
799 return seq_timer(sc, SEQ_TCMD(b), u.i, b);
800 }
801
802 int
803 seq_do_local(sc, b)
804 struct sequencer_softc *sc;
805 seq_event_rec *b;
806 {
807 return (EINVAL);
808 }
809
810 int
811 seq_timer(sc, cmd, parm, b)
812 struct sequencer_softc *sc;
813 int cmd, parm;
814 seq_event_rec *b;
815 {
816 struct syn_timer *t = &sc->timer;
817 struct timeval when;
818 int ticks;
819 int error;
820 long long usec;
821
822 DPRINTFN(2,("seq_timer: %02x %d\n", cmd, parm));
823
824 error = 0;
825 switch(cmd) {
826 case TMR_WAIT_REL:
827 parm += t->last;
828 /* fall into */
829 case TMR_WAIT_ABS:
830 t->last = parm;
831 usec = (long long)parm * (long long)t->tick; /* convert to usec */
832 when.tv_sec = usec / 1000000;
833 when.tv_usec = usec % 1000000;
834 DPRINTFN(4, ("seq_timer: parm=%d, sleep when=%ld.%06ld", parm,
835 when.tv_sec, when.tv_usec));
836 ADDTIMEVAL(&when, &t->start); /* abstime for end */
837 ticks = hzto(&when);
838 DPRINTFN(4, (" when+start=%ld.%06ld, tick=%d\n",
839 when.tv_sec, when.tv_usec, ticks));
840 if (ticks > 0) {
841 #ifdef DIAGNOSTIC
842 if (ticks > 20 * hz) {
843 /* Waiting more than 20s */
844 printf("seq_timer: funny ticks=%d, usec=%lld, parm=%d, tick=%ld\n",
845 ticks, usec, parm, t->tick);
846 ticks = 20 * hz;
847 }
848 #endif
849 sc->timeout = 1;
850 timeout(seq_timeout, sc, ticks);
851 }
852 #ifdef SEQUENCER_DEBUG
853 else if (tick < 0)
854 DPRINTF(("seq_timer: ticks = %d\n", ticks));
855 #endif
856 break;
857 case TMR_START:
858 microtime(&t->start);
859 t->running = 1;
860 break;
861 case TMR_STOP:
862 microtime(&t->stop);
863 t->running = 0;
864 break;
865 case TMR_CONTINUE:
866 microtime(&when);
867 SUBTIMEVAL(&when, &t->stop);
868 ADDTIMEVAL(&t->start, &when);
869 t->running = 1;
870 break;
871 case TMR_TEMPO:
872 /* parm is ticks per minute / timebase */
873 if (parm < 8)
874 parm = 8;
875 if (parm > 360)
876 parm = 360;
877 t->tempo = parm;
878 RECALC_TICK(t);
879 break;
880 case TMR_ECHO:
881 error = seq_input_event(sc, b);
882 break;
883 case TMR_RESET:
884 t->last = 0;
885 microtime(&t->start);
886 break;
887 default:
888 DPRINTF(("seq_timer: unknown %02x\n", cmd));
889 error = EINVAL;
890 break;
891 }
892 return (error);
893 }
894
895 int
896 seq_do_fullsize(sc, b, uio)
897 struct sequencer_softc *sc;
898 seq_event_rec *b;
899 struct uio *uio;
900 {
901 struct sysex_info sysex;
902 u_int dev;
903
904 #ifdef DIAGNOSTIC
905 if (sizeof(seq_event_rec) != SEQ_SYSEX_HDRSIZE) {
906 printf("seq_do_fullsize: sysex size ??\n");
907 return EINVAL;
908 }
909 #endif
910 memcpy(&sysex, b, sizeof sysex);
911 dev = sysex.device_no;
912 DPRINTFN(2, ("seq_do_fullsize: fmt=%04x, dev=%d, len=%d\n",
913 sysex.key, dev, sysex.len));
914 return (midisyn_loadpatch(sc->devs[dev], &sysex, uio));
915 }
916
917 /* Convert an old sequencer event to a new one. */
918 int
919 seq_to_new(ev, uio)
920 seq_event_rec *ev;
921 struct uio *uio;
922 {
923 int cmd, chan, note, parm;
924 u_int32_t delay;
925 int error;
926
927 cmd = SEQ_CMD(ev);
928 chan = ev->arr[1];
929 note = ev->arr[2];
930 parm = ev->arr[3];
931 DPRINTFN(3, ("seq_to_new: 0x%02x %d %d %d\n", cmd, chan, note, parm));
932
933 if (cmd >= 0x80) {
934 /* Fill the event record */
935 if (uio->uio_resid >= sizeof *ev - SEQOLD_CMDSIZE) {
936 error = uiomove(&ev->arr[SEQOLD_CMDSIZE],
937 sizeof *ev - SEQOLD_CMDSIZE, uio);
938 if (error)
939 return error;
940 } else
941 return EINVAL;
942 }
943
944 switch(cmd) {
945 case SEQOLD_NOTEOFF:
946 note = 255;
947 SEQ_ECMD(ev) = MIDI_NOTEOFF;
948 goto onoff;
949 case SEQOLD_NOTEON:
950 SEQ_ECMD(ev) = MIDI_NOTEON;
951 onoff:
952 SEQ_CMD(ev) = SEQ_CHN_VOICE;
953 SEQ_EDEV(ev) = 0;
954 SEQ_ECHAN(ev) = chan;
955 SEQ_ENOTE(ev) = note;
956 SEQ_EPARM(ev) = parm;
957 break;
958 case SEQOLD_WAIT:
959 delay = *(u_int32_t *)ev->arr >> 8;
960 SEQ_CMD(ev) = SEQ_TIMING;
961 SEQ_TCMD(ev) = TMR_WAIT_REL;
962 *(u_int32_t *)&ev->arr[4] = delay;
963 break;
964 case SEQOLD_SYNCTIMER:
965 SEQ_CMD(ev) = SEQ_TIMING;
966 SEQ_TCMD(ev) = TMR_RESET;
967 break;
968 case SEQOLD_PGMCHANGE:
969 SEQ_ECMD(ev) = MIDI_PGM_CHANGE;
970 SEQ_CMD(ev) = SEQ_CHN_COMMON;
971 SEQ_EDEV(ev) = 0;
972 SEQ_ECHAN(ev) = chan;
973 SEQ_EP1(ev) = note;
974 break;
975 case SEQOLD_MIDIPUTC:
976 break; /* interpret in normal mode */
977 case SEQOLD_ECHO:
978 case SEQOLD_PRIVATE:
979 case SEQOLD_EXTENDED:
980 default:
981 DPRINTF(("seq_to_new: not impl 0x%02x\n", cmd));
982 return EINVAL;
983 /* In case new events show up */
984 case SEQ_TIMING:
985 case SEQ_CHN_VOICE:
986 case SEQ_CHN_COMMON:
987 case SEQ_FULLSIZE:
988 break;
989 }
990 return 0;
991 }
992
993 /**********************************************/
994
995 void
996 midisyn_in(md, msg, len)
997 struct midi_dev *md;
998 u_char *msg;
999 int len;
1000 {
1001 int unit = md->unit;
1002 seq_event_rec ev;
1003 int status, chan;
1004
1005 DPRINTFN(2, ("midisyn_in: %p %02x %02x %02x\n",
1006 md, msg[0], msg[1], msg[2]));
1007
1008 status = MIDI_GET_STATUS(msg[0]);
1009 chan = MIDI_GET_CHAN(msg[0]);
1010 switch (status) {
1011 case MIDI_NOTEON:
1012 if (msg[2] == 0) {
1013 status = MIDI_NOTEOFF;
1014 msg[2] = MIDI_HALF_VEL;
1015 }
1016 /* fall into */
1017 case MIDI_NOTEOFF:
1018 case MIDI_KEY_PRESSURE:
1019 SEQ_MK_CHN_VOICE(&ev, unit, status, chan, msg[1], msg[2]);
1020 break;
1021 case MIDI_CTL_CHANGE:
1022 SEQ_MK_CHN_COMMON(&ev, unit, status, chan, msg[1], 0, msg[2]);
1023 break;
1024 case MIDI_PGM_CHANGE:
1025 case MIDI_CHN_PRESSURE:
1026 SEQ_MK_CHN_COMMON(&ev, unit, status, chan, msg[1], 0, 0);
1027 break;
1028 case MIDI_PITCH_BEND:
1029 SEQ_MK_CHN_COMMON(&ev, unit, status, chan, 0, 0,
1030 (msg[1] & 0x7f) | ((msg[2] & 0x7f) << 7));
1031 break;
1032 default:
1033 return;
1034 }
1035 seq_event_intr(md->seq, &ev);
1036 }
1037
1038 struct midi_dev *
1039 midisyn_open(unit, flags)
1040 int unit;
1041 int flags;
1042 {
1043 extern struct cfdriver midi_cd;
1044 int error;
1045 struct midi_dev *md;
1046 struct midi_softc *sc;
1047 struct midi_info mi;
1048
1049 DPRINTFN(2, ("midisyn_open: %d %d\n", unit, flags));
1050 error = midiopen(makedev(0, unit), flags, 0, 0);
1051 if (error)
1052 return (0);
1053 sc = midi_cd.cd_devs[unit];
1054 sc->seqopen = 1;
1055 md = malloc(sizeof *md, M_DEVBUF, M_WAITOK);
1056 memset(md, 0, sizeof *md);
1057 md->msc = sc;
1058 midi_getinfo(makedev(0, unit), &mi);
1059 md->unit = unit;
1060 md->name = mi.name;
1061 md->subtype = 0;
1062 md->nr_voices = 128; /* XXX */
1063 md->instr_bank_size = 128; /* XXX */
1064 if (mi.props & MIDI_PROP_CAN_INPUT)
1065 md->capabilities |= SYNTH_CAP_INPUT;
1066 return (md);
1067 }
1068
1069 void
1070 midisyn_close(md)
1071 struct midi_dev *md;
1072 {
1073 DPRINTFN(2, ("midisyn_close: %d\n", md->unit));
1074 midiclose(makedev(0, md->unit), 0, 0, 0);
1075 free(md, M_DEVBUF);
1076 }
1077
1078 void
1079 midisyn_reset(md)
1080 struct midi_dev *md;
1081 {
1082 DPRINTFN(3, ("midisyn_reset: %d\n", md->unit));
1083 }
1084
1085 int
1086 midiout(md, buf, cc, chk)
1087 struct midi_dev *md;
1088 u_char *buf;
1089 u_int cc;
1090 int chk;
1091 {
1092 struct uio uio;
1093 struct iovec iovec;
1094
1095 DPRINTFN(5, ("midiout: m=%p, unit=%d, buf[0]=0x%02x, cc=%d\n",
1096 md->msc, md->unit, buf[0], cc));
1097 #if 1
1098 /* The MIDI "status" byte does not have to be repeated. */
1099 if (chk && md->last_cmd == buf[0])
1100 buf++, cc--;
1101 else
1102 #endif
1103 md->last_cmd = buf[0];
1104 iovec.iov_base = (char *)buf;
1105 iovec.iov_len = cc;
1106 uio.uio_iov = &iovec;
1107 uio.uio_iovcnt = 1;
1108 uio.uio_offset = 0;
1109 uio.uio_resid = cc;
1110 uio.uio_segflg = UIO_SYSSPACE;
1111 uio.uio_rw = UIO_WRITE;
1112 uio.uio_procp = 0; /* process not needed for UIO_SYSSPACE */
1113 return midiwrite(makedev(0, md->unit), &uio, 0);
1114 }
1115
1116 int
1117 midisyn_noteon(md, chan, note, vel)
1118 struct midi_dev *md;
1119 int chan, note, vel;
1120 {
1121 u_char buf[3];
1122
1123 DPRINTFN(6, ("midisyn_noteon 0x%02x %d %d\n",
1124 MIDI_NOTEON | chan, note, vel));
1125 if (chan < 0 || chan > 15 ||
1126 note < 0 || note > 127)
1127 return EINVAL;
1128 if (vel < 0) vel = 0;
1129 if (vel > 127) vel = 127;
1130 buf[0] = MIDI_NOTEON | chan;
1131 buf[1] = note;
1132 buf[2] = vel;
1133 return midiout(md, buf, 3, 1);
1134 }
1135
1136 int
1137 midisyn_noteoff(md, chan, note, vel)
1138 struct midi_dev *md;
1139 int chan, note, vel;
1140 {
1141 u_char buf[3];
1142
1143 if (chan < 0 || chan > 15 ||
1144 note < 0 || note > 127)
1145 return EINVAL;
1146 if (vel < 0) vel = 0;
1147 if (vel > 127) vel = 127;
1148 buf[0] = MIDI_NOTEOFF | chan;
1149 buf[1] = note;
1150 buf[2] = vel;
1151 return midiout(md, buf, 3, 1);
1152 }
1153
1154 int
1155 midisyn_keypressure(md, chan, note, vel)
1156 struct midi_dev *md;
1157 int chan, note, vel;
1158 {
1159 u_char buf[3];
1160
1161 if (chan < 0 || chan > 15 ||
1162 note < 0 || note > 127)
1163 return EINVAL;
1164 if (vel < 0) vel = 0;
1165 if (vel > 127) vel = 127;
1166 buf[0] = MIDI_KEY_PRESSURE | chan;
1167 buf[1] = note;
1168 buf[2] = vel;
1169 return midiout(md, buf, 3, 1);
1170 }
1171
1172 int
1173 midisyn_pgmchange(md, chan, parm)
1174 struct midi_dev *md;
1175 int chan, parm;
1176 {
1177 u_char buf[2];
1178
1179 if (chan < 0 || chan > 15 ||
1180 parm < 0 || parm > 127)
1181 return EINVAL;
1182 buf[0] = MIDI_PGM_CHANGE | chan;
1183 buf[1] = parm;
1184 return midiout(md, buf, 2, 1);
1185 }
1186
1187 int
1188 midisyn_ctlchange(md, chan, parm, w14)
1189 struct midi_dev *md;
1190 int chan, parm, w14;
1191 {
1192 u_char buf[3];
1193
1194 if (chan < 0 || chan > 15 ||
1195 parm < 0 || parm > 127)
1196 return EINVAL;
1197 buf[0] = MIDI_CTL_CHANGE | chan;
1198 buf[1] = parm;
1199 buf[2] = w14 & 0x7f;
1200 return midiout(md, buf, 3, 1);
1201 }
1202
1203 int
1204 midisyn_pitchbend(md, chan, parm)
1205 struct midi_dev *md;
1206 int chan, parm;
1207 {
1208 u_char buf[3];
1209
1210 if (chan < 0 || chan > 15)
1211 return EINVAL;
1212 buf[0] = MIDI_PITCH_BEND | chan;
1213 buf[1] = parm & 0x7f;
1214 buf[2] = (parm >> 7) & 0x7f;
1215 return midiout(md, buf, 3, 1);
1216 }
1217
1218 int
1219 midisyn_loadpatch(md, sysex, uio)
1220 struct midi_dev *md;
1221 struct sysex_info *sysex;
1222 struct uio *uio;
1223 {
1224 u_char c, buf[128];
1225 int i, cc, error;
1226
1227 if (sysex->key != SEQ_SYSEX_PATCH)
1228 return EINVAL;
1229 if (uio->uio_resid < sysex->len)
1230 /* adjust length, should be an error */
1231 sysex->len = uio->uio_resid;
1232
1233 DPRINTFN(2, ("midisyn_loadpatch: len=%d\n", sysex->len));
1234 if (sysex->len == 0)
1235 return EINVAL;
1236 error = uiomove(&c, 1, uio);
1237 if (error)
1238 return error;
1239 if (c != MIDI_SYSEX_START) /* must start like this */
1240 return EINVAL;
1241 error = midiout(md, &c, 1, 0);
1242 if (error)
1243 return error;
1244 --sysex->len;
1245 while (sysex->len > 0) {
1246 cc = sysex->len;
1247 if (cc > sizeof buf)
1248 cc = sizeof buf;
1249 error = uiomove(buf, cc, uio);
1250 if (error)
1251 break;
1252 for(i = 0; i < cc && !MIDI_IS_STATUS(buf[i]); i++)
1253 ;
1254 error = midiout(md, buf, i, 0);
1255 if (error)
1256 break;
1257 sysex->len -= i;
1258 if (i != cc)
1259 break;
1260 }
1261 /* Any leftover data in uio is rubbish;
1262 * the SYSEX should be one write ending in SYSXE_END.
1263 */
1264 uio->uio_resid = 0;
1265 c = MIDI_SYSEX_END;
1266 return midiout(md, &c, 1, 0);
1267 }
1268
1269 int
1270 midisyn_putc(md, data)
1271 struct midi_dev *md;
1272 int data;
1273 {
1274 u_char c = data;
1275 DPRINTFN(4,("midisyn_putc: 0x%02x\n", data));
1276 return midiout(md, &c, 1, 0);
1277 }
1278
1279
1280 #endif
1281