sequencer.c revision 331722
1/*-
2 * Copyright (c) 2003 Mathew Kanner
3 * Copyright (c) 1993 Hannu Savolainen
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28/*
29 * The sequencer personality manager.
30 */
31
32#include <sys/cdefs.h>
33__FBSDID("$FreeBSD: stable/11/sys/dev/sound/midi/sequencer.c 331722 2018-03-29 02:50:57Z eadler $");
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/ioccom.h>
38
39#include <sys/filio.h>
40#include <sys/lock.h>
41#include <sys/sockio.h>
42#include <sys/fcntl.h>
43#include <sys/proc.h>
44#include <sys/sysctl.h>
45
46#include <sys/kernel.h>			/* for DATA_SET */
47
48#include <sys/module.h>
49#include <sys/conf.h>
50#include <sys/file.h>
51#include <sys/uio.h>
52#include <sys/syslog.h>
53#include <sys/errno.h>
54#include <sys/malloc.h>
55#include <sys/bus.h>
56#include <machine/resource.h>
57#include <machine/bus.h>
58#include <machine/clock.h>		/* for DELAY */
59#include <sys/soundcard.h>
60#include <sys/rman.h>
61#include <sys/mman.h>
62#include <sys/poll.h>
63#include <sys/mutex.h>
64#include <sys/condvar.h>
65#include <sys/kthread.h>
66#include <sys/unistd.h>
67#include <sys/selinfo.h>
68
69#ifdef HAVE_KERNEL_OPTION_HEADERS
70#include "opt_snd.h"
71#endif
72
73#include <dev/sound/midi/midi.h>
74#include <dev/sound/midi/midiq.h>
75#include "synth_if.h"
76
77#include <dev/sound/midi/sequencer.h>
78
79#define TMR_TIMERBASE 13
80
81#define SND_DEV_SEQ	1		/* Sequencer output /dev/sequencer (FM
82					 * synthesizer and MIDI output) */
83#define SND_DEV_MUSIC	8		/* /dev/music, level 2 interface */
84
85/* Length of a sequencer event. */
86#define EV_SZ 8
87#define IEV_SZ 8
88
89/* Lookup modes */
90#define LOOKUP_EXIST	(0)
91#define LOOKUP_OPEN	(1)
92#define LOOKUP_CLOSE	(2)
93
94#define PCMMKMINOR(u, d, c) \
95	    ((((c) & 0xff) << 16) | (((u) & 0x0f) << 4) | ((d) & 0x0f))
96#define MIDIMKMINOR(u, d, c) PCMMKMINOR(u, d, c)
97#define MIDIUNIT(y) ((dev2unit(y) >> 4) & 0x0f)
98#define MIDIDEV(y) (dev2unit(y) & 0x0f)
99
100/* These are the entries to the sequencer driver. */
101static d_open_t mseq_open;
102static d_close_t mseq_close;
103static d_ioctl_t mseq_ioctl;
104static d_read_t mseq_read;
105static d_write_t mseq_write;
106static d_poll_t mseq_poll;
107
108static struct cdevsw seq_cdevsw = {
109	.d_version = D_VERSION,
110	.d_open = mseq_open,
111	.d_close = mseq_close,
112	.d_read = mseq_read,
113	.d_write = mseq_write,
114	.d_ioctl = mseq_ioctl,
115	.d_poll = mseq_poll,
116	.d_name = "sequencer",
117};
118
119struct seq_softc {
120	KOBJ_FIELDS;
121
122	struct mtx seq_lock, q_lock;
123	struct cv empty_cv, reset_cv, in_cv, out_cv, state_cv, th_cv;
124
125	MIDIQ_HEAD(, u_char) in_q, out_q;
126
127	u_long	flags;
128	/* Flags (protected by flag_mtx of mididev_info) */
129	int	fflags;			/* Access mode */
130	int	music;
131
132	int	out_water;		/* Sequence output threshould */
133	snd_sync_parm sync_parm;	/* AIOSYNC parameter set */
134	struct thread *sync_thread;	/* AIOSYNCing thread */
135	struct selinfo in_sel, out_sel;
136	int	midi_number;
137	struct cdev *seqdev, *musicdev;
138	int	unit;
139	int	maxunits;
140	kobj_t *midis;
141	int    *midi_flags;
142	kobj_t	mapper;
143	void   *mapper_cookie;
144	struct timeval timerstop, timersub;
145	int	timerbase, tempo;
146	int	timerrun;
147	int	done;
148	int	playing;
149	int	recording;
150	int	busy;
151	int	pre_event_timeout;
152	int	waiting;
153};
154
155/*
156 * Module specific stuff, including how many sequecers
157 * we currently own.
158 */
159
160SYSCTL_NODE(_hw_midi, OID_AUTO, seq, CTLFLAG_RD, 0, "Midi sequencer");
161
162int					seq_debug;
163/* XXX: should this be moved into debug.midi? */
164SYSCTL_INT(_hw_midi_seq, OID_AUTO, debug, CTLFLAG_RW, &seq_debug, 0, "");
165
166midi_cmdtab	cmdtab_seqevent[] = {
167	{SEQ_NOTEOFF,		"SEQ_NOTEOFF"},
168	{SEQ_NOTEON,		"SEQ_NOTEON"},
169	{SEQ_WAIT,		"SEQ_WAIT"},
170	{SEQ_PGMCHANGE,		"SEQ_PGMCHANGE"},
171	{SEQ_SYNCTIMER,		"SEQ_SYNCTIMER"},
172	{SEQ_MIDIPUTC,		"SEQ_MIDIPUTC"},
173	{SEQ_DRUMON,		"SEQ_DRUMON"},
174	{SEQ_DRUMOFF,		"SEQ_DRUMOFF"},
175	{SEQ_ECHO,		"SEQ_ECHO"},
176	{SEQ_AFTERTOUCH,	"SEQ_AFTERTOUCH"},
177	{SEQ_CONTROLLER,	"SEQ_CONTROLLER"},
178	{SEQ_BALANCE,		"SEQ_BALANCE"},
179	{SEQ_VOLMODE,		"SEQ_VOLMODE"},
180	{SEQ_FULLSIZE,		"SEQ_FULLSIZE"},
181	{SEQ_PRIVATE,		"SEQ_PRIVATE"},
182	{SEQ_EXTENDED,		"SEQ_EXTENDED"},
183	{EV_SEQ_LOCAL,		"EV_SEQ_LOCAL"},
184	{EV_TIMING,		"EV_TIMING"},
185	{EV_CHN_COMMON,		"EV_CHN_COMMON"},
186	{EV_CHN_VOICE,		"EV_CHN_VOICE"},
187	{EV_SYSEX,		"EV_SYSEX"},
188	{-1,			NULL},
189};
190
191midi_cmdtab	cmdtab_seqioctl[] = {
192	{SNDCTL_SEQ_RESET,	"SNDCTL_SEQ_RESET"},
193	{SNDCTL_SEQ_SYNC,	"SNDCTL_SEQ_SYNC"},
194	{SNDCTL_SYNTH_INFO,	"SNDCTL_SYNTH_INFO"},
195	{SNDCTL_SEQ_CTRLRATE,	"SNDCTL_SEQ_CTRLRATE"},
196	{SNDCTL_SEQ_GETOUTCOUNT,	"SNDCTL_SEQ_GETOUTCOUNT"},
197	{SNDCTL_SEQ_GETINCOUNT,	"SNDCTL_SEQ_GETINCOUNT"},
198	{SNDCTL_SEQ_PERCMODE,	"SNDCTL_SEQ_PERCMODE"},
199	{SNDCTL_FM_LOAD_INSTR,	"SNDCTL_FM_LOAD_INSTR"},
200	{SNDCTL_SEQ_TESTMIDI,	"SNDCTL_SEQ_TESTMIDI"},
201	{SNDCTL_SEQ_RESETSAMPLES,	"SNDCTL_SEQ_RESETSAMPLES"},
202	{SNDCTL_SEQ_NRSYNTHS,	"SNDCTL_SEQ_NRSYNTHS"},
203	{SNDCTL_SEQ_NRMIDIS,	"SNDCTL_SEQ_NRMIDIS"},
204	{SNDCTL_SEQ_GETTIME,	"SNDCTL_SEQ_GETTIME"},
205	{SNDCTL_MIDI_INFO,	"SNDCTL_MIDI_INFO"},
206	{SNDCTL_SEQ_THRESHOLD,	"SNDCTL_SEQ_THRESHOLD"},
207	{SNDCTL_SYNTH_MEMAVL,	"SNDCTL_SYNTH_MEMAVL"},
208	{SNDCTL_FM_4OP_ENABLE,	"SNDCTL_FM_4OP_ENABLE"},
209	{SNDCTL_PMGR_ACCESS,	"SNDCTL_PMGR_ACCESS"},
210	{SNDCTL_SEQ_PANIC,	"SNDCTL_SEQ_PANIC"},
211	{SNDCTL_SEQ_OUTOFBAND,	"SNDCTL_SEQ_OUTOFBAND"},
212	{SNDCTL_TMR_TIMEBASE,	"SNDCTL_TMR_TIMEBASE"},
213	{SNDCTL_TMR_START,	"SNDCTL_TMR_START"},
214	{SNDCTL_TMR_STOP,	"SNDCTL_TMR_STOP"},
215	{SNDCTL_TMR_CONTINUE,	"SNDCTL_TMR_CONTINUE"},
216	{SNDCTL_TMR_TEMPO,	"SNDCTL_TMR_TEMPO"},
217	{SNDCTL_TMR_SOURCE,	"SNDCTL_TMR_SOURCE"},
218	{SNDCTL_TMR_METRONOME,	"SNDCTL_TMR_METRONOME"},
219	{SNDCTL_TMR_SELECT,	"SNDCTL_TMR_SELECT"},
220	{SNDCTL_MIDI_PRETIME,	"SNDCTL_MIDI_PRETIME"},
221	{AIONWRITE,		"AIONWRITE"},
222	{AIOGSIZE,		"AIOGSIZE"},
223	{AIOSSIZE,		"AIOSSIZE"},
224	{AIOGFMT,		"AIOGFMT"},
225	{AIOSFMT,		"AIOSFMT"},
226	{AIOGMIX,		"AIOGMIX"},
227	{AIOSMIX,		"AIOSMIX"},
228	{AIOSTOP,		"AIOSTOP"},
229	{AIOSYNC,		"AIOSYNC"},
230	{AIOGCAP,		"AIOGCAP"},
231	{-1,			NULL},
232};
233
234midi_cmdtab	cmdtab_timer[] = {
235	{TMR_WAIT_REL,	"TMR_WAIT_REL"},
236	{TMR_WAIT_ABS,	"TMR_WAIT_ABS"},
237	{TMR_STOP,	"TMR_STOP"},
238	{TMR_START,	"TMR_START"},
239	{TMR_CONTINUE,	"TMR_CONTINUE"},
240	{TMR_TEMPO,	"TMR_TEMPO"},
241	{TMR_ECHO,	"TMR_ECHO"},
242	{TMR_CLOCK,	"TMR_CLOCK"},
243	{TMR_SPP,	"TMR_SPP"},
244	{TMR_TIMESIG,	"TMR_TIMESIG"},
245	{-1,		NULL},
246};
247
248midi_cmdtab	cmdtab_seqcv[] = {
249	{MIDI_NOTEOFF,		"MIDI_NOTEOFF"},
250	{MIDI_NOTEON,		"MIDI_NOTEON"},
251	{MIDI_KEY_PRESSURE,	"MIDI_KEY_PRESSURE"},
252	{-1,			NULL},
253};
254
255midi_cmdtab	cmdtab_seqccmn[] = {
256	{MIDI_CTL_CHANGE,	"MIDI_CTL_CHANGE"},
257	{MIDI_PGM_CHANGE,	"MIDI_PGM_CHANGE"},
258	{MIDI_CHN_PRESSURE,	"MIDI_CHN_PRESSURE"},
259	{MIDI_PITCH_BEND,	"MIDI_PITCH_BEND"},
260	{MIDI_SYSTEM_PREFIX,	"MIDI_SYSTEM_PREFIX"},
261	{-1,			NULL},
262};
263
264#ifndef KOBJMETHOD_END
265#define KOBJMETHOD_END	{ NULL, NULL }
266#endif
267
268/*
269 * static const char *mpu401_mprovider(kobj_t obj, struct mpu401 *m);
270 */
271
272static kobj_method_t seq_methods[] = {
273	/* KOBJMETHOD(mpu_provider,mpu401_mprovider), */
274	KOBJMETHOD_END
275};
276
277DEFINE_CLASS(sequencer, seq_methods, 0);
278
279/* The followings are the local function. */
280static int seq_convertold(u_char *event, u_char *out);
281
282/*
283 * static void seq_midiinput(struct seq_softc * scp, void *md);
284 */
285static void seq_reset(struct seq_softc *scp);
286static int seq_sync(struct seq_softc *scp);
287
288static int seq_processevent(struct seq_softc *scp, u_char *event);
289
290static int seq_timing(struct seq_softc *scp, u_char *event);
291static int seq_local(struct seq_softc *scp, u_char *event);
292
293static int seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event);
294static int seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event);
295static int seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event);
296
297static int seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md);
298void	seq_copytoinput(struct seq_softc *scp, u_char *event, int len);
299int	seq_modevent(module_t mod, int type, void *data);
300struct seq_softc *seqs[10];
301static struct mtx seqinfo_mtx;
302static u_long nseq = 0;
303
304static void timer_start(struct seq_softc *t);
305static void timer_stop(struct seq_softc *t);
306static void timer_setvals(struct seq_softc *t, int tempo, int timerbase);
307static void timer_wait(struct seq_softc *t, int ticks, int wait_abs);
308static int timer_now(struct seq_softc *t);
309
310
311static void
312timer_start(struct seq_softc *t)
313{
314	t->timerrun = 1;
315	getmicrotime(&t->timersub);
316}
317
318static void
319timer_continue(struct seq_softc *t)
320{
321	struct timeval now;
322
323	if (t->timerrun == 1)
324		return;
325	t->timerrun = 1;
326	getmicrotime(&now);
327	timevalsub(&now, &t->timerstop);
328	timevaladd(&t->timersub, &now);
329}
330
331static void
332timer_stop(struct seq_softc *t)
333{
334	t->timerrun = 0;
335	getmicrotime(&t->timerstop);
336}
337
338static void
339timer_setvals(struct seq_softc *t, int tempo, int timerbase)
340{
341	t->tempo = tempo;
342	t->timerbase = timerbase;
343}
344
345static void
346timer_wait(struct seq_softc *t, int ticks, int wait_abs)
347{
348	struct timeval now, when;
349	int ret;
350	unsigned long long i;
351
352	while (t->timerrun == 0) {
353		SEQ_DEBUG(2, printf("Timer wait when timer isn't running\n"));
354		/*
355	         * The old sequencer used timeouts that only increased
356	         * the timer when the timer was running.
357	         * Hence the sequencer would stick (?) if the
358	         * timer was disabled.
359	         */
360		cv_wait(&t->reset_cv, &t->seq_lock);
361		if (t->playing == 0)
362			return;
363	}
364
365	i = ticks * 60ull * 1000000ull / (t->tempo * t->timerbase);
366
367	when.tv_sec = i / 1000000;
368	when.tv_usec = i % 1000000;
369
370#if 0
371	printf("timer_wait tempo %d timerbase %d ticks %d abs %d u_sec %llu\n",
372	    t->tempo, t->timerbase, ticks, wait_abs, i);
373#endif
374
375	if (wait_abs != 0) {
376		getmicrotime(&now);
377		timevalsub(&now, &t->timersub);
378		timevalsub(&when, &now);
379	}
380	if (when.tv_sec < 0 || when.tv_usec < 0) {
381		SEQ_DEBUG(3,
382		    printf("seq_timer error negative time %lds.%06lds\n",
383		    (long)when.tv_sec, (long)when.tv_usec));
384		return;
385	}
386	i = when.tv_sec * 1000000ull;
387	i += when.tv_usec;
388	i *= hz;
389	i /= 1000000ull;
390#if 0
391	printf("seq_timer usec %llu ticks %llu\n",
392	    when.tv_sec * 1000000ull + when.tv_usec, i);
393#endif
394	t->waiting = 1;
395	ret = cv_timedwait(&t->reset_cv, &t->seq_lock, i + 1);
396	t->waiting = 0;
397
398	if (ret != EWOULDBLOCK)
399		SEQ_DEBUG(3, printf("seq_timer didn't timeout\n"));
400
401}
402
403static int
404timer_now(struct seq_softc *t)
405{
406	struct timeval now;
407	unsigned long long i;
408	int ret;
409
410	if (t->timerrun == 0)
411		now = t->timerstop;
412	else
413		getmicrotime(&now);
414
415	timevalsub(&now, &t->timersub);
416
417	i = now.tv_sec * 1000000ull;
418	i += now.tv_usec;
419	i *= t->timerbase;
420/*	i /= t->tempo; */
421	i /= 1000000ull;
422
423	ret = i;
424	/*
425	 * printf("timer_now: %llu %d\n", i, ret);
426	 */
427
428	return ret;
429}
430
431static void
432seq_eventthread(void *arg)
433{
434	struct seq_softc *scp = arg;
435	char event[EV_SZ];
436
437	mtx_lock(&scp->seq_lock);
438	SEQ_DEBUG(2, printf("seq_eventthread started\n"));
439	while (scp->done == 0) {
440restart:
441		while (scp->playing == 0) {
442			cv_wait(&scp->state_cv, &scp->seq_lock);
443			if (scp->done)
444				goto done;
445		}
446
447		while (MIDIQ_EMPTY(scp->out_q)) {
448			cv_broadcast(&scp->empty_cv);
449			cv_wait(&scp->out_cv, &scp->seq_lock);
450			if (scp->playing == 0)
451				goto restart;
452			if (scp->done)
453				goto done;
454		}
455
456		MIDIQ_DEQ(scp->out_q, event, EV_SZ);
457
458		if (MIDIQ_AVAIL(scp->out_q) < scp->out_water) {
459			cv_broadcast(&scp->out_cv);
460			selwakeup(&scp->out_sel);
461		}
462		seq_processevent(scp, event);
463	}
464
465done:
466	cv_broadcast(&scp->th_cv);
467	mtx_unlock(&scp->seq_lock);
468	SEQ_DEBUG(2, printf("seq_eventthread finished\n"));
469	kproc_exit(0);
470}
471
472/*
473 * seq_processevent:  This maybe called by the event thread or the IOCTL
474 * handler for queued and out of band events respectively.
475 */
476static int
477seq_processevent(struct seq_softc *scp, u_char *event)
478{
479	int ret;
480	kobj_t m;
481
482	ret = 0;
483
484	if (event[0] == EV_SEQ_LOCAL)
485		ret = seq_local(scp, event);
486	else if (event[0] == EV_TIMING)
487		ret = seq_timing(scp, event);
488	else if (event[0] != EV_CHN_VOICE &&
489		    event[0] != EV_CHN_COMMON &&
490		    event[0] != EV_SYSEX &&
491	    event[0] != SEQ_MIDIPUTC) {
492		ret = 1;
493		SEQ_DEBUG(2, printf("seq_processevent not known %d\n",
494		    event[0]));
495	} else if (seq_fetch_mid(scp, event[1], &m) != 0) {
496		ret = 1;
497		SEQ_DEBUG(2, printf("seq_processevent midi unit not found %d\n",
498		    event[1]));
499	} else
500		switch (event[0]) {
501		case EV_CHN_VOICE:
502			ret = seq_chnvoice(scp, m, event);
503			break;
504		case EV_CHN_COMMON:
505			ret = seq_chncommon(scp, m, event);
506			break;
507		case EV_SYSEX:
508			ret = seq_sysex(scp, m, event);
509			break;
510		case SEQ_MIDIPUTC:
511			mtx_unlock(&scp->seq_lock);
512			ret = SYNTH_WRITERAW(m, &event[2], 1);
513			mtx_lock(&scp->seq_lock);
514			break;
515		}
516	return ret;
517}
518
519static int
520seq_addunit(void)
521{
522	struct seq_softc *scp;
523	int ret;
524	u_char *buf;
525
526	/* Allocate the softc. */
527	ret = ENOMEM;
528	scp = malloc(sizeof(*scp), M_DEVBUF, M_NOWAIT | M_ZERO);
529	if (scp == NULL) {
530		SEQ_DEBUG(1, printf("seq_addunit: softc allocation failed.\n"));
531		goto err;
532	}
533	kobj_init((kobj_t)scp, &sequencer_class);
534
535	buf = malloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_NOWAIT | M_ZERO);
536	if (buf == NULL)
537		goto err;
538	MIDIQ_INIT(scp->in_q, buf, EV_SZ * 1024);
539	buf = malloc(sizeof(*buf) * EV_SZ * 1024, M_TEMP, M_NOWAIT | M_ZERO);
540	if (buf == NULL)
541		goto err;
542	MIDIQ_INIT(scp->out_q, buf, EV_SZ * 1024);
543	ret = EINVAL;
544
545	scp->midis = malloc(sizeof(kobj_t) * 32, M_TEMP, M_NOWAIT | M_ZERO);
546	scp->midi_flags = malloc(sizeof(*scp->midi_flags) * 32, M_TEMP,
547	    M_NOWAIT | M_ZERO);
548
549	if (scp->midis == NULL || scp->midi_flags == NULL)
550		goto err;
551
552	scp->flags = 0;
553
554	mtx_init(&scp->seq_lock, "seqflq", NULL, 0);
555	cv_init(&scp->state_cv, "seqstate");
556	cv_init(&scp->empty_cv, "seqempty");
557	cv_init(&scp->reset_cv, "seqtimer");
558	cv_init(&scp->out_cv, "seqqout");
559	cv_init(&scp->in_cv, "seqqin");
560	cv_init(&scp->th_cv, "seqstart");
561
562	/*
563	 * Init the damn timer
564	 */
565
566	scp->mapper = midimapper_addseq(scp, &scp->unit, &scp->mapper_cookie);
567	if (scp->mapper == NULL)
568		goto err;
569
570	scp->seqdev = make_dev(&seq_cdevsw,
571	    MIDIMKMINOR(scp->unit, SND_DEV_SEQ, 0), UID_ROOT,
572	    GID_WHEEL, 0666, "sequencer%d", scp->unit);
573
574	scp->musicdev = make_dev(&seq_cdevsw,
575	    MIDIMKMINOR(scp->unit, SND_DEV_MUSIC, 0), UID_ROOT,
576	    GID_WHEEL, 0666, "music%d", scp->unit);
577
578	if (scp->seqdev == NULL || scp->musicdev == NULL)
579		goto err;
580	/*
581	 * TODO: Add to list of sequencers this module provides
582	 */
583
584	ret =
585	    kproc_create
586	    (seq_eventthread, scp, NULL, RFHIGHPID, 0,
587	    "sequencer %02d", scp->unit);
588
589	if (ret)
590		goto err;
591
592	scp->seqdev->si_drv1 = scp->musicdev->si_drv1 = scp;
593
594	SEQ_DEBUG(2, printf("sequencer %d created scp %p\n", scp->unit, scp));
595
596	ret = 0;
597
598	mtx_lock(&seqinfo_mtx);
599	seqs[nseq++] = scp;
600	mtx_unlock(&seqinfo_mtx);
601
602	goto ok;
603
604err:
605	if (scp != NULL) {
606		if (scp->seqdev != NULL)
607			destroy_dev(scp->seqdev);
608		if (scp->musicdev != NULL)
609			destroy_dev(scp->musicdev);
610		/*
611	         * TODO: Destroy mutex and cv
612	         */
613		if (scp->midis != NULL)
614			free(scp->midis, M_TEMP);
615		if (scp->midi_flags != NULL)
616			free(scp->midi_flags, M_TEMP);
617		if (scp->out_q.b)
618			free(scp->out_q.b, M_TEMP);
619		if (scp->in_q.b)
620			free(scp->in_q.b, M_TEMP);
621		free(scp, M_DEVBUF);
622	}
623ok:
624	return ret;
625}
626
627static int
628seq_delunit(int unit)
629{
630	struct seq_softc *scp = seqs[unit];
631	int i;
632
633	//SEQ_DEBUG(4, printf("seq_delunit: %d\n", unit));
634	SEQ_DEBUG(1, printf("seq_delunit: 1 \n"));
635	mtx_lock(&scp->seq_lock);
636
637	scp->playing = 0;
638	scp->done = 1;
639	cv_broadcast(&scp->out_cv);
640	cv_broadcast(&scp->state_cv);
641	cv_broadcast(&scp->reset_cv);
642	SEQ_DEBUG(1, printf("seq_delunit: 2 \n"));
643	cv_wait(&scp->th_cv, &scp->seq_lock);
644	SEQ_DEBUG(1, printf("seq_delunit: 3.0 \n"));
645	mtx_unlock(&scp->seq_lock);
646	SEQ_DEBUG(1, printf("seq_delunit: 3.1 \n"));
647
648	cv_destroy(&scp->state_cv);
649	SEQ_DEBUG(1, printf("seq_delunit: 4 \n"));
650	cv_destroy(&scp->empty_cv);
651	SEQ_DEBUG(1, printf("seq_delunit: 5 \n"));
652	cv_destroy(&scp->reset_cv);
653	SEQ_DEBUG(1, printf("seq_delunit: 6 \n"));
654	cv_destroy(&scp->out_cv);
655	SEQ_DEBUG(1, printf("seq_delunit: 7 \n"));
656	cv_destroy(&scp->in_cv);
657	SEQ_DEBUG(1, printf("seq_delunit: 8 \n"));
658	cv_destroy(&scp->th_cv);
659
660	SEQ_DEBUG(1, printf("seq_delunit: 10 \n"));
661	if (scp->seqdev)
662		destroy_dev(scp->seqdev);
663	SEQ_DEBUG(1, printf("seq_delunit: 11 \n"));
664	if (scp->musicdev)
665		destroy_dev(scp->musicdev);
666	SEQ_DEBUG(1, printf("seq_delunit: 12 \n"));
667	scp->seqdev = scp->musicdev = NULL;
668	if (scp->midis != NULL)
669		free(scp->midis, M_TEMP);
670	SEQ_DEBUG(1, printf("seq_delunit: 13 \n"));
671	if (scp->midi_flags != NULL)
672		free(scp->midi_flags, M_TEMP);
673	SEQ_DEBUG(1, printf("seq_delunit: 14 \n"));
674	free(scp->out_q.b, M_TEMP);
675	SEQ_DEBUG(1, printf("seq_delunit: 15 \n"));
676	free(scp->in_q.b, M_TEMP);
677
678	SEQ_DEBUG(1, printf("seq_delunit: 16 \n"));
679
680	mtx_destroy(&scp->seq_lock);
681	SEQ_DEBUG(1, printf("seq_delunit: 17 \n"));
682	free(scp, M_DEVBUF);
683
684	mtx_lock(&seqinfo_mtx);
685	for (i = unit; i < (nseq - 1); i++)
686		seqs[i] = seqs[i + 1];
687	nseq--;
688	mtx_unlock(&seqinfo_mtx);
689
690	return 0;
691}
692
693int
694seq_modevent(module_t mod, int type, void *data)
695{
696	int retval, r;
697
698	retval = 0;
699
700	switch (type) {
701	case MOD_LOAD:
702		mtx_init(&seqinfo_mtx, "seqmod", NULL, 0);
703		retval = seq_addunit();
704		break;
705
706	case MOD_UNLOAD:
707		while (nseq) {
708			r = seq_delunit(nseq - 1);
709			if (r) {
710				retval = r;
711				break;
712			}
713		}
714		if (nseq == 0) {
715			retval = 0;
716			mtx_destroy(&seqinfo_mtx);
717		}
718		break;
719
720	default:
721		break;
722	}
723
724	return retval;
725}
726
727static int
728seq_fetch_mid(struct seq_softc *scp, int unit, kobj_t *md)
729{
730
731	if (unit > scp->midi_number || unit < 0)
732		return EINVAL;
733
734	*md = scp->midis[unit];
735
736	return 0;
737}
738
739int
740mseq_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
741{
742	struct seq_softc *scp = i_dev->si_drv1;
743	int i;
744
745	if (scp == NULL)
746		return ENXIO;
747
748	SEQ_DEBUG(3, printf("seq_open: scp %p unit %d, flags 0x%x.\n",
749	    scp, scp->unit, flags));
750
751	/*
752	 * Mark this device busy.
753	 */
754
755	mtx_lock(&scp->seq_lock);
756	if (scp->busy) {
757		mtx_unlock(&scp->seq_lock);
758		SEQ_DEBUG(2, printf("seq_open: unit %d is busy.\n", scp->unit));
759		return EBUSY;
760	}
761	scp->fflags = flags;
762	/*
763	if ((scp->fflags & O_NONBLOCK) != 0)
764		scp->flags |= SEQ_F_NBIO;
765		*/
766	scp->music = MIDIDEV(i_dev) == SND_DEV_MUSIC;
767
768	/*
769	 * Enumerate the available midi devices
770	 */
771	scp->midi_number = 0;
772	scp->maxunits = midimapper_open(scp->mapper, &scp->mapper_cookie);
773
774	if (scp->maxunits == 0)
775		SEQ_DEBUG(2, printf("seq_open: no midi devices\n"));
776
777	for (i = 0; i < scp->maxunits; i++) {
778		scp->midis[scp->midi_number] =
779		    midimapper_fetch_synth(scp->mapper, scp->mapper_cookie, i);
780		if (scp->midis[scp->midi_number]) {
781			if (SYNTH_OPEN(scp->midis[scp->midi_number], scp,
782				scp->fflags) != 0)
783				scp->midis[scp->midi_number] = NULL;
784			else {
785				scp->midi_flags[scp->midi_number] =
786				    SYNTH_QUERY(scp->midis[scp->midi_number]);
787				scp->midi_number++;
788			}
789		}
790	}
791
792	timer_setvals(scp, 60, 100);
793
794	timer_start(scp);
795	timer_stop(scp);
796	/*
797	 * actually, if we're in rdonly mode, we should start the timer
798	 */
799	/*
800	 * TODO: Handle recording now
801	 */
802
803	scp->out_water = MIDIQ_SIZE(scp->out_q) / 2;
804
805	scp->busy = 1;
806	mtx_unlock(&scp->seq_lock);
807
808	SEQ_DEBUG(2, printf("seq_open: opened, mode %s.\n",
809	    scp->music ? "music" : "sequencer"));
810	SEQ_DEBUG(2,
811	    printf("Sequencer %d %p opened maxunits %d midi_number %d:\n",
812		scp->unit, scp, scp->maxunits, scp->midi_number));
813	for (i = 0; i < scp->midi_number; i++)
814		SEQ_DEBUG(3, printf("  midi %d %p\n", i, scp->midis[i]));
815
816	return 0;
817}
818
819/*
820 * mseq_close
821 */
822int
823mseq_close(struct cdev *i_dev, int flags, int mode, struct thread *td)
824{
825	int i;
826	struct seq_softc *scp = i_dev->si_drv1;
827	int ret;
828
829	if (scp == NULL)
830		return ENXIO;
831
832	SEQ_DEBUG(2, printf("seq_close: unit %d.\n", scp->unit));
833
834	mtx_lock(&scp->seq_lock);
835
836	ret = ENXIO;
837	if (scp->busy == 0)
838		goto err;
839
840	seq_reset(scp);
841	seq_sync(scp);
842
843	for (i = 0; i < scp->midi_number; i++)
844		if (scp->midis[i])
845			SYNTH_CLOSE(scp->midis[i]);
846
847	midimapper_close(scp->mapper, scp->mapper_cookie);
848
849	timer_stop(scp);
850
851	scp->busy = 0;
852	ret = 0;
853
854err:
855	SEQ_DEBUG(3, printf("seq_close: closed ret = %d.\n", ret));
856	mtx_unlock(&scp->seq_lock);
857	return ret;
858}
859
860int
861mseq_read(struct cdev *i_dev, struct uio *uio, int ioflag)
862{
863	int retval, used;
864	struct seq_softc *scp = i_dev->si_drv1;
865
866#define SEQ_RSIZE 32
867	u_char buf[SEQ_RSIZE];
868
869	if (scp == NULL)
870		return ENXIO;
871
872	SEQ_DEBUG(7, printf("mseq_read: unit %d, resid %zd.\n",
873	    scp->unit, uio->uio_resid));
874
875	mtx_lock(&scp->seq_lock);
876	if ((scp->fflags & FREAD) == 0) {
877		SEQ_DEBUG(2, printf("mseq_read: unit %d is not for reading.\n",
878		    scp->unit));
879		retval = EIO;
880		goto err1;
881	}
882	/*
883	 * Begin recording.
884	 */
885	/*
886	 * if ((scp->flags & SEQ_F_READING) == 0)
887	 */
888	/*
889	 * TODO, start recording if not alread
890	 */
891
892	/*
893	 * I think the semantics are to return as soon
894	 * as possible.
895	 * Second thought, it doens't seem like midimoutain
896	 * expects that at all.
897	 * TODO: Look up in some sort of spec
898	 */
899
900	while (uio->uio_resid > 0) {
901		while (MIDIQ_EMPTY(scp->in_q)) {
902			retval = EWOULDBLOCK;
903			/*
904			 * I wish I knew which one to care about
905			 */
906
907			if (scp->fflags & O_NONBLOCK)
908				goto err1;
909			if (ioflag & O_NONBLOCK)
910				goto err1;
911
912			retval = cv_wait_sig(&scp->in_cv, &scp->seq_lock);
913			if (retval == EINTR)
914				goto err1;
915		}
916
917		used = MIN(MIDIQ_LEN(scp->in_q), uio->uio_resid);
918		used = MIN(used, SEQ_RSIZE);
919
920		SEQ_DEBUG(8, printf("midiread: uiomove cc=%d\n", used));
921		MIDIQ_DEQ(scp->in_q, buf, used);
922		retval = uiomove(buf, used, uio);
923		if (retval)
924			goto err1;
925	}
926
927	retval = 0;
928err1:
929	mtx_unlock(&scp->seq_lock);
930	SEQ_DEBUG(6, printf("mseq_read: ret %d, resid %zd.\n",
931	    retval, uio->uio_resid));
932
933	return retval;
934}
935
936int
937mseq_write(struct cdev *i_dev, struct uio *uio, int ioflag)
938{
939	u_char event[EV_SZ], newevent[EV_SZ], ev_code;
940	struct seq_softc *scp = i_dev->si_drv1;
941	int retval;
942	int used;
943
944	SEQ_DEBUG(7, printf("seq_write: unit %d, resid %zd.\n",
945	    scp->unit, uio->uio_resid));
946
947	if (scp == NULL)
948		return ENXIO;
949
950	mtx_lock(&scp->seq_lock);
951
952	if ((scp->fflags & FWRITE) == 0) {
953		SEQ_DEBUG(2, printf("seq_write: unit %d is not for writing.\n",
954		    scp->unit));
955		retval = EIO;
956		goto err0;
957	}
958	while (uio->uio_resid > 0) {
959		while (MIDIQ_AVAIL(scp->out_q) == 0) {
960			retval = EWOULDBLOCK;
961			if (scp->fflags & O_NONBLOCK)
962				goto err0;
963			if (ioflag & O_NONBLOCK)
964				goto err0;
965			SEQ_DEBUG(8, printf("seq_write cvwait\n"));
966
967			scp->playing = 1;
968			cv_broadcast(&scp->out_cv);
969			cv_broadcast(&scp->state_cv);
970
971			retval = cv_wait_sig(&scp->out_cv, &scp->seq_lock);
972			/*
973		         * We slept, maybe things have changed since last
974		         * dying check
975		         */
976			if (retval == EINTR)
977				goto err0;
978#if 0
979			/*
980		         * Useless test
981		         */
982			if (scp != i_dev->si_drv1)
983				retval = ENXIO;
984#endif
985		}
986
987		used = MIN(uio->uio_resid, 4);
988
989		SEQ_DEBUG(8, printf("seqout: resid %zd len %jd avail %jd\n",
990		    uio->uio_resid, (intmax_t)MIDIQ_LEN(scp->out_q),
991		    (intmax_t)MIDIQ_AVAIL(scp->out_q)));
992
993		if (used != 4) {
994			retval = ENXIO;
995			goto err0;
996		}
997		retval = uiomove(event, used, uio);
998		if (retval)
999			goto err0;
1000
1001		ev_code = event[0];
1002		SEQ_DEBUG(8, printf("seq_write: unit %d, event %s.\n",
1003		    scp->unit, midi_cmdname(ev_code, cmdtab_seqevent)));
1004
1005		/* Have a look at the event code. */
1006		if (ev_code == SEQ_FULLSIZE) {
1007
1008			/*
1009			 * TODO: restore code for SEQ_FULLSIZE
1010			 */
1011#if 0
1012			/*
1013			 * A long event, these are the patches/samples for a
1014			 * synthesizer.
1015			 */
1016			midiunit = *(u_short *)&event[2];
1017			mtx_lock(&sd->seq_lock);
1018			ret = lookup_mididev(scp, midiunit, LOOKUP_OPEN, &md);
1019			mtx_unlock(&sd->seq_lock);
1020			if (ret != 0)
1021				return (ret);
1022
1023			SEQ_DEBUG(printf("seq_write: loading a patch to the unit %d.\n", midiunit));
1024
1025			ret = md->synth.loadpatch(md, *(short *)&event[0], buf,
1026			    p + 4, count, 0);
1027			return (ret);
1028#else
1029			/*
1030			 * For now, just flush the darn buffer
1031			 */
1032			SEQ_DEBUG(2,
1033			   printf("seq_write: SEQ_FULLSIZE flusing buffer.\n"));
1034			while (uio->uio_resid > 0) {
1035				retval = uiomove(event, EV_SZ, uio);
1036				if (retval)
1037					goto err0;
1038
1039			}
1040			retval = 0;
1041			goto err0;
1042#endif
1043		}
1044		retval = EINVAL;
1045		if (ev_code >= 128) {
1046
1047			/*
1048			 * Some sort of an extended event. The size is eight
1049			 * bytes. scoop extra info.
1050			 */
1051			if (scp->music && ev_code == SEQ_EXTENDED) {
1052				SEQ_DEBUG(2, printf("seq_write: invalid level two event %x.\n", ev_code));
1053				goto err0;
1054			}
1055			if (uiomove((caddr_t)&event[4], 4, uio)) {
1056				SEQ_DEBUG(2,
1057				   printf("seq_write: user memory mangled?\n"));
1058				goto err0;
1059			}
1060		} else {
1061			/*
1062			 * Size four event.
1063			 */
1064			if (scp->music) {
1065				SEQ_DEBUG(2, printf("seq_write: four byte event in music mode.\n"));
1066				goto err0;
1067			}
1068		}
1069		if (ev_code == SEQ_MIDIPUTC) {
1070			/*
1071			 * TODO: event[2] is unit number to receive char.
1072			 * Range check it.
1073			 */
1074		}
1075		if (scp->music) {
1076#ifdef not_ever_ever
1077			if (event[0] == EV_TIMING &&
1078			    (event[1] == TMR_START || event[1] == TMR_STOP)) {
1079				/*
1080			         * For now, try to make midimoutain work by
1081			         * forcing these events to be processed
1082				 * immediatly.
1083			         */
1084				seq_processevent(scp, event);
1085			} else
1086				MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1087#else
1088			MIDIQ_ENQ(scp->out_q, event, EV_SZ);
1089#endif
1090		} else {
1091			if (seq_convertold(event, newevent) > 0)
1092				MIDIQ_ENQ(scp->out_q, newevent, EV_SZ);
1093#if 0
1094			else
1095				goto err0;
1096#endif
1097		}
1098
1099	}
1100
1101	scp->playing = 1;
1102	cv_broadcast(&scp->state_cv);
1103	cv_broadcast(&scp->out_cv);
1104
1105	retval = 0;
1106
1107err0:
1108	SEQ_DEBUG(6,
1109	    printf("seq_write done: leftover buffer length %zd retval %d\n",
1110	    uio->uio_resid, retval));
1111	mtx_unlock(&scp->seq_lock);
1112	return retval;
1113}
1114
1115int
1116mseq_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
1117    struct thread *td)
1118{
1119	int midiunit, ret, tmp;
1120	struct seq_softc *scp = i_dev->si_drv1;
1121	struct synth_info *synthinfo;
1122	struct midi_info *midiinfo;
1123	u_char event[EV_SZ];
1124	u_char newevent[EV_SZ];
1125
1126	kobj_t md;
1127
1128	/*
1129	 * struct snd_size *sndsize;
1130	 */
1131
1132	if (scp == NULL)
1133		return ENXIO;
1134
1135	SEQ_DEBUG(6, printf("seq_ioctl: unit %d, cmd %s.\n",
1136	    scp->unit, midi_cmdname(cmd, cmdtab_seqioctl)));
1137
1138	ret = 0;
1139
1140	switch (cmd) {
1141	case SNDCTL_SEQ_GETTIME:
1142		/*
1143		 * ioctl needed by libtse
1144		 */
1145		mtx_lock(&scp->seq_lock);
1146		*(int *)arg = timer_now(scp);
1147		mtx_unlock(&scp->seq_lock);
1148		SEQ_DEBUG(6, printf("seq_ioctl: gettime %d.\n", *(int *)arg));
1149		ret = 0;
1150		break;
1151	case SNDCTL_TMR_METRONOME:
1152		/* fallthrough */
1153	case SNDCTL_TMR_SOURCE:
1154		/*
1155		 * Not implemented
1156		 */
1157		ret = 0;
1158		break;
1159	case SNDCTL_TMR_TEMPO:
1160		event[1] = TMR_TEMPO;
1161		event[4] = *(int *)arg & 0xFF;
1162		event[5] = (*(int *)arg >> 8) & 0xFF;
1163		event[6] = (*(int *)arg >> 16) & 0xFF;
1164		event[7] = (*(int *)arg >> 24) & 0xFF;
1165		goto timerevent;
1166	case SNDCTL_TMR_TIMEBASE:
1167		event[1] = TMR_TIMERBASE;
1168		event[4] = *(int *)arg & 0xFF;
1169		event[5] = (*(int *)arg >> 8) & 0xFF;
1170		event[6] = (*(int *)arg >> 16) & 0xFF;
1171		event[7] = (*(int *)arg >> 24) & 0xFF;
1172		goto timerevent;
1173	case SNDCTL_TMR_START:
1174		event[1] = TMR_START;
1175		goto timerevent;
1176	case SNDCTL_TMR_STOP:
1177		event[1] = TMR_STOP;
1178		goto timerevent;
1179	case SNDCTL_TMR_CONTINUE:
1180		event[1] = TMR_CONTINUE;
1181timerevent:
1182		event[0] = EV_TIMING;
1183		mtx_lock(&scp->seq_lock);
1184		if (!scp->music) {
1185			ret = EINVAL;
1186			mtx_unlock(&scp->seq_lock);
1187			break;
1188		}
1189		seq_processevent(scp, event);
1190		mtx_unlock(&scp->seq_lock);
1191		break;
1192	case SNDCTL_TMR_SELECT:
1193		SEQ_DEBUG(2,
1194		    printf("seq_ioctl: SNDCTL_TMR_SELECT not supported\n"));
1195		ret = EINVAL;
1196		break;
1197	case SNDCTL_SEQ_SYNC:
1198		if (mode == O_RDONLY) {
1199			ret = 0;
1200			break;
1201		}
1202		mtx_lock(&scp->seq_lock);
1203		ret = seq_sync(scp);
1204		mtx_unlock(&scp->seq_lock);
1205		break;
1206	case SNDCTL_SEQ_PANIC:
1207		/* fallthrough */
1208	case SNDCTL_SEQ_RESET:
1209		/*
1210		 * SNDCTL_SEQ_PANIC == SNDCTL_SEQ_RESET
1211		 */
1212		mtx_lock(&scp->seq_lock);
1213		seq_reset(scp);
1214		mtx_unlock(&scp->seq_lock);
1215		ret = 0;
1216		break;
1217	case SNDCTL_SEQ_TESTMIDI:
1218		mtx_lock(&scp->seq_lock);
1219		/*
1220		 * TODO: SNDCTL_SEQ_TESTMIDI now means "can I write to the
1221		 * device?".
1222		 */
1223		mtx_unlock(&scp->seq_lock);
1224		break;
1225#if 0
1226	case SNDCTL_SEQ_GETINCOUNT:
1227		if (mode == O_WRONLY)
1228			*(int *)arg = 0;
1229		else {
1230			mtx_lock(&scp->seq_lock);
1231			*(int *)arg = scp->in_q.rl;
1232			mtx_unlock(&scp->seq_lock);
1233			SEQ_DEBUG(printf("seq_ioctl: incount %d.\n",
1234			    *(int *)arg));
1235		}
1236		ret = 0;
1237		break;
1238	case SNDCTL_SEQ_GETOUTCOUNT:
1239		if (mode == O_RDONLY)
1240			*(int *)arg = 0;
1241		else {
1242			mtx_lock(&scp->seq_lock);
1243			*(int *)arg = scp->out_q.fl;
1244			mtx_unlock(&scp->seq_lock);
1245			SEQ_DEBUG(printf("seq_ioctl: outcount %d.\n",
1246			    *(int *)arg));
1247		}
1248		ret = 0;
1249		break;
1250#endif
1251	case SNDCTL_SEQ_CTRLRATE:
1252		if (*(int *)arg != 0) {
1253			ret = EINVAL;
1254			break;
1255		}
1256		mtx_lock(&scp->seq_lock);
1257		*(int *)arg = scp->timerbase;
1258		mtx_unlock(&scp->seq_lock);
1259		SEQ_DEBUG(3, printf("seq_ioctl: ctrlrate %d.\n", *(int *)arg));
1260		ret = 0;
1261		break;
1262		/*
1263		 * TODO: ioctl SNDCTL_SEQ_RESETSAMPLES
1264		 */
1265#if 0
1266	case SNDCTL_SEQ_RESETSAMPLES:
1267		mtx_lock(&scp->seq_lock);
1268		ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1269		mtx_unlock(&scp->seq_lock);
1270		if (ret != 0)
1271			break;
1272		ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg,
1273		    SND_DEV_MIDIN), cmd, arg, mode, td);
1274		break;
1275#endif
1276	case SNDCTL_SEQ_NRSYNTHS:
1277		mtx_lock(&scp->seq_lock);
1278		*(int *)arg = scp->midi_number;
1279		mtx_unlock(&scp->seq_lock);
1280		SEQ_DEBUG(3, printf("seq_ioctl: synths %d.\n", *(int *)arg));
1281		ret = 0;
1282		break;
1283	case SNDCTL_SEQ_NRMIDIS:
1284		mtx_lock(&scp->seq_lock);
1285		if (scp->music)
1286			*(int *)arg = 0;
1287		else {
1288			/*
1289		         * TODO: count the numbder of devices that can WRITERAW
1290		         */
1291			*(int *)arg = scp->midi_number;
1292		}
1293		mtx_unlock(&scp->seq_lock);
1294		SEQ_DEBUG(3, printf("seq_ioctl: midis %d.\n", *(int *)arg));
1295		ret = 0;
1296		break;
1297		/*
1298		 * TODO: ioctl SNDCTL_SYNTH_MEMAVL
1299		 */
1300#if 0
1301	case SNDCTL_SYNTH_MEMAVL:
1302		mtx_lock(&scp->seq_lock);
1303		ret = lookup_mididev(scp, *(int *)arg, LOOKUP_OPEN, &md);
1304		mtx_unlock(&scp->seq_lock);
1305		if (ret != 0)
1306			break;
1307		ret = midi_ioctl(MIDIMKDEV(major(i_dev), *(int *)arg,
1308		    SND_DEV_MIDIN), cmd, arg, mode, td);
1309		break;
1310#endif
1311	case SNDCTL_SEQ_OUTOFBAND:
1312		for (ret = 0; ret < EV_SZ; ret++)
1313			event[ret] = (u_char)arg[0];
1314
1315		mtx_lock(&scp->seq_lock);
1316		if (scp->music)
1317			ret = seq_processevent(scp, event);
1318		else {
1319			if (seq_convertold(event, newevent) > 0)
1320				ret = seq_processevent(scp, newevent);
1321			else
1322				ret = EINVAL;
1323		}
1324		mtx_unlock(&scp->seq_lock);
1325		break;
1326	case SNDCTL_SYNTH_INFO:
1327		synthinfo = (struct synth_info *)arg;
1328		midiunit = synthinfo->device;
1329		mtx_lock(&scp->seq_lock);
1330		if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1331			bzero(synthinfo, sizeof(*synthinfo));
1332			synthinfo->name[0] = 'f';
1333			synthinfo->name[1] = 'a';
1334			synthinfo->name[2] = 'k';
1335			synthinfo->name[3] = 'e';
1336			synthinfo->name[4] = 's';
1337			synthinfo->name[5] = 'y';
1338			synthinfo->name[6] = 'n';
1339			synthinfo->name[7] = 't';
1340			synthinfo->name[8] = 'h';
1341			synthinfo->device = midiunit;
1342			synthinfo->synth_type = SYNTH_TYPE_MIDI;
1343			synthinfo->capabilities = scp->midi_flags[midiunit];
1344			ret = 0;
1345		} else
1346			ret = EINVAL;
1347		mtx_unlock(&scp->seq_lock);
1348		break;
1349	case SNDCTL_MIDI_INFO:
1350		midiinfo = (struct midi_info *)arg;
1351		midiunit = midiinfo->device;
1352		mtx_lock(&scp->seq_lock);
1353		if (seq_fetch_mid(scp, midiunit, &md) == 0) {
1354			bzero(midiinfo, sizeof(*midiinfo));
1355			midiinfo->name[0] = 'f';
1356			midiinfo->name[1] = 'a';
1357			midiinfo->name[2] = 'k';
1358			midiinfo->name[3] = 'e';
1359			midiinfo->name[4] = 'm';
1360			midiinfo->name[5] = 'i';
1361			midiinfo->name[6] = 'd';
1362			midiinfo->name[7] = 'i';
1363			midiinfo->device = midiunit;
1364			midiinfo->capabilities = scp->midi_flags[midiunit];
1365			/*
1366		         * TODO: What devtype?
1367		         */
1368			midiinfo->dev_type = 0x01;
1369			ret = 0;
1370		} else
1371			ret = EINVAL;
1372		mtx_unlock(&scp->seq_lock);
1373		break;
1374	case SNDCTL_SEQ_THRESHOLD:
1375		mtx_lock(&scp->seq_lock);
1376		RANGE(*(int *)arg, 1, MIDIQ_SIZE(scp->out_q) - 1);
1377		scp->out_water = *(int *)arg;
1378		mtx_unlock(&scp->seq_lock);
1379		SEQ_DEBUG(3, printf("seq_ioctl: water %d.\n", *(int *)arg));
1380		ret = 0;
1381		break;
1382	case SNDCTL_MIDI_PRETIME:
1383		tmp = *(int *)arg;
1384		if (tmp < 0)
1385			tmp = 0;
1386		mtx_lock(&scp->seq_lock);
1387		scp->pre_event_timeout = (hz * tmp) / 10;
1388		*(int *)arg = scp->pre_event_timeout;
1389		mtx_unlock(&scp->seq_lock);
1390		SEQ_DEBUG(3, printf("seq_ioctl: pretime %d.\n", *(int *)arg));
1391		ret = 0;
1392		break;
1393	case SNDCTL_FM_4OP_ENABLE:
1394	case SNDCTL_PMGR_IFACE:
1395	case SNDCTL_PMGR_ACCESS:
1396		/*
1397		 * Patch manager and fm are ded, ded, ded.
1398		 */
1399		/* fallthrough */
1400	default:
1401		/*
1402		 * TODO: Consider ioctl default case.
1403		 * Old code used to
1404		 * if ((scp->fflags & O_ACCMODE) == FREAD) {
1405		 *	ret = EIO;
1406		 *	break;
1407		 * }
1408		 * Then pass on the ioctl to device 0
1409		 */
1410		SEQ_DEBUG(2,
1411		    printf("seq_ioctl: unsupported IOCTL %ld.\n", cmd));
1412		ret = EINVAL;
1413		break;
1414	}
1415
1416	return ret;
1417}
1418
1419int
1420mseq_poll(struct cdev *i_dev, int events, struct thread *td)
1421{
1422	int ret, lim;
1423	struct seq_softc *scp = i_dev->si_drv1;
1424
1425	SEQ_DEBUG(3, printf("seq_poll: unit %d.\n", scp->unit));
1426	SEQ_DEBUG(1, printf("seq_poll: unit %d.\n", scp->unit));
1427
1428	mtx_lock(&scp->seq_lock);
1429
1430	ret = 0;
1431
1432	/* Look up the apropriate queue and select it. */
1433	if ((events & (POLLOUT | POLLWRNORM)) != 0) {
1434		/* Start playing. */
1435		scp->playing = 1;
1436		cv_broadcast(&scp->state_cv);
1437		cv_broadcast(&scp->out_cv);
1438
1439		lim = scp->out_water;
1440
1441		if (MIDIQ_AVAIL(scp->out_q) < lim)
1442			/* No enough space, record select. */
1443			selrecord(td, &scp->out_sel);
1444		else
1445			/* We can write now. */
1446			ret |= events & (POLLOUT | POLLWRNORM);
1447	}
1448	if ((events & (POLLIN | POLLRDNORM)) != 0) {
1449		/* TODO: Start recording. */
1450
1451		/* Find out the boundary. */
1452		lim = 1;
1453		if (MIDIQ_LEN(scp->in_q) < lim)
1454			/* No data ready, record select. */
1455			selrecord(td, &scp->in_sel);
1456		else
1457			/* We can read now. */
1458			ret |= events & (POLLIN | POLLRDNORM);
1459	}
1460	mtx_unlock(&scp->seq_lock);
1461
1462	return (ret);
1463}
1464
1465#if 0
1466static void
1467sein_qtr(void *p, void /* mididev_info */ *md)
1468{
1469	struct seq_softc *scp;
1470
1471	scp = (struct seq_softc *)p;
1472
1473	mtx_lock(&scp->seq_lock);
1474
1475	/* Restart playing if we have the data to output. */
1476	if (scp->queueout_pending)
1477		seq_callback(scp, SEQ_CB_START | SEQ_CB_WR);
1478	/* Check the midi device if we are reading. */
1479	if ((scp->flags & SEQ_F_READING) != 0)
1480		seq_midiinput(scp, md);
1481
1482	mtx_unlock(&scp->seq_lock);
1483}
1484
1485#endif
1486/*
1487 * seq_convertold
1488 * Was the old playevent.  Use this to convert and old
1489 * style /dev/sequencer event to a /dev/music event
1490 */
1491static int
1492seq_convertold(u_char *event, u_char *out)
1493{
1494	int used;
1495	u_char dev, chn, note, vel;
1496
1497	out[0] = out[1] = out[2] = out[3] = out[4] = out[5] = out[6] =
1498	    out[7] = 0;
1499
1500	dev = 0;
1501	chn = event[1];
1502	note = event[2];
1503	vel = event[3];
1504
1505	used = 0;
1506
1507restart:
1508	/*
1509	 * TODO: Debug statement
1510	 */
1511	switch (event[0]) {
1512	case EV_TIMING:
1513	case EV_CHN_VOICE:
1514	case EV_CHN_COMMON:
1515	case EV_SYSEX:
1516	case EV_SEQ_LOCAL:
1517		out[0] = event[0];
1518		out[1] = event[1];
1519		out[2] = event[2];
1520		out[3] = event[3];
1521		out[4] = event[4];
1522		out[5] = event[5];
1523		out[6] = event[6];
1524		out[7] = event[7];
1525		used += 8;
1526		break;
1527	case SEQ_NOTEOFF:
1528		out[0] = EV_CHN_VOICE;
1529		out[1] = dev;
1530		out[2] = MIDI_NOTEOFF;
1531		out[3] = chn;
1532		out[4] = note;
1533		out[5] = 255;
1534		used += 4;
1535		break;
1536
1537	case SEQ_NOTEON:
1538		out[0] = EV_CHN_VOICE;
1539		out[1] = dev;
1540		out[2] = MIDI_NOTEON;
1541		out[3] = chn;
1542		out[4] = note;
1543		out[5] = vel;
1544		used += 4;
1545		break;
1546
1547		/*
1548		 * wait delay = (event[2] << 16) + (event[3] << 8) + event[4]
1549		 */
1550
1551	case SEQ_PGMCHANGE:
1552		out[0] = EV_CHN_COMMON;
1553		out[1] = dev;
1554		out[2] = MIDI_PGM_CHANGE;
1555		out[3] = chn;
1556		out[4] = note;
1557		out[5] = vel;
1558		used += 4;
1559		break;
1560/*
1561		out[0] = EV_TIMING;
1562		out[1] = dev;
1563		out[2] = MIDI_PGM_CHANGE;
1564		out[3] = chn;
1565		out[4] = note;
1566		out[5] = vel;
1567		SEQ_DEBUG(4,printf("seq_playevent: synctimer\n"));
1568		break;
1569*/
1570
1571	case SEQ_MIDIPUTC:
1572		SEQ_DEBUG(4,
1573		    printf("seq_playevent: put data 0x%02x, unit %d.\n",
1574		    event[1], event[2]));
1575		/*
1576		 * Pass through to the midi device.
1577		 * device = event[2]
1578		 * data = event[1]
1579		 */
1580		out[0] = SEQ_MIDIPUTC;
1581		out[1] = dev;
1582		out[2] = chn;
1583		used += 4;
1584		break;
1585#ifdef notyet
1586	case SEQ_ECHO:
1587		/*
1588		 * This isn't handled here yet because I don't know if I can
1589		 * just use four bytes events.  There might be consequences
1590		 * in the _read routing
1591		 */
1592		if (seq_copytoinput(scp, event, 4) == EAGAIN) {
1593			ret = QUEUEFULL;
1594			break;
1595		}
1596		ret = MORE;
1597		break;
1598#endif
1599	case SEQ_EXTENDED:
1600		switch (event[1]) {
1601		case SEQ_NOTEOFF:
1602		case SEQ_NOTEON:
1603		case SEQ_PGMCHANGE:
1604			event++;
1605			used = 4;
1606			goto restart;
1607			break;
1608		case SEQ_AFTERTOUCH:
1609			/*
1610			 * SYNTH_AFTERTOUCH(md, event[3], event[4])
1611			 */
1612		case SEQ_BALANCE:
1613			/*
1614			 * SYNTH_PANNING(md, event[3], (char)event[4])
1615			 */
1616		case SEQ_CONTROLLER:
1617			/*
1618			 * SYNTH_CONTROLLER(md, event[3], event[4], *(short *)&event[5])
1619			 */
1620		case SEQ_VOLMODE:
1621			/*
1622			 * SYNTH_VOLUMEMETHOD(md, event[3])
1623			 */
1624		default:
1625			SEQ_DEBUG(2,
1626			    printf("seq_convertold: SEQ_EXTENDED type %d"
1627			    "not handled\n", event[1]));
1628			break;
1629		}
1630		break;
1631	case SEQ_WAIT:
1632		out[0] = EV_TIMING;
1633		out[1] = TMR_WAIT_REL;
1634		out[4] = event[2];
1635		out[5] = event[3];
1636		out[6] = event[4];
1637
1638		SEQ_DEBUG(5, printf("SEQ_WAIT %d",
1639		    event[2] + (event[3] << 8) + (event[4] << 24)));
1640
1641		used += 4;
1642		break;
1643
1644	case SEQ_ECHO:
1645	case SEQ_SYNCTIMER:
1646	case SEQ_PRIVATE:
1647	default:
1648		SEQ_DEBUG(2,
1649		  printf("seq_convertold: event type %d not handled %d %d %d\n",
1650		    event[0], event[1], event[2], event[3]));
1651		break;
1652	}
1653	return used;
1654}
1655
1656/*
1657 * Writting to the sequencer buffer never blocks and drops
1658 * input which cannot be queued
1659 */
1660void
1661seq_copytoinput(struct seq_softc *scp, u_char *event, int len)
1662{
1663
1664	mtx_assert(&scp->seq_lock, MA_OWNED);
1665
1666	if (MIDIQ_AVAIL(scp->in_q) < len) {
1667		/*
1668	         * ENOROOM?  EINPUTDROPPED? ETOUGHLUCK?
1669	         */
1670		SEQ_DEBUG(2, printf("seq_copytoinput: queue full\n"));
1671	} else {
1672		MIDIQ_ENQ(scp->in_q, event, len);
1673		selwakeup(&scp->in_sel);
1674		cv_broadcast(&scp->in_cv);
1675	}
1676
1677}
1678
1679static int
1680seq_chnvoice(struct seq_softc *scp, kobj_t md, u_char *event)
1681{
1682	int ret, voice;
1683	u_char cmd, chn, note, parm;
1684
1685	ret = 0;
1686	cmd = event[2];
1687	chn = event[3];
1688	note = event[4];
1689	parm = event[5];
1690
1691	mtx_assert(&scp->seq_lock, MA_OWNED);
1692
1693	SEQ_DEBUG(5, printf("seq_chnvoice: unit %d, dev %d, cmd %s,"
1694	    " chn %d, note %d, parm %d.\n", scp->unit, event[1],
1695	    midi_cmdname(cmd, cmdtab_seqcv), chn, note, parm));
1696
1697	voice = SYNTH_ALLOC(md, chn, note);
1698
1699	mtx_unlock(&scp->seq_lock);
1700
1701	switch (cmd) {
1702	case MIDI_NOTEON:
1703		if (note < 128 || note == 255) {
1704#if 0
1705			if (scp->music && chn == 9) {
1706				/*
1707				 * This channel is a percussion. The note
1708				 * number is the patch number.
1709				 */
1710				/*
1711				mtx_unlock(&scp->seq_lock);
1712				if (SYNTH_SETINSTR(md, voice, 128 + note)
1713				    == EAGAIN) {
1714					mtx_lock(&scp->seq_lock);
1715					return (QUEUEFULL);
1716				}
1717				mtx_lock(&scp->seq_lock);
1718				*/
1719				note = 60;	/* Middle C. */
1720			}
1721#endif
1722			if (scp->music) {
1723				/*
1724				mtx_unlock(&scp->seq_lock);
1725				if (SYNTH_SETUPVOICE(md, voice, chn)
1726				    == EAGAIN) {
1727					mtx_lock(&scp->seq_lock);
1728					return (QUEUEFULL);
1729				}
1730				mtx_lock(&scp->seq_lock);
1731				*/
1732			}
1733			SYNTH_STARTNOTE(md, voice, note, parm);
1734		}
1735		break;
1736	case MIDI_NOTEOFF:
1737		SYNTH_KILLNOTE(md, voice, note, parm);
1738		break;
1739	case MIDI_KEY_PRESSURE:
1740		SYNTH_AFTERTOUCH(md, voice, parm);
1741		break;
1742	default:
1743		ret = 1;
1744		SEQ_DEBUG(2, printf("seq_chnvoice event type %d not handled\n",
1745		    event[1]));
1746		break;
1747	}
1748
1749	mtx_lock(&scp->seq_lock);
1750	return ret;
1751}
1752
1753static int
1754seq_chncommon(struct seq_softc *scp, kobj_t md, u_char *event)
1755{
1756	int ret;
1757	u_short w14;
1758	u_char cmd, chn, p1;
1759
1760	ret = 0;
1761	cmd = event[2];
1762	chn = event[3];
1763	p1 = event[4];
1764	w14 = *(u_short *)&event[6];
1765
1766	SEQ_DEBUG(5, printf("seq_chncommon: unit %d, dev %d, cmd %s, chn %d,"
1767	    " p1 %d, w14 %d.\n", scp->unit, event[1],
1768	    midi_cmdname(cmd, cmdtab_seqccmn), chn, p1, w14));
1769	mtx_unlock(&scp->seq_lock);
1770	switch (cmd) {
1771	case MIDI_PGM_CHANGE:
1772		SEQ_DEBUG(4, printf("seq_chncommon pgmchn chn %d pg %d\n",
1773		    chn, p1));
1774		SYNTH_SETINSTR(md, chn, p1);
1775		break;
1776	case MIDI_CTL_CHANGE:
1777		SEQ_DEBUG(4, printf("seq_chncommon ctlch chn %d pg %d %d\n",
1778		    chn, p1, w14));
1779		SYNTH_CONTROLLER(md, chn, p1, w14);
1780		break;
1781	case MIDI_PITCH_BEND:
1782		if (scp->music) {
1783			/*
1784		         * TODO: MIDI_PITCH_BEND
1785		         */
1786#if 0
1787			mtx_lock(&md->synth.vc_mtx);
1788			md->synth.chn_info[chn].bender_value = w14;
1789			if (md->midiunit >= 0) {
1790				/*
1791				 * Handle all of the notes playing on this
1792				 * channel.
1793				 */
1794				key = ((int)chn << 8);
1795				for (i = 0; i < md->synth.alloc.max_voice; i++)
1796					if ((md->synth.alloc.map[i] & 0xff00) == key) {
1797						mtx_unlock(&md->synth.vc_mtx);
1798						mtx_unlock(&scp->seq_lock);
1799						if (md->synth.bender(md, i, w14) == EAGAIN) {
1800							mtx_lock(&scp->seq_lock);
1801							return (QUEUEFULL);
1802						}
1803						mtx_lock(&scp->seq_lock);
1804					}
1805			} else {
1806				mtx_unlock(&md->synth.vc_mtx);
1807				mtx_unlock(&scp->seq_lock);
1808				if (md->synth.bender(md, chn, w14) == EAGAIN) {
1809					mtx_lock(&scp->seq_lock);
1810					return (QUEUEFULL);
1811				}
1812				mtx_lock(&scp->seq_lock);
1813			}
1814#endif
1815		} else
1816			SYNTH_BENDER(md, chn, w14);
1817		break;
1818	default:
1819		ret = 1;
1820		SEQ_DEBUG(2,
1821		    printf("seq_chncommon event type %d not handled.\n",
1822		    event[1]));
1823		break;
1824
1825	}
1826	mtx_lock(&scp->seq_lock);
1827	return ret;
1828}
1829
1830static int
1831seq_timing(struct seq_softc *scp, u_char *event)
1832{
1833	int param;
1834	int ret;
1835
1836	ret = 0;
1837	param = event[4] + (event[5] << 8) +
1838	    (event[6] << 16) + (event[7] << 24);
1839
1840	SEQ_DEBUG(5, printf("seq_timing: unit %d, cmd %d, param %d.\n",
1841	    scp->unit, event[1], param));
1842	switch (event[1]) {
1843	case TMR_WAIT_REL:
1844		timer_wait(scp, param, 0);
1845		break;
1846	case TMR_WAIT_ABS:
1847		timer_wait(scp, param, 1);
1848		break;
1849	case TMR_START:
1850		timer_start(scp);
1851		cv_broadcast(&scp->reset_cv);
1852		break;
1853	case TMR_STOP:
1854		timer_stop(scp);
1855		/*
1856		 * The following cv_broadcast isn't needed since we only
1857		 * wait for 0->1 transitions.  It probably won't hurt
1858		 */
1859		cv_broadcast(&scp->reset_cv);
1860		break;
1861	case TMR_CONTINUE:
1862		timer_continue(scp);
1863		cv_broadcast(&scp->reset_cv);
1864		break;
1865	case TMR_TEMPO:
1866		if (param < 8)
1867			param = 8;
1868		if (param > 360)
1869			param = 360;
1870		SEQ_DEBUG(4, printf("Timer set tempo %d\n", param));
1871		timer_setvals(scp, param, scp->timerbase);
1872		break;
1873	case TMR_TIMERBASE:
1874		if (param < 1)
1875			param = 1;
1876		if (param > 1000)
1877			param = 1000;
1878		SEQ_DEBUG(4, printf("Timer set timerbase %d\n", param));
1879		timer_setvals(scp, scp->tempo, param);
1880		break;
1881	case TMR_ECHO:
1882		/*
1883		 * TODO: Consider making 4-byte events for /dev/sequencer
1884		 * PRO: Maybe needed by legacy apps
1885		 * CON: soundcard.h has been warning for a while many years
1886		 * to expect 8 byte events.
1887		 */
1888#if 0
1889		if (scp->music)
1890			seq_copytoinput(scp, event, 8);
1891		else {
1892			param = (param << 8 | SEQ_ECHO);
1893			seq_copytoinput(scp, (u_char *)&param, 4);
1894		}
1895#else
1896		seq_copytoinput(scp, event, 8);
1897#endif
1898		break;
1899	default:
1900		SEQ_DEBUG(2, printf("seq_timing event type %d not handled.\n",
1901		    event[1]));
1902		ret = 1;
1903		break;
1904	}
1905	return ret;
1906}
1907
1908static int
1909seq_local(struct seq_softc *scp, u_char *event)
1910{
1911	int ret;
1912
1913	ret = 0;
1914	mtx_assert(&scp->seq_lock, MA_OWNED);
1915
1916	SEQ_DEBUG(5, printf("seq_local: unit %d, cmd %d\n", scp->unit,
1917	    event[1]));
1918	switch (event[1]) {
1919	default:
1920		SEQ_DEBUG(1, printf("seq_local event type %d not handled\n",
1921		    event[1]));
1922		ret = 1;
1923		break;
1924	}
1925	return ret;
1926}
1927
1928static int
1929seq_sysex(struct seq_softc *scp, kobj_t md, u_char *event)
1930{
1931	int i, l;
1932
1933	mtx_assert(&scp->seq_lock, MA_OWNED);
1934	SEQ_DEBUG(5, printf("seq_sysex: unit %d device %d\n", scp->unit,
1935	    event[1]));
1936	l = 0;
1937	for (i = 0; i < 6 && event[i + 2] != 0xff; i++)
1938		l = i + 1;
1939	if (l > 0) {
1940		mtx_unlock(&scp->seq_lock);
1941		if (SYNTH_SENDSYSEX(md, &event[2], l) == EAGAIN) {
1942			mtx_lock(&scp->seq_lock);
1943			return 1;
1944		}
1945		mtx_lock(&scp->seq_lock);
1946	}
1947	return 0;
1948}
1949
1950/*
1951 * Reset no longer closes the raw devices nor seq_sync's
1952 * Callers are IOCTL and seq_close
1953 */
1954static void
1955seq_reset(struct seq_softc *scp)
1956{
1957	int chn, i;
1958	kobj_t m;
1959
1960	mtx_assert(&scp->seq_lock, MA_OWNED);
1961
1962	SEQ_DEBUG(5, printf("seq_reset: unit %d.\n", scp->unit));
1963
1964	/*
1965	 * Stop reading and writing.
1966	 */
1967
1968	/* scp->recording = 0; */
1969	scp->playing = 0;
1970	cv_broadcast(&scp->state_cv);
1971	cv_broadcast(&scp->out_cv);
1972	cv_broadcast(&scp->reset_cv);
1973
1974	/*
1975	 * For now, don't reset the timers.
1976	 */
1977	MIDIQ_CLEAR(scp->in_q);
1978	MIDIQ_CLEAR(scp->out_q);
1979
1980	for (i = 0; i < scp->midi_number; i++) {
1981		m = scp->midis[i];
1982		mtx_unlock(&scp->seq_lock);
1983		SYNTH_RESET(m);
1984		for (chn = 0; chn < 16; chn++) {
1985			SYNTH_CONTROLLER(m, chn, 123, 0);
1986			SYNTH_CONTROLLER(m, chn, 121, 0);
1987			SYNTH_BENDER(m, chn, 1 << 13);
1988		}
1989		mtx_lock(&scp->seq_lock);
1990	}
1991}
1992
1993/*
1994 * seq_sync
1995 * *really* flush the output queue
1996 * flush the event queue, then flush the synthsisers.
1997 * Callers are IOCTL and close
1998 */
1999
2000#define SEQ_SYNC_TIMEOUT 8
2001static int
2002seq_sync(struct seq_softc *scp)
2003{
2004	int i, rl, sync[16], done;
2005
2006	mtx_assert(&scp->seq_lock, MA_OWNED);
2007
2008	SEQ_DEBUG(4, printf("seq_sync: unit %d.\n", scp->unit));
2009
2010	/*
2011	 * Wait until output queue is empty.  Check every so often to see if
2012	 * the queue is moving along.  If it isn't just abort.
2013	 */
2014	while (!MIDIQ_EMPTY(scp->out_q)) {
2015
2016		if (!scp->playing) {
2017			scp->playing = 1;
2018			cv_broadcast(&scp->state_cv);
2019			cv_broadcast(&scp->out_cv);
2020		}
2021		rl = MIDIQ_LEN(scp->out_q);
2022
2023		i = cv_timedwait_sig(&scp->out_cv,
2024		    &scp->seq_lock, SEQ_SYNC_TIMEOUT * hz);
2025
2026		if (i == EINTR || i == ERESTART) {
2027			if (i == EINTR) {
2028				/*
2029			         * XXX: I don't know why we stop playing
2030			         */
2031				scp->playing = 0;
2032				cv_broadcast(&scp->out_cv);
2033			}
2034			return i;
2035		}
2036		if (i == EWOULDBLOCK && rl == MIDIQ_LEN(scp->out_q) &&
2037		    scp->waiting == 0) {
2038			/*
2039			 * A queue seems to be stuck up. Give up and clear
2040			 * queues.
2041			 */
2042			MIDIQ_CLEAR(scp->out_q);
2043			scp->playing = 0;
2044			cv_broadcast(&scp->state_cv);
2045			cv_broadcast(&scp->out_cv);
2046			cv_broadcast(&scp->reset_cv);
2047
2048			/*
2049			 * TODO: Consider if the raw devices need to be flushed
2050			 */
2051
2052			SEQ_DEBUG(1, printf("seq_sync queue stuck, aborting\n"));
2053
2054			return i;
2055		}
2056	}
2057
2058	scp->playing = 0;
2059	/*
2060	 * Since syncing a midi device might block, unlock scp->seq_lock.
2061	 */
2062
2063	mtx_unlock(&scp->seq_lock);
2064	for (i = 0; i < scp->midi_number; i++)
2065		sync[i] = 1;
2066
2067	do {
2068		done = 1;
2069		for (i = 0; i < scp->midi_number; i++)
2070			if (sync[i]) {
2071				if (SYNTH_INSYNC(scp->midis[i]) == 0)
2072					sync[i] = 0;
2073				else
2074					done = 0;
2075			}
2076		if (!done)
2077			DELAY(5000);
2078
2079	} while (!done);
2080
2081	mtx_lock(&scp->seq_lock);
2082	return 0;
2083}
2084
2085char   *
2086midi_cmdname(int cmd, midi_cmdtab *tab)
2087{
2088	while (tab->name != NULL) {
2089		if (cmd == tab->cmd)
2090			return (tab->name);
2091		tab++;
2092	}
2093
2094	return ("unknown");
2095}
2096