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