kern/75311: Enable to record with USB audio (uaudio)
Kazuhito HONDA
kazuhito at ph.noda.tus.ac.jp
Mon Dec 20 06:30:36 PST 2004
>Number: 75311
>Category: kern
>Synopsis: Enable to record with USB audio (uaudio)
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Mon Dec 20 14:30:35 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator: Kazuhito HONDA
>Release: FreeBSD 6.0-CURRENT i386
>Organization:
>Environment:
System: FreeBSD kaoru 6.0-CURRENT FreeBSD 6.0-CURRENT #194: Mon Dec 20 23:01:00 JST 2004 root at kaoru:/usr/obj/src/sys/i386/compile/KAORU.6.0B.0 i386
USB device: Sound Blaster Digital Music (SBDM, Creative Labs.)
>Description:
USB devices couldn't record on FreeBSD, at least SBDM.
>How-To-Repeat:
>Fix:
1. At first, apply the patch in `kern/75274'
2. apply the patch below, `F_r.diff'
But I haven't tested this codes except with SBDM.
--- F_r.diff begins here ---
--- src/sys/dev/sound/usb/uaudio.c Mon Dec 20 22:56:41 2004
+++ src/sys/dev/sound/usb/uaudio-91-r.c Mon Dec 20 22:49:44 2004
@@ -1,5 +1,5 @@
/* $NetBSD: uaudio.c,v 1.91 2004/11/05 17:46:14 kent Exp $ */
-/* $FreeBSD: src/sys/dev/sound/usb/uaudio-91.c,v $: */
+/* $FreeBSD: src/sys/dev/sound/usb/uaudio-91-r.c,v $: */
/*
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -3524,6 +3524,9 @@ uaudio_init_params(struct uaudio_softc *
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;
@@ -3570,7 +3573,6 @@ uaudio_init_params(struct uaudio_softc *
}
/* 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;
@@ -3612,7 +3614,10 @@ uaudio_init_params(struct uaudio_softc *
}
}
/* 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:
@@ -3840,6 +3845,65 @@ uaudio_halt_out_dma(device_t dev)
uaudio_chan_free_buffers(sc, &sc->sc_playchan);
}
return (0);
+}
+
+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
--- src/sys/dev/sound/usb/uaudio.h Mon Dec 20 22:56:41 2004
+++ src/sys/dev/sound/usb/uaudio-91-r.h Mon Dec 20 22:49:55 2004
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/sound/usb/uaudio-91.h,v $ */
+/* $FreeBSD: src/sys/dev/sound/usb/uaudio-91-r.h,v $ */
/*
* Copyright (c) 2000-2002 Hiroyuki Aizu <aizu at navi.org>
@@ -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 */
--- src/sys/dev/sound/usb/uaudio_pcm.c Mon Dec 20 22:56:41 2004
+++ src/sys/dev/sound/usb/uaudio_pcm-91-r.c Mon Dec 20 22:50:07 2004
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/sound/usb/uaudio_pcm-91.c,v $ */
+/* $FreeBSD: src/sys/dev/sound/usb/uaudio_pcm-91-r.c,v $ */
/*
* Copyright (c) 2000-2002 Hiroyuki Aizu <aizu at navi.org>
@@ -73,6 +73,7 @@ ua_chan_init(kobj_t obj, void *devinfo,
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);
}
--- F_r.diff ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list