Stumped with multi-channel USB sound output

Hans Petter Selasky hps at
Wed Dec 26 08:38:38 UTC 2018

On 12/26/18 5:44 AM, Andrew Reilly wrote:
> Hi there,
> I've recently acquired one of these:
> to do some multi-amp speaker crossover hi-fi tweaking.  Since my FreeBSD-12.STABLE file server is quite close to my amplifier, I thought that I'd start by using it to drive the DAC.
> It is a USB Audio Class 2.0 device, and as such is recognised seemingly well by the snd_uaudio driver (loaded by /boot/loader.conf, as it doesn't seem to be compiled-in):


> and for dev.pcm:
> dev.pcm.0.feedback_rate: 47999

^ can you sample this parameter over time. Because your device does not 
have any recording endpoints, this value will be used to decide how many 
additional or less samples will be sent. Also check the that USB cable 
has good connection. Sometimes if the cable is slightly bad, data may be 
lost. Isochronous traffic has no re-transmi.

Try also to enable USB audio debugging:

sysctl hw.usb.uaudio.debug=15

> dev.pcm.0.mixer.mute_1.desc:
> dev.pcm.0.mixer.mute_1.max: 1
> dev.pcm.0.mixer.mute_1.min: 0
> dev.pcm.0.mixer.mute_1.val: 0
> dev.pcm.0.mixer.vol_0.desc:
> dev.pcm.0.mixer.vol_0.max: 0
> dev.pcm.0.mixer.vol_0.min: -32512
> dev.pcm.0.mixer.vol_0.val: -11475
> dev.pcm.0.bitperfect: 0
> dev.pcm.0.buffersize: 0
> s16le:2.0

In order to use 8 channels you need to set this sysctl to s32le:7.1 or 

> 48000
> fixed
> 1
> dev.pcm.0.hwvol_mixer: vol
> dev.pcm.0.hwvol_step: 5
> dev.pcm.0.%parent: uaudio0
> dev.pcm.0.%pnpinfo:
> dev.pcm.0.%location:
> dev.pcm.0.%driver: pcm
> dev.pcm.0.%desc: USB audio
> dev.pcm.%parent:

> I think that is saying (working from the bottom up) that userland is sending data which is being sample-rate converted using the default (q:1) sample rate converter to 48kHz, and then feeder_matrix(2.0 -> 7.1) is probably trying to do the right thing to drive eight output channels?

Unless you set the bitperfect option or vchanformat, this is the case.

> That looks as though my eight channels is being mixed down to two (on the last line) and then up-mixed to eight (7.1)?  I don't want it to do that.  How do I stop it?

See hints about setting sysctl options.

> Also, this hardware is perfectly capable of running at 44100Hz, as shown in the dmesg output.  Is there a way to tell the pcm driver to set the hardware sample rate, rather than do sample rate conversion in software?

sysctl hw.usb.uaudio.default_rate=44100

> Is there any documentation about any of this?  The pcm(4) man page says that there is matrixing support to handle channel routing and up/down mixing, but it isn't particularly clear about the possibilities.

> but the audio output distortion is the same.  Despite the distorted output, sndstat is indicating that there are no underruns, and there are no kernel messages showing up in the dmesg buffer about pcm misbehaviour.

The problem is the formula in:

static void
uaudio_chan_play_sync_callback(struct usb_xfer *xfer, usb_error_t error)

in sys/dev/sound/usb/uaudio.c Maybe you can play with it.

> Am I going to win, with additional tweaking, do you think?  Or will I be better off setting up a Raspberry Pi or the like, running linux, to drive it?

Raspberry Pi doesn't work very well with USB audio devices of this kind. 
What kind of USB host are you using?

Are there any USB HUBs in between? Try connecting directly to the computer?

> Where can I find documentation about the mixer/feeder architecture, to interpret those sndstat outputs?

Maybe send a patch if you think something is very useful?


More information about the freebsd-multimedia mailing list