sequencer.c revision 1.1 1 /* $NetBSD: sequencer.c,v 1.1 1998/08/07 00:00:58 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 int devno;
470 int error;
471 int t;
472
473 DPRINTFN(2, ("sequencerioctl: %p cmd=0x%08lx\n", sc, cmd));
474
475 error = 0;
476 switch (cmd) {
477 case FIONBIO:
478 /* All handled in the upper FS layer. */
479 break;
480
481 case FIOASYNC:
482 if (*(int *)addr) {
483 if (sc->async)
484 return EBUSY;
485 sc->async = p;
486 DPRINTF(("sequencer_ioctl: FIOASYNC %p\n", p));
487 } else
488 sc->async = 0;
489 break;
490
491 case SEQUENCER_RESET:
492 seq_reset(sc);
493 break;
494
495 case SEQUENCER_PANIC:
496 seq_reset(sc);
497 /* Do more? OSS doesn't */
498 break;
499
500 case SEQUENCER_SYNC:
501 if (sc->flags == FREAD)
502 return 0;
503 seq_drain(sc);
504 error = 0;
505 break;
506
507 case SEQUENCER_INFO:
508 si = (struct synth_info*)addr;
509 devno = si->device;
510 if (devno < 0 || devno >= sc->nmidi)
511 return EINVAL;
512 strncpy(si->name, "XXXX", sizeof si->name); /*sc->devs[devno]->name);*/
513 si->synth_type = SYNTH_TYPE_MIDI;
514 si->synth_subtype = SYNTH_SUB_MIDI_TYPE_MPU401; /* XXX */
515 si->nr_voices = 128; /* XXX */
516 si->instr_bank_size = 128; /* XXX */
517 si->capabilities = SYNTH_CAP_INPUT; /* XXX */
518 break;
519
520 case SEQUENCER_NRSYNTHS:
521 *(int *)addr = sc->nmidi;
522 break;
523
524 case SEQUENCER_NRMIDIS:
525 *(int *)addr = sc->nmidi;
526 break;
527
528 case SEQUENCER_OUTOFBAND:
529 DPRINTFN(3, ("sequencer_ioctl: OOB=%02x %02x %02x %02x %02x %02x %02x %02x\n",
530 *(u_char *)addr, *(u_char *)(addr+1),
531 *(u_char *)(addr+2), *(u_char *)(addr+3),
532 *(u_char *)(addr+4), *(u_char *)(addr+5),
533 *(u_char *)(addr+6), *(u_char *)(addr+7)));
534 error = seq_do_command(sc, (seq_event_rec *)addr);
535 break;
536
537 case SEQUENCER_TMR_TIMEBASE:
538 t = *(int *)addr;
539 if (t < 1)
540 t = 1;
541 if (t > 1000)
542 t = 1000;
543 sc->timer.timebase = t;
544 *(int *)addr = t;
545 RECALC_TICK(&sc->timer);
546 break;
547
548 case SEQUENCER_TMR_START:
549 error = seq_timer(sc, TMR_START, 0, 0);
550 break;
551
552 case SEQUENCER_TMR_STOP:
553 error = seq_timer(sc, TMR_STOP, 0, 0);
554 break;
555
556 case SEQUENCER_TMR_CONTINUE:
557 error = seq_timer(sc, TMR_CONTINUE, 0, 0);
558 break;
559
560 case SEQUENCER_TMR_TEMPO:
561 t = *(int *)addr;
562 if (t < 8)
563 t = 8;
564 if (t > 250)
565 t = 250;
566 sc->timer.tempo = t;
567 *(int *)addr = t;
568 RECALC_TICK(&sc->timer);
569 break;
570
571 case SEQUENCER_TMR_SOURCE:
572 *(int *)addr = SEQUENCER_TMR_INTERNAL;
573 break;
574
575 case SEQUENCER_TMR_METRONOME:
576 /* noop */
577 break;
578
579 case SEQUENCER_THRESHOLD:
580 t = SEQ_MAXQ - *(int *)addr / sizeof (seq_event_rec);
581 if (t < 1)
582 t = 1;
583 if (t > SEQ_MAXQ)
584 t = SEQ_MAXQ;
585 sc->lowat = t;
586 break;
587
588 case SEQUENCER_CTRLRATE:
589 *(int *)addr = (sc->timer.tempo * sc->timer.timebase + 30) / 60;
590 break;
591
592 case SEQUENCER_GETTIME:
593 {
594 struct timeval now;
595 u_long t;
596 microtime(&now);
597 SUBTIMEVAL(&now, &sc->timer.start);
598 t = now.tv_sec * 1000000 + now.tv_usec;
599 t /= sc->timer.tick;
600 *(int *)addr = t;
601 break;
602 }
603
604 default:
605 DPRINTF(("sequencer_ioctl: unimpl %08lx\n", cmd));
606 error = EINVAL;
607 break;
608 }
609 return error;
610 }
611
612 int
613 sequencerpoll(dev, events, p)
614 dev_t dev;
615 int events;
616 struct proc *p;
617 {
618 struct sequencer_softc *sc = &seqdevs[SEQUENCERUNIT(dev)];
619 int revents = 0;
620
621 DPRINTF(("sequencerpoll: %p events=0x%x\n", sc, events));
622
623 if (events & (POLLIN | POLLRDNORM))
624 if (!SEQ_QEMPTY(&sc->inq))
625 revents |= events & (POLLIN | POLLRDNORM);
626
627 if (events & (POLLOUT | POLLWRNORM))
628 if (SEQ_QLEN(&sc->outq) < sc->lowat)
629 revents |= events & (POLLOUT | POLLWRNORM);
630
631 if (revents == 0) {
632 if (events & (POLLIN | POLLRDNORM))
633 selrecord(p, &sc->rsel);
634
635 if (events & (POLLOUT | POLLWRNORM))
636 selrecord(p, &sc->wsel);
637 }
638
639 return revents;
640 }
641
642 void
643 seq_reset(sc)
644 struct sequencer_softc *sc;
645 {
646 int i, chn;
647 struct midi_dev *md;
648
649 for (i = 0; i < sc->nmidi; i++) {
650 md = sc->devs[i];
651 midisyn_reset(md);
652 for (chn = 0; chn < MAXCHAN; chn++) {
653 midisyn_ctlchange(md, chn, MIDI_CTRL_ALLOFF, 0);
654 midisyn_ctlchange(md, chn, MIDI_CTRL_RESET, 0);
655 midisyn_pitchbend(md, chn, MIDI_BEND_NEUTRAL);
656 }
657 }
658 }
659
660 int
661 seq_do_command(sc, b)
662 struct sequencer_softc *sc;
663 seq_event_rec *b;
664 {
665 int dev;
666
667 DPRINTFN(4, ("seq_do_command: %p cmd=0x%02x\n", sc, SEQ_CMD(b)));
668
669 switch(SEQ_CMD(b)) {
670 case SEQ_LOCAL:
671 return seq_do_local(sc, b);
672 case SEQ_TIMING:
673 return seq_do_timing(sc, b);
674 case SEQ_CHN_VOICE:
675 return seq_do_chnvoice(sc, b);
676 case SEQ_CHN_COMMON:
677 return seq_do_chncommon(sc, b);
678 /* COMPAT */
679 case SEQOLD_MIDIPUTC:
680 dev = b->arr[2];
681 if (dev < 0 || dev >= sc->nmidi)
682 return (ENXIO);
683 return midisyn_putc(sc->devs[dev], b->arr[1]);
684 default:
685 DPRINTF(("seq_do_command: unimpl command %02x\n", SEQ_CMD(b)));
686 return (EINVAL);
687 }
688 }
689
690 int
691 seq_do_chnvoice(sc, b)
692 struct sequencer_softc *sc;
693 seq_event_rec *b;
694 {
695 int cmd, dev, chan, note, parm, voice;
696 int error;
697 struct midi_dev *md;
698
699 dev = SEQ_EDEV(b);
700 if (dev < 0 || dev >= sc->nmidi)
701 return ENXIO;
702 md = sc->devs[dev];
703 cmd = SEQ_ECMD(b);
704 chan = SEQ_ECHAN(b);
705 note = SEQ_ENOTE(b);
706 parm = SEQ_EPARM(b);
707 DPRINTFN(2,("seq_do_chnvoice: cmd=%02x dev=%d chan=%d note=%d parm=%d\n",
708 cmd, dev, chan, note, parm));
709 voice = chan;
710 if (cmd == MIDI_NOTEON && parm == 0) {
711 cmd = MIDI_NOTEOFF;
712 parm = MIDI_HALF_VEL;
713 }
714 switch(cmd) {
715 case MIDI_NOTEON:
716 DPRINTFN(5, ("seq_do_chnvoice: noteon %p %d %d %d\n", md, voice, note, parm));
717 error = midisyn_noteon(md, voice, note, parm);
718 break;
719 case MIDI_NOTEOFF:
720 error = midisyn_noteoff(md, voice, note, parm);
721 break;
722 case MIDI_KEY_PRESSURE:
723 error = midisyn_keypressure(md, voice, note, parm);
724 break;
725 default:
726 DPRINTF(("seq_do_chnvoice: unimpl command %02x\n", cmd));
727 error = EINVAL;
728 break;
729 }
730 return error;
731 }
732
733 int
734 seq_do_chncommon(sc, b)
735 struct sequencer_softc *sc;
736 seq_event_rec *b;
737 {
738 int cmd, dev, chan, p1, w14;
739 int error;
740 struct midi_dev *md;
741 union {
742 int16_t s;
743 u_int8_t b[2];
744 } u;
745
746 dev = SEQ_EDEV(b);
747 if (dev < 0 || dev >= sc->nmidi)
748 return ENXIO;
749 md = sc->devs[dev];
750 cmd = SEQ_ECMD(b);
751 chan = SEQ_ECHAN(b);
752 p1 = SEQ_EP1(b);
753 u.b[0] = b->arr[6];
754 u.b[1] = b->arr[7];
755 w14 = u.s;
756 DPRINTFN(2,("seq_do_chncommon: %02x\n", cmd));
757
758 error = 0;
759 switch(cmd) {
760 case MIDI_PGM_CHANGE:
761 md->chan_info[chan].pgm_num = p1;
762 error = midisyn_pgmchange(md, chan, p1);
763 break;
764 case MIDI_CTL_CHANGE:
765 if (chan > 15 || p1 > 127)
766 return 0; /* EINVAL */
767 md->chan_info[chan].controllers[p1] = w14 & 0x7f;
768 if (p1 < 32)
769 md->chan_info[chan].controllers[p1 + 32] = 0;
770 error = midisyn_ctlchange(md, chan, p1, w14);
771 break;
772 case MIDI_PITCH_BEND:
773 md->chan_info[chan].bender_value = w14;
774 error = midisyn_pitchbend(md, chan, w14);
775 break;
776 default:
777 DPRINTF(("seq_do_chncommon: unimpl command %02x\n", cmd));
778 error = EINVAL;
779 break;
780 }
781 return (error);
782 }
783
784 int
785 seq_do_timing(sc, b)
786 struct sequencer_softc *sc;
787 seq_event_rec *b;
788 {
789 union {
790 int32_t i;
791 u_int8_t b[4];
792 } u;
793 u.b[0] = b->arr[4];
794 u.b[1] = b->arr[5];
795 u.b[2] = b->arr[6];
796 u.b[3] = b->arr[7];
797 return seq_timer(sc, SEQ_TCMD(b), u.i, b);
798 }
799
800 int
801 seq_do_local(sc, b)
802 struct sequencer_softc *sc;
803 seq_event_rec *b;
804 {
805 return (EINVAL);
806 }
807
808 int
809 seq_timer(sc, cmd, parm, b)
810 struct sequencer_softc *sc;
811 int cmd, parm;
812 seq_event_rec *b;
813 {
814 struct syn_timer *t = &sc->timer;
815 struct timeval when;
816 int ticks;
817 int error;
818 long long usec;
819
820 DPRINTFN(2,("seq_timer: %02x %d\n", cmd, parm));
821
822 error = 0;
823 switch(cmd) {
824 case TMR_WAIT_REL:
825 parm += t->last;
826 /* fall into */
827 case TMR_WAIT_ABS:
828 t->last = parm;
829 usec = (long long)parm * (long long)t->tick; /* convert to usec */
830 when.tv_sec = usec / 1000000;
831 when.tv_usec = usec % 1000000;
832 DPRINTFN(4, ("seq_timer: parm=%d, sleep when=%ld.%06ld", parm,
833 when.tv_sec, when.tv_usec));
834 ADDTIMEVAL(&when, &t->start); /* abstime for end */
835 ticks = hzto(&when);
836 DPRINTFN(4, (" when+start=%ld.%06ld, tick=%d\n",
837 when.tv_sec, when.tv_usec, ticks));
838 if (ticks > 0) {
839 #ifdef DIAGNOSTIC
840 if (ticks > 20 * hz) {
841 /* Waiting more than 20s */
842 printf("seq_timer: funny ticks=%d, usec=%lld, parm=%d, tick=%ld\n",
843 ticks, usec, parm, t->tick);
844 ticks = 20 * hz;
845 }
846 #endif
847 sc->timeout = 1;
848 timeout(seq_timeout, sc, ticks);
849 }
850 #ifdef SEQUENCER_DEBUG
851 else if (tick < 0)
852 DPRINTF(("seq_timer: ticks = %d\n", ticks));
853 #endif
854 break;
855 case TMR_START:
856 microtime(&t->start);
857 t->running = 1;
858 break;
859 case TMR_STOP:
860 microtime(&t->stop);
861 t->running = 0;
862 break;
863 case TMR_CONTINUE:
864 microtime(&when);
865 SUBTIMEVAL(&when, &t->stop);
866 ADDTIMEVAL(&t->start, &when);
867 t->running = 1;
868 break;
869 case TMR_TEMPO:
870 /* parm is ticks per minute / timebase */
871 if (parm < 8)
872 parm = 8;
873 if (parm > 360)
874 parm = 360;
875 t->tempo = parm;
876 RECALC_TICK(t);
877 break;
878 case TMR_ECHO:
879 error = seq_input_event(sc, b);
880 break;
881 case TMR_RESET:
882 t->last = 0;
883 microtime(&t->start);
884 break;
885 default:
886 DPRINTF(("seq_timer: unknown %02x\n", cmd));
887 error = EINVAL;
888 break;
889 }
890 return (error);
891 }
892
893 int
894 seq_do_fullsize(sc, b, uio)
895 struct sequencer_softc *sc;
896 seq_event_rec *b;
897 struct uio *uio;
898 {
899 struct sysex_info sysex;
900 u_int dev;
901
902 #ifdef DIAGNOSTIC
903 if (sizeof(seq_event_rec) != SEQ_SYSEX_HDRSIZE) {
904 printf("seq_do_fullsize: sysex size ??\n");
905 return EINVAL;
906 }
907 #endif
908 memcpy(&sysex, b, sizeof sysex);
909 dev = sysex.device_no;
910 DPRINTFN(2, ("seq_do_fullsize: fmt=%04x, dev=%d, len=%d\n",
911 sysex.key, dev, sysex.len));
912 return (midisyn_loadpatch(sc->devs[dev], &sysex, uio));
913 }
914
915 /* Convert an old sequencer event to a new one. */
916 int
917 seq_to_new(ev, uio)
918 seq_event_rec *ev;
919 struct uio *uio;
920 {
921 int cmd, chan, note, parm;
922 u_int32_t delay;
923 int error;
924
925 cmd = SEQ_CMD(ev);
926 chan = ev->arr[1];
927 note = ev->arr[2];
928 parm = ev->arr[3];
929 DPRINTFN(3, ("seq_to_new: 0x%02x %d %d %d\n", cmd, chan, note, parm));
930
931 if (cmd >= 0x80) {
932 /* Fill the event record */
933 if (uio->uio_resid >= sizeof *ev - SEQOLD_CMDSIZE) {
934 error = uiomove(&ev->arr[SEQOLD_CMDSIZE],
935 sizeof *ev - SEQOLD_CMDSIZE, uio);
936 if (error)
937 return error;
938 } else
939 return EINVAL;
940 }
941
942 switch(cmd) {
943 case SEQOLD_NOTEOFF:
944 note = 255;
945 SEQ_ECMD(ev) = MIDI_NOTEOFF;
946 goto onoff;
947 case SEQOLD_NOTEON:
948 SEQ_ECMD(ev) = MIDI_NOTEON;
949 onoff:
950 SEQ_CMD(ev) = SEQ_CHN_VOICE;
951 SEQ_EDEV(ev) = 0;
952 SEQ_ECHAN(ev) = chan;
953 SEQ_ENOTE(ev) = note;
954 SEQ_EPARM(ev) = parm;
955 break;
956 case SEQOLD_WAIT:
957 delay = *(u_int32_t *)ev->arr >> 8;
958 SEQ_CMD(ev) = SEQ_TIMING;
959 SEQ_TCMD(ev) = TMR_WAIT_REL;
960 *(u_int32_t *)&ev->arr[4] = delay;
961 break;
962 case SEQOLD_SYNCTIMER:
963 SEQ_CMD(ev) = SEQ_TIMING;
964 SEQ_TCMD(ev) = TMR_RESET;
965 break;
966 case SEQOLD_PGMCHANGE:
967 SEQ_ECMD(ev) = MIDI_PGM_CHANGE;
968 SEQ_CMD(ev) = SEQ_CHN_COMMON;
969 SEQ_EDEV(ev) = 0;
970 SEQ_ECHAN(ev) = chan;
971 SEQ_EP1(ev) = note;
972 break;
973 case SEQOLD_MIDIPUTC:
974 break; /* interpret in normal mode */
975 case SEQOLD_ECHO:
976 case SEQOLD_PRIVATE:
977 case SEQOLD_EXTENDED:
978 default:
979 DPRINTF(("seq_to_new: not impl 0x%02x\n", cmd));
980 return EINVAL;
981 /* In case new events show up */
982 case SEQ_TIMING:
983 case SEQ_CHN_VOICE:
984 case SEQ_CHN_COMMON:
985 case SEQ_FULLSIZE:
986 break;
987 }
988 return 0;
989 }
990
991 /**********************************************/
992
993 void
994 midisyn_in(md, msg, len)
995 struct midi_dev *md;
996 u_char *msg;
997 int len;
998 {
999 int unit = md->unit;
1000 seq_event_rec ev;
1001 int status, chan;
1002
1003 DPRINTFN(2, ("midisyn_in: %p %02x %02x %02x\n",
1004 md, msg[0], msg[1], msg[2]));
1005
1006 status = MIDI_GET_STATUS(msg[0]);
1007 chan = MIDI_GET_CHAN(msg[0]);
1008 switch (status) {
1009 case MIDI_NOTEON:
1010 if (msg[2] == 0) {
1011 status = MIDI_NOTEOFF;
1012 msg[2] = MIDI_HALF_VEL;
1013 }
1014 /* fall into */
1015 case MIDI_NOTEOFF:
1016 case MIDI_KEY_PRESSURE:
1017 SEQ_MK_CHN_VOICE(&ev, unit, status, chan, msg[1], msg[2]);
1018 break;
1019 case MIDI_CTL_CHANGE:
1020 SEQ_MK_CHN_COMMON(&ev, unit, status, chan, msg[1], 0, msg[2]);
1021 break;
1022 case MIDI_PGM_CHANGE:
1023 case MIDI_CHN_PRESSURE:
1024 SEQ_MK_CHN_COMMON(&ev, unit, status, chan, msg[1], 0, 0);
1025 break;
1026 case MIDI_PITCH_BEND:
1027 SEQ_MK_CHN_COMMON(&ev, unit, status, chan, 0, 0,
1028 (msg[1] & 0x7f) | ((msg[2] & 0x7f) << 7));
1029 break;
1030 default:
1031 return;
1032 }
1033 seq_event_intr(md->seq, &ev);
1034 }
1035
1036 struct midi_dev *
1037 midisyn_open(unit, flags)
1038 int unit;
1039 int flags;
1040 {
1041 extern struct cfdriver midi_cd;
1042 int error;
1043 struct midi_dev *md;
1044 struct midi_softc *sc;
1045 struct midi_info mi;
1046
1047 DPRINTFN(2, ("midisyn_open: %d %d\n", unit, flags));
1048 error = midiopen(makedev(0, unit), flags, 0, 0);
1049 if (error)
1050 return (0);
1051 sc = midi_cd.cd_devs[unit];
1052 sc->seqopen = 1;
1053 md = malloc(sizeof *md, M_DEVBUF, M_WAITOK);
1054 memset(md, 0, sizeof *md);
1055 md->msc = sc;
1056 midi_getinfo(makedev(0, unit), &mi);
1057 md->unit = unit;
1058 md->name = mi.name;
1059 md->type = SYNTH_TYPE_MIDI;
1060 md->subtype = 0;
1061 if (mi.props & MIDI_PROP_CAN_INPUT)
1062 md->capabilities |= SYNTH_CAP_INPUT;
1063 return (md);
1064 }
1065
1066 void
1067 midisyn_close(md)
1068 struct midi_dev *md;
1069 {
1070 DPRINTFN(2, ("midisyn_close: %d\n", md->unit));
1071 midiclose(makedev(0, md->unit), 0, 0, 0);
1072 free(md, M_DEVBUF);
1073 }
1074
1075 void
1076 midisyn_reset(md)
1077 struct midi_dev *md;
1078 {
1079 DPRINTFN(3, ("midisyn_reset: %d\n", md->unit));
1080 }
1081
1082 int
1083 midiout(md, buf, cc, chk)
1084 struct midi_dev *md;
1085 u_char *buf;
1086 u_int cc;
1087 int chk;
1088 {
1089 struct uio uio;
1090 struct iovec iovec;
1091
1092 DPRINTFN(5, ("midiout: m=%p, unit=%d, buf[0]=0x%02x, cc=%d\n",
1093 md->msc, md->unit, buf[0], cc));
1094 #if 1
1095 /* The MIDI "status" byte does not have to be repeated. */
1096 if (chk && md->last_cmd == buf[0])
1097 buf++, cc--;
1098 else
1099 #endif
1100 md->last_cmd = buf[0];
1101 iovec.iov_base = (char *)buf;
1102 iovec.iov_len = cc;
1103 uio.uio_iov = &iovec;
1104 uio.uio_iovcnt = 1;
1105 uio.uio_offset = 0;
1106 uio.uio_resid = cc;
1107 uio.uio_segflg = UIO_SYSSPACE;
1108 uio.uio_rw = UIO_WRITE;
1109 uio.uio_procp = 0; /* process not needed for UIO_SYSSPACE */
1110 return midiwrite(makedev(0, md->unit), &uio, 0);
1111 }
1112
1113 int
1114 midisyn_noteon(md, chan, note, vel)
1115 struct midi_dev *md;
1116 int chan, note, vel;
1117 {
1118 u_char buf[3];
1119
1120 DPRINTFN(6, ("midisyn_noteon 0x%02x %d %d\n",
1121 MIDI_NOTEON | chan, note, vel));
1122 if (chan < 0 || chan > 15 ||
1123 note < 0 || note > 127)
1124 return EINVAL;
1125 if (vel < 0) vel = 0;
1126 if (vel > 127) vel = 127;
1127 buf[0] = MIDI_NOTEON | chan;
1128 buf[1] = note;
1129 buf[2] = vel;
1130 return midiout(md, buf, 3, 1);
1131 }
1132
1133 int
1134 midisyn_noteoff(md, chan, note, vel)
1135 struct midi_dev *md;
1136 int chan, note, vel;
1137 {
1138 u_char buf[3];
1139
1140 if (chan < 0 || chan > 15 ||
1141 note < 0 || note > 127)
1142 return EINVAL;
1143 if (vel < 0) vel = 0;
1144 if (vel > 127) vel = 127;
1145 buf[0] = MIDI_NOTEOFF | chan;
1146 buf[1] = note;
1147 buf[2] = vel;
1148 return midiout(md, buf, 3, 1);
1149 }
1150
1151 int
1152 midisyn_keypressure(md, chan, note, vel)
1153 struct midi_dev *md;
1154 int chan, note, vel;
1155 {
1156 u_char buf[3];
1157
1158 if (chan < 0 || chan > 15 ||
1159 note < 0 || note > 127)
1160 return EINVAL;
1161 if (vel < 0) vel = 0;
1162 if (vel > 127) vel = 127;
1163 buf[0] = MIDI_KEY_PRESSURE | chan;
1164 buf[1] = note;
1165 buf[2] = vel;
1166 return midiout(md, buf, 3, 1);
1167 }
1168
1169 int
1170 midisyn_pgmchange(md, chan, parm)
1171 struct midi_dev *md;
1172 int chan, parm;
1173 {
1174 u_char buf[2];
1175
1176 if (chan < 0 || chan > 15 ||
1177 parm < 0 || parm > 127)
1178 return EINVAL;
1179 buf[0] = MIDI_PGM_CHANGE | chan;
1180 buf[1] = parm;
1181 return midiout(md, buf, 2, 1);
1182 }
1183
1184 int
1185 midisyn_ctlchange(md, chan, parm, w14)
1186 struct midi_dev *md;
1187 int chan, parm, w14;
1188 {
1189 u_char buf[3];
1190
1191 if (chan < 0 || chan > 15 ||
1192 parm < 0 || parm > 127)
1193 return EINVAL;
1194 buf[0] = MIDI_CTL_CHANGE | chan;
1195 buf[1] = parm;
1196 buf[2] = w14 & 0x7f;
1197 return midiout(md, buf, 3, 1);
1198 }
1199
1200 int
1201 midisyn_pitchbend(md, chan, parm)
1202 struct midi_dev *md;
1203 int chan, parm;
1204 {
1205 u_char buf[3];
1206
1207 if (chan < 0 || chan > 15)
1208 return EINVAL;
1209 buf[0] = MIDI_PITCH_BEND | chan;
1210 buf[1] = parm & 0x7f;
1211 buf[2] = (parm >> 7) & 0x7f;
1212 return midiout(md, buf, 3, 1);
1213 }
1214
1215 int
1216 midisyn_loadpatch(md, sysex, uio)
1217 struct midi_dev *md;
1218 struct sysex_info *sysex;
1219 struct uio *uio;
1220 {
1221 u_char c, buf[128];
1222 int i, cc, error;
1223
1224 if (sysex->key != SEQ_SYSEX_PATCH)
1225 return EINVAL;
1226 if (uio->uio_resid < sysex->len)
1227 /* adjust length, should be an error */
1228 sysex->len = uio->uio_resid;
1229
1230 DPRINTFN(2, ("midisyn_loadpatch: len=%d\n", sysex->len));
1231 if (sysex->len == 0)
1232 return EINVAL;
1233 error = uiomove(&c, 1, uio);
1234 if (error)
1235 return error;
1236 if (c != MIDI_SYSEX_START) /* must start like this */
1237 return EINVAL;
1238 error = midiout(md, &c, 1, 0);
1239 if (error)
1240 return error;
1241 --sysex->len;
1242 while (sysex->len > 0) {
1243 cc = sysex->len;
1244 if (cc > sizeof buf)
1245 cc = sizeof buf;
1246 error = uiomove(buf, cc, uio);
1247 if (error)
1248 break;
1249 for(i = 0; i < cc && !MIDI_IS_STATUS(buf[i]); i++)
1250 ;
1251 error = midiout(md, buf, i, 0);
1252 if (error)
1253 break;
1254 sysex->len -= i;
1255 if (i != cc)
1256 break;
1257 }
1258 /* Any leftover data in uio is rubbish;
1259 * the SYSEX should be one write ending in SYSXE_END.
1260 */
1261 uio->uio_resid = 0;
1262 c = MIDI_SYSEX_END;
1263 return midiout(md, &c, 1, 0);
1264 }
1265
1266 int
1267 midisyn_putc(md, data)
1268 struct midi_dev *md;
1269 int data;
1270 {
1271 u_char c = data;
1272 DPRINTFN(4,("midisyn_putc: 0x%02x\n", data));
1273 return midiout(md, &c, 1, 0);
1274 }
1275
1276
1277 #endif
1278