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