summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2004-12-25 08:51:47 +0000
committerjulian <julian@FreeBSD.org>2004-12-25 08:51:47 +0000
commit88c3963f8397b0675ec91ee7189c779ebc73cae9 (patch)
treec5319c978ab83a8142a1c83534ca12643cca6a62 /sys/dev
parent8f174b69919d7f61e2d2e550f1a57e38df80aeba (diff)
downloadFreeBSD-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.c68
-rw-r--r--sys/dev/sound/usb/uaudio.h2
-rw-r--r--sys/dev/sound/usb/uaudio_pcm.c5
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);
}
OpenPOWER on IntegriCloud