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 | |
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')
-rw-r--r-- | sys/dev/sound/usb/uaudio.c | 68 | ||||
-rw-r--r-- | sys/dev/sound/usb/uaudio.h | 2 | ||||
-rw-r--r-- | sys/dev/sound/usb/uaudio_pcm.c | 5 |
3 files changed, 73 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; diff --git a/sys/dev/sound/usb/uaudio.h b/sys/dev/sound/usb/uaudio.h index 3f811e6..447a2a9 100644 --- a/sys/dev/sound/usb/uaudio.h +++ b/sys/dev/sound/usb/uaudio.h @@ -25,7 +25,9 @@ * SUCH DAMAGE. */ +#if 0 #define NO_RECORDING /* XXX: some routines missing from uaudio.c */ +#endif /* Defined in uaudio.c, used in uaudio_pcm,c */ diff --git a/sys/dev/sound/usb/uaudio_pcm.c b/sys/dev/sound/usb/uaudio_pcm.c index 89af390..1f20b21 100644 --- a/sys/dev/sound/usb/uaudio_pcm.c +++ b/sys/dev/sound/usb/uaudio_pcm.c @@ -73,6 +73,7 @@ ua_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel * ch->parent = sc; ch->channel = c; ch->buffer = b; + ch->dir = dir; pa_dev = device_get_parent(sc->sc_dev); /* Create ua_playfmt[] & ua_recfmt[] */ @@ -320,7 +321,11 @@ ua_attach(device_t dev) snprintf(status, SND_STATUSLEN, "at addr ?"); +#ifndef NO_RECORDING + if (pcm_register(dev, ua, 1, 1)) { +#else if (pcm_register(dev, ua, 1, 0)) { +#endif return(ENXIO); } |