uaudio and Digigram UAX220

Kazuhito HONDA kazuhito at ph.noda.tus.ac.jp
Wed Oct 26 12:09:06 PDT 2005


Hello,

> http://people.freebsd.org/~ariff/snd_RELENG_5_20051009_054.tar.gz

Though FreeBSD sound system came to be able 
to treat 24-bit sound stream with this patch,
USB audio device can't do yet.
On the other hand, UAX220 may be unable to play/record 8-bit 
and 16-bit sound stream directly, may be able to do 24-bit only.
I expect that it caused that problem.

I had a patch which make USB audio device treat 24-bit on FreeBSD.
It was attached to this mail.  
But cyclic noise will interrupt,
though FreeBSD sound system can play/record sound source.
It may result from USB system in FreeBSD, 
and the patch in (http://home.c2i.net/hselasky/isdn4bsd/privat/usb/)
will resolve this noise problem.
(Usage of this patch was written in http://docs.freebsd.org/cgi/getmsg.cgi?fetch=42785+0+archive/2005/freebsd-multimedia/20050904.freebsd-multimedia)

Sincerely yours,
Kazuhito HONDA

--- uaudio.c.orig	Thu Apr 28 02:16:27 2005
+++ uaudio.c	Tue Sep  6 23:10:09 2005
@@ -3690,7 +3690,7 @@ uaudio_init_params(struct uaudio_softc *
 	if ((sc->sc_playchan.pipe != NULL) || (sc->sc_recchan.pipe != NULL))
 		return (-1);
 
-	switch(ch->format & 0x0000FFFF) {
+	switch(ch->format & 0x000FFFFF) {
 	case AFMT_U8:
 		enc = AUDIO_ENCODING_ULINEAR_LE;
 		ch->precision = 8;
@@ -3723,6 +3723,22 @@ uaudio_init_params(struct uaudio_softc *
 		enc = AUDIO_ENCODING_ULINEAR_BE;
 		ch->precision = 16;
 		break;
+	case AFMT_S24_LE:
+		enc = AUDIO_ENCODING_SLINEAR_LE;
+		ch->precision = 24;
+		break;
+	case AFMT_S24_BE:
+		enc = AUDIO_ENCODING_SLINEAR_BE;
+		ch->precision = 24;
+		break;
+	case AFMT_U24_LE:
+		enc = AUDIO_ENCODING_ULINEAR_LE;
+		ch->precision = 24;
+		break;
+	case AFMT_U24_BE:
+		enc = AUDIO_ENCODING_ULINEAR_BE;
+		ch->precision = 24;
+		break;
 	default:
 		enc = 0;
 		ch->precision = 16;
@@ -3828,6 +3844,8 @@ uaudio_query_formats(device_t dev, u_int
 				fmt = AFMT_U8;
 			} else if (prec == 16) {
 				fmt = AFMT_U16_LE;
+			} else if (prec == 24) {
+				fmt = AFMT_U24_LE;
 			}
 			break;
 		case AUDIO_ENCODING_SLINEAR_LE:
@@ -3835,16 +3853,22 @@ uaudio_query_formats(device_t dev, u_int
 				fmt = AFMT_S8;
 			} else if (prec == 16) {
 				fmt = AFMT_S16_LE;
+			} else if (prec == 24) {
+				fmt = AFMT_S24_LE;
 			}
 			break;
 		case AUDIO_ENCODING_ULINEAR_BE:
 			if (prec == 16) {
 				fmt = AFMT_U16_BE;
+			} else if (prec == 24) {
+				fmt = AFMT_U24_BE;
 			}
 			break;
 		case AUDIO_ENCODING_SLINEAR_BE:
 			if (prec == 16) {
 				fmt = AFMT_S16_BE;
+			} else if (prec == 24) {
+				fmt = AFMT_S24_BE;
 			}
 			break;
 		case AUDIO_ENCODING_ALAW:
@@ -3876,7 +3900,7 @@ uaudio_query_formats(device_t dev, u_int
 			}
 		}
 
-		if ((pn > 8*2) || (rn > 8*2))
+		if ((pn > 12*2) || (rn > 12*2))
 			break;
 	}
 	pfmt[pn] = 0;
--- uaudio_pcm.c.orig	Thu Apr 28 02:16:27 2005
+++ uaudio_pcm.c	Tue Sep  6 23:10:32 2005
@@ -51,13 +51,13 @@ struct ua_info {
 	struct ua_chinfo pch, rch;
 };
 
-static u_int32_t ua_playfmt[8*2+1]; /* 8 format * (stereo or mono) + endptr */
+static u_int32_t ua_playfmt[12*2+1]; /* 8 format * (stereo or mono) + endptr */
 
-static struct pcmchan_caps ua_playcaps = {8000, 48000, ua_playfmt, 0};
+static struct pcmchan_caps ua_playcaps = {8000, 96000, ua_playfmt, 0};
 
-static u_int32_t ua_recfmt[8*2+1]; /* 8 format * (stereo or mono) + endptr */
+static u_int32_t ua_recfmt[12*2+1]; /* 8 format * (stereo or mono) + endptr */
 
-static struct pcmchan_caps ua_reccaps = {8000, 48000, ua_recfmt, 0};
+static struct pcmchan_caps ua_reccaps = {8000, 96000, ua_recfmt, 0};
 
 #define UAUDIO_DEFAULT_BUFSZ		16*1024
 


More information about the freebsd-multimedia mailing list