From kazuhito@ph.noda.tus.ac.jp  Mon Dec 20 14:22:26 2004
Return-Path: <kazuhito@ph.noda.tus.ac.jp>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id C5B6C16A4CE
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 20 Dec 2004 14:22:26 +0000 (GMT)
Received: from t-mta1.odn.ne.jp (mfep1.odn.ne.jp [143.90.131.179])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 7891D43D6B
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 20 Dec 2004 14:22:25 +0000 (GMT)
	(envelope-from kazuhito@ph.noda.tus.ac.jp)
Received: from localhost ([219.66.84.86]) by t-mta1.odn.ne.jp with ESMTP
          id <20041220142223812.ZPTT.199623.t-mta1.odn.ne.jp@mta1.odn.ne.jp>;
          Mon, 20 Dec 2004 23:22:23 +0900
Message-Id: <20041220.232218.730550289.kazuhito@ph.noda.tus.ac.jp>
Date: Mon, 20 Dec 2004 23:22:18 +0900 (JST)
From: Kazuhito HONDA <kazuhito@ph.noda.tus.ac.jp>
Reply-To: Kazuhito HONDA <kazuhito@ph.noda.tus.ac.jp>
To: FreeBSD-gnats-submit@freebsd.org
Cc: kazuhito@ph.noda.tus.ac.jp
Subject: Enable to record with USB audio (uaudio)
X-Send-Pr-Version: 3.113

>Number:         75311
>Category:       kern
>Synopsis:       [patch] [sound] Enable to record with USB audio (uaudio)
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    sound
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Dec 20 14:30:35 GMT 2004
>Closed-Date:    Tue Jun 14 12:52:00 GMT 2005
>Last-Modified:  Tue Jun 14 12:52:00 GMT 2005
>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@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@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@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:
Responsible-Changed-From-To: freebsd-bugs->sound 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Sun Apr 3 08:56:38 GMT 2005 
Responsible-Changed-Why:  
Reassign to appropriate mailing list. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=75311 

From: Kazuhito HONDA <kazuhito@ph.noda.tus.ac.jp>
To: freebsd-gnats-submit@FreeBSD.org
Cc: kazuhito@ph.noda.tus.ac.jp
Subject: Re: kern/75311: Enable to record with USB audio (uaudio)
Date: Sat, 16 Apr 2005 01:23:41 +0900 (JST)

 This PR has been MFCed. So please close this PR.
State-Changed-From-To: open->closed 
State-Changed-By: arved 
State-Changed-When: Tue Jun 14 12:51:41 GMT 2005 
State-Changed-Why:  
According to submitter, PR has been committed. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=75311 
>Unformatted:
