diff options
author | julian <julian@FreeBSD.org> | 2004-12-25 08:51:47 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 2004-12-25 08:51:47 +0000 |
commit | 88c3963f8397b0675ec91ee7189c779ebc73cae9 (patch) | |
tree | c5319c978ab83a8142a1c83534ca12643cca6a62 /sys/dev/sound/usb/uaudio.c | |
parent | 8f174b69919d7f61e2d2e550f1a57e38df80aeba (diff) | |
download | FreeBSD-src-88c3963f8397b0675ec91ee7189c779ebc73cae9.zip FreeBSD-src-88c3963f8397b0675ec91ee7189c779ebc73cae9.tar.gz |
Allow recording on at least some USB audio devices.
PR: 75311
Submitted by: Kazuhito HONDA <kazuhito at ph dot noda dot tus dot ac dot jp>
Obtained from: NetBSD plus changes
MFC after: 2 weeks
Diffstat (limited to 'sys/dev/sound/usb/uaudio.c')
-rw-r--r-- | sys/dev/sound/usb/uaudio.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c index bca4f3c..a05f8ec 100644 --- a/sys/dev/sound/usb/uaudio.c +++ b/sys/dev/sound/usb/uaudio.c @@ -3634,6 +3634,9 @@ uaudio_init_params(struct uaudio_softc *sc, struct chan *ch, int mode) int i, j, enc; int samples_per_frame, sample_size; + if ((sc->sc_playchan.pipe != NULL) || (sc->sc_recchan.pipe != NULL)) + return (-1); + switch(ch->format & 0x0000FFFF) { case AFMT_U8: enc = AUDIO_ENCODING_ULINEAR_LE; @@ -3680,7 +3683,6 @@ uaudio_init_params(struct uaudio_softc *sc, struct chan *ch, int mode) } /* for (mode = ...... */ -/*But this function is used for output only */ for (i = 0; i < sc->sc_nalts; i++) { const struct usb_audio_streaming_type1_descriptor *a1d = sc->sc_alts[i].asf1desc; @@ -3722,7 +3724,10 @@ uaudio_init_params(struct uaudio_softc *sc, struct chan *ch, int mode) } } /* return (EINVAL); */ - printf("uaudio: This device can't play in rate=%d.\n", ch->sample_rate); + if (mode == AUMODE_PLAY) + printf("uaudio: This device can't play in rate=%d.\n", ch->sample_rate); + else + printf("uaudio: This device can't record in rate=%d.\n", ch->sample_rate); return (-1); found: @@ -3953,6 +3958,65 @@ uaudio_halt_out_dma(device_t dev) } int +uaudio_halt_in_dma(device_t dev) +{ + struct uaudio_softc *sc; + + sc = device_get_softc(dev); + + if (sc->sc_dying) + return (EIO); + + DPRINTF(("uaudio_halt_in_dma: enter\n")); + if (sc->sc_recchan.pipe != NULL) { + uaudio_chan_close(sc, &sc->sc_recchan); + sc->sc_recchan.pipe = NULL; + uaudio_chan_free_buffers(sc, &sc->sc_recchan); +/* sc->sc_recchan.intr = NULL; */ + } + return (0); +} + +int +uaudio_trigger_input(device_t dev) +{ + struct uaudio_softc *sc; + struct chan *ch; + usbd_status err; + int i, s; + + sc = device_get_softc(dev); + ch = &sc->sc_recchan; + + if (sc->sc_dying) + return (EIO); + +/* uaudio_chan_set_param(ch, start, end, blksize) */ + if (uaudio_init_params(sc, ch, AUMODE_RECORD)) + return (EIO); + + err = uaudio_chan_alloc_buffers(sc, ch); + if (err) + return (EIO); + + err = uaudio_chan_open(sc, ch); + if (err) { + uaudio_chan_free_buffers(sc, ch); + return (EIO); + } + +/* ch->intr = intr; + ch->arg = arg; */ + + s = splusb(); + for (i = 0; i < UAUDIO_NCHANBUFS-1; i++) /* XXX -1 shouldn't be needed */ + uaudio_chan_rtransfer(ch); + splx(s); + + return (0); +} + +int uaudio_trigger_output(device_t dev) { struct uaudio_softc *sc; |