Lines Matching +full:- +full:m
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
91 int hiwat; /* QLEN(outq)>High-water -> disable
158 * auto-assign new unit number unit != 0 already assigned a unit number, eg.
159 * not the first channel provided by this device. channel, sub-unit
169 struct snd_midi *m; in midi_init() local
177 * Protect against call with existing unit/channel or auto-allocate a in midi_init()
180 i = -1; in midi_init()
181 TAILQ_FOREACH(m, &midi_devs, link) { in midi_init()
182 mtx_lock(&m->lock); in midi_init()
184 if (m->unit == unit && m->channel == channel) { in midi_init()
185 mtx_unlock(&m->lock); in midi_init()
192 if (m->unit > i) in midi_init()
193 i = m->unit; in midi_init()
195 mtx_unlock(&m->lock); in midi_init()
202 m = malloc(sizeof(*m), M_MIDI, M_WAITOK | M_ZERO); in midi_init()
203 kobj_init((kobj_t)m, cls); in midi_init()
204 inqsize = MPU_INQSIZE(m, cookie); in midi_init()
205 outqsize = MPU_OUTQSIZE(m, cookie); in midi_init()
211 mtx_init(&m->lock, "raw midi", NULL, 0); in midi_init()
212 mtx_init(&m->qlock, "q raw midi", NULL, 0); in midi_init()
214 mtx_lock(&m->lock); in midi_init()
215 mtx_lock(&m->qlock); in midi_init()
222 MIDIQ_INIT(m->inq, buf, inqsize); in midi_init()
228 m->hiwat = outqsize / 2; in midi_init()
230 MIDIQ_INIT(m->outq, buf, outqsize); in midi_init()
232 if ((inqsize && !MIDIQ_BUF(m->inq)) || in midi_init()
233 (outqsize && !MIDIQ_BUF(m->outq))) in midi_init()
236 m->busy = 0; in midi_init()
237 m->flags = 0; in midi_init()
238 m->unit = unit; in midi_init()
239 m->channel = channel; in midi_init()
240 m->cookie = cookie; in midi_init()
242 if (MPU_INIT(m, cookie)) in midi_init()
245 mtx_unlock(&m->lock); in midi_init()
246 mtx_unlock(&m->qlock); in midi_init()
248 TAILQ_INSERT_TAIL(&midi_devs, m, link); in midi_init()
252 m->dev = make_dev(&midi_cdevsw, unit, UID_ROOT, GID_WHEEL, 0666, in midi_init()
254 m->dev->si_drv1 = m; in midi_init()
256 return m; in midi_init()
259 mtx_destroy(&m->qlock); in midi_init()
260 mtx_destroy(&m->lock); in midi_init()
262 if (MIDIQ_BUF(m->inq)) in midi_init()
263 free(MIDIQ_BUF(m->inq), M_MIDI); in midi_init()
264 if (MIDIQ_BUF(m->outq)) in midi_init()
265 free(MIDIQ_BUF(m->outq), M_MIDI); in midi_init()
267 free(m, M_MIDI); in midi_init()
280 midi_uninit(struct snd_midi *m) in midi_uninit() argument
286 mtx_lock(&m->lock); in midi_uninit()
287 if (m->busy) { in midi_uninit()
288 if (!(m->rchan || m->wchan)) in midi_uninit()
291 if (m->rchan) { in midi_uninit()
292 wakeup(&m->rchan); in midi_uninit()
293 m->rchan = 0; in midi_uninit()
295 if (m->wchan) { in midi_uninit()
296 wakeup(&m->wchan); in midi_uninit()
297 m->wchan = 0; in midi_uninit()
300 err = midi_destroy(m, 0); in midi_uninit()
305 mtx_unlock(&m->lock); in midi_uninit()
331 midi_in(struct snd_midi *m, uint8_t *buf, int size) in midi_in() argument
337 MIDI_DEBUG(5, printf("midi_in: m=%p size=%d\n", m, size)); in midi_in()
342 if (!(m->flags & M_RX)) in midi_in()
347 mtx_lock(&m->qlock); in midi_in()
354 if (!(m->flags & M_RX)) in midi_in()
363 switch (m->inq_state) { in midi_in()
368 m->inq_state = MIDI_IN_SYSEX; in midi_in()
372 m->inq_state = MIDI_IN_DATA; in midi_in()
374 m->inq_left = 1; in midi_in()
377 m->inq_state = MIDI_IN_DATA; in midi_in()
379 m->inq_left = 2; in midi_in()
386 m->inq_state = MIDI_IN_DATA; in midi_in()
388 m->inq_status = data; in midi_in()
389 m->inq_left = MIDI_LENGTH(data); in midi_in()
393 } else if (MIDI_IS_STATUS(m->inq_status)) { in midi_in()
394 m->inq_state = MIDI_IN_DATA; in midi_in()
395 if (!MIDIQ_FULL(m->inq)) { in midi_in()
397 MIDIQ_ENQ(m->inq, &m->inq_status, 1); in midi_in()
400 m->inq_left = MIDI_LENGTH(m->inq_status) - 1; in midi_in()
409 if (--m->inq_left <= 0) in midi_in()
414 m->inq_state = MIDI_IN_START; in midi_in()
419 if (!MIDIQ_FULL(m->inq)) { in midi_in()
420 MIDIQ_ENQ(m->inq, &data, 1); in midi_in()
430 (intmax_t)MIDIQ_LEN(m->inq), in midi_in()
431 (intmax_t)MIDIQ_AVAIL(m->inq))); in midi_in()
432 if (MIDIQ_AVAIL(m->inq) > size) { in midi_in()
434 MIDIQ_ENQ(m->inq, buf, size); in midi_in()
437 mtx_unlock(&m->qlock); in midi_in()
440 if (m->rchan) { in midi_in()
441 wakeup(&m->rchan); in midi_in()
442 m->rchan = 0; in midi_in()
444 selwakeup(&m->rsel); in midi_in()
445 if (m->async) { in midi_in()
446 PROC_LOCK(m->async); in midi_in()
447 kern_psignal(m->async, SIGIO); in midi_in()
448 PROC_UNLOCK(m->async); in midi_in()
453 mtx_unlock(&m->qlock); in midi_in()
461 midi_out(struct snd_midi *m, uint8_t *buf, int size) in midi_out() argument
468 if (!(m->flags & M_TXEN)) in midi_out()
471 MIDI_DEBUG(2, printf("midi_out: %p\n", m)); in midi_out()
472 mtx_lock(&m->qlock); in midi_out()
473 used = MIN(size, MIDIQ_LEN(m->outq)); in midi_out()
476 MIDIQ_DEQ(m->outq, buf, used); in midi_out()
477 if (MIDIQ_EMPTY(m->outq)) { in midi_out()
478 m->flags &= ~M_TXEN; in midi_out()
479 MPU_CALLBACKP(m, m->cookie, m->flags); in midi_out()
481 if (used && MIDIQ_AVAIL(m->outq) > m->hiwat) { in midi_out()
482 if (m->wchan) { in midi_out()
483 wakeup(&m->wchan); in midi_out()
484 m->wchan = 0; in midi_out()
486 selwakeup(&m->wsel); in midi_out()
487 if (m->async) { in midi_out()
488 PROC_LOCK(m->async); in midi_out()
489 kern_psignal(m->async, SIGIO); in midi_out()
490 PROC_UNLOCK(m->async); in midi_out()
493 mtx_unlock(&m->qlock); in midi_out()
500 struct snd_midi *m = i_dev->si_drv1; in midi_open() local
505 if (m == NULL) in midi_open()
508 mtx_lock(&m->lock); in midi_open()
509 mtx_lock(&m->qlock); in midi_open()
514 if (MIDIQ_SIZE(m->inq) == 0) in midi_open()
516 else if (m->flags & M_RX) in midi_open()
522 if (MIDIQ_SIZE(m->outq) == 0) in midi_open()
524 else if (m->flags & M_TX) in midi_open()
529 m->busy++; in midi_open()
531 m->rchan = 0; in midi_open()
532 m->wchan = 0; in midi_open()
533 m->async = 0; in midi_open()
536 m->flags |= M_RX | M_RXEN; in midi_open()
541 MIDIQ_CLEAR(m->inq); in midi_open()
545 m->flags |= M_TX; in midi_open()
547 MPU_CALLBACK(m, m->cookie, m->flags); in midi_open()
551 err: mtx_unlock(&m->qlock); in midi_open()
552 mtx_unlock(&m->lock); in midi_open()
559 struct snd_midi *m = i_dev->si_drv1; in midi_close() local
566 if (m == NULL) in midi_close()
569 mtx_lock(&m->lock); in midi_close()
570 mtx_lock(&m->qlock); in midi_close()
572 if ((flags & FREAD && !(m->flags & M_RX)) || in midi_close()
573 (flags & FWRITE && !(m->flags & M_TX))) { in midi_close()
577 m->busy--; in midi_close()
579 oldflags = m->flags; in midi_close()
582 m->flags &= ~(M_RX | M_RXEN); in midi_close()
584 m->flags &= ~M_TX; in midi_close()
586 if ((m->flags & (M_TXEN | M_RXEN)) != (oldflags & (M_RXEN | M_TXEN))) in midi_close()
587 MPU_CALLBACK(m, m->cookie, m->flags); in midi_close()
589 MIDI_DEBUG(1, printf("midi_close: closed, busy = %d.\n", m->busy)); in midi_close()
591 mtx_unlock(&m->qlock); in midi_close()
592 mtx_unlock(&m->lock); in midi_close()
605 struct snd_midi *m = i_dev->si_drv1; in midi_read() local
611 (unsigned long)uio->uio_resid)); in midi_read()
615 if (m == NULL) in midi_read()
618 mtx_lock(&m->lock); in midi_read()
619 mtx_lock(&m->qlock); in midi_read()
621 if (!(m->flags & M_RX)) in midi_read()
624 while (uio->uio_resid > 0) { in midi_read()
625 while (MIDIQ_EMPTY(m->inq)) { in midi_read()
629 mtx_unlock(&m->lock); in midi_read()
630 m->rchan = 1; in midi_read()
631 retval = msleep(&m->rchan, &m->qlock, in midi_read()
639 if (m != i_dev->si_drv1) in midi_read()
644 mtx_lock(&m->lock); in midi_read()
645 mtx_lock(&m->qlock); in midi_read()
646 m->rchan = 0; in midi_read()
647 if (!m->busy) in midi_read()
652 * At this point, it is certain that m->inq has data in midi_read()
655 used = MIN(MIDIQ_LEN(m->inq), uio->uio_resid); in midi_read()
659 MIDIQ_DEQ(m->inq, buf, used); in midi_read()
669 err1: mtx_unlock(&m->qlock); in midi_read()
670 mtx_unlock(&m->lock); in midi_read()
683 struct snd_midi *m = i_dev->si_drv1; in midi_write() local
690 if (m == NULL) in midi_write()
693 mtx_lock(&m->lock); in midi_write()
694 mtx_lock(&m->qlock); in midi_write()
696 if (!(m->flags & M_TX)) in midi_write()
699 while (uio->uio_resid > 0) { in midi_write()
700 while (MIDIQ_AVAIL(m->outq) == 0) { in midi_write()
704 mtx_unlock(&m->lock); in midi_write()
705 m->wchan = 1; in midi_write()
707 retval = msleep(&m->wchan, &m->qlock, in midi_write()
715 if (m != i_dev->si_drv1) in midi_write()
719 mtx_lock(&m->lock); in midi_write()
720 mtx_lock(&m->qlock); in midi_write()
721 m->wchan = 0; in midi_write()
722 if (!m->busy) in midi_write()
730 used = MIN(MIDIQ_AVAIL(m->outq), uio->uio_resid); in midi_write()
733 uio->uio_resid, (intmax_t)MIDIQ_LEN(m->outq), in midi_write()
734 (intmax_t)MIDIQ_AVAIL(m->outq))); in midi_write()
740 MIDIQ_ENQ(m->outq, buf, used); in midi_write()
744 if (!(m->flags & M_TXEN)) { in midi_write()
745 m->flags |= M_TXEN; in midi_write()
746 MPU_CALLBACK(m, m->cookie, m->flags); in midi_write()
753 err1: mtx_unlock(&m->qlock); in midi_write()
754 mtx_unlock(&m->lock); in midi_write()
768 struct snd_midi *m = i_dev->si_drv1; in midi_poll() local
771 if (m == NULL) in midi_poll()
776 mtx_lock(&m->lock); in midi_poll()
777 mtx_lock(&m->qlock); in midi_poll()
780 if (!MIDIQ_EMPTY(m->inq)) in midi_poll()
784 if (MIDIQ_AVAIL(m->outq) < m->hiwat) in midi_poll()
789 selrecord(td, &m->rsel); in midi_poll()
792 selrecord(td, &m->wsel); in midi_poll()
794 mtx_unlock(&m->lock); in midi_poll()
795 mtx_unlock(&m->qlock); in midi_poll()
804 midi_destroy(struct snd_midi *m, int midiuninit) in midi_destroy() argument
807 mtx_assert(&m->lock, MA_OWNED); in midi_destroy()
810 m->dev->si_drv1 = NULL; in midi_destroy()
811 mtx_unlock(&m->lock); /* XXX */ in midi_destroy()
812 destroy_dev(m->dev); in midi_destroy()
813 TAILQ_REMOVE(&midi_devs, m, link); in midi_destroy()
815 MPU_UNINIT(m, m->cookie); in midi_destroy()
816 free(MIDIQ_BUF(m->inq), M_MIDI); in midi_destroy()
817 free(MIDIQ_BUF(m->outq), M_MIDI); in midi_destroy()
818 mtx_destroy(&m->qlock); in midi_destroy()
819 mtx_destroy(&m->lock); in midi_destroy()
820 free(m, M_MIDI); in midi_destroy()
836 struct snd_midi *m, *tmp; in midi_unload() local
842 TAILQ_FOREACH_SAFE(m, &midi_devs, link, tmp) { in midi_unload()
843 mtx_lock(&m->lock); in midi_unload()
844 if (m->busy) in midi_unload()
847 retval = midi_destroy(m, 1); in midi_unload()
857 mtx_unlock(&m->lock); in midi_unload()