Date: Wed, 26 Dec 2018 15:44:00 +1100 From: Andrew Reilly <areilly@bigpond.net.au> To: multimedia@freebsd.org Subject: Stumped with multi-channel USB sound output Message-ID: <5042D970-166F-4D13-8B0C-BD7216064567@bigpond.net.au>
next in thread | raw e-mail | index | archive | help
--Apple-Mail=_F7D93643-DD45-453F-8ACD-B7288588073E Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Hi there, I've recently acquired one of these: https://www.minidsp.com/products/usb-audio-interface/u-dac8 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): (from dmesg.boot:) uaudio0 on uhub1 uaudio0: <U-DAC8> on usbus1 uaudio0: Play: 192000 Hz, 8 ch, 32-bit S-LE PCM format, 2x8ms buffer. uaudio0: Play: 176400 Hz, 8 ch, 32-bit S-LE PCM format, 2x8ms buffer. uaudio0: Play: 96000 Hz, 8 ch, 32-bit S-LE PCM format, 2x8ms buffer. uaudio0: Play: 88200 Hz, 8 ch, 32-bit S-LE PCM format, 2x8ms buffer. uaudio0: Play: 48000 Hz, 8 ch, 32-bit S-LE PCM format, 2x8ms buffer. uaudio0: Play: 44100 Hz, 8 ch, 32-bit S-LE PCM format, 2x8ms buffer. uaudio0: No recording. uaudio0: No MIDI sequencer. pcm0: <USB audio> on uaudio0 uaudio0: No HID volume keys found. (The motherboard has a an hdac sound device of course, and on the = off-chance that the sound driver was getting confused about = unsynchronised sample rate domains, I've disabled that in = /boot/device.hints:=20 hint.hdacc.0.disabled=3D"1" That still leaves this output in dmesg: hdac0: <ATI (0xaab0) HDA Controller> mem 0xfe860000-0xfe863fff irq 55 at = device 0.1 on pci10 hdac0: hdac_get_capabilities: Invalid corb size (0) device_attach: hdac0 attach returned 6 hdac0: <AMD (0x1457) HDA Controller> mem 0xfe700000-0xfe707fff irq 43 at = device 0.3 on pci12 but the only pcm to show up in /dev/sndstat now is pcm0 belonging to the = uaudio device. I tried using device.hints to disable hdac0, at first, but all that did = was re-number it to hdac1, and all of the motherboard pcm devices were = still found.) Anyway, I can't make it produce sensible output under FreeBSD. It = sounds to me as though somewhere a buffer is incorrectly formatted, or = the wrong size. Sound plays at seemingly about the right rate, but = there is distortion that sounds like blocks of null values at a rate of = about 20-30Hz. It doesn't seem to matter whether I write one, two or = eight channels: sounds the same pitch and distortion rate, although with = mono output my test signal plays out both channel 0 and 1. I expect = that is the automatic vchan mixer at work? The DAC works without problems on macOS. The sysctl values for hw.snd are: hw.snd.maxautovchans: 16 hw.snd.default_unit: 0 hw.snd.version: 2009061500/amd64 hw.snd.default_auto: 1 hw.snd.verbose: 2 hw.snd.vpc_mixer_bypass: 1 hw.snd.feeder_rate_quality: 1 hw.snd.feeder_rate_round: 25 hw.snd.feeder_rate_max: 2016000 hw.snd.feeder_rate_min: 1 hw.snd.feeder_rate_polyphase_max: 183040 hw.snd.feeder_rate_presets: 100:8:0.85 100:36:0.92 100:164:0.97 hw.snd.feeder_eq_exact_rate: 0 hw.snd.feeder_eq_presets: = PEQ:16000,0.2500,62,0.2500:-9,9,1.0:44100,48000,88200,96000,176400,192000 hw.snd.basename_clone: 1 hw.snd.compat_linux_mmap: 0 hw.snd.syncdelay: -1 hw.snd.usefrags: 0 hw.snd.vpc_reset: 0 hw.snd.vpc_0db: 45 hw.snd.vpc_autoreset: 1 hw.snd.timeout: 5 hw.snd.latency_profile: 1 hw.snd.latency: 5 hw.snd.report_soft_matrix: 1 hw.snd.report_soft_formats: 1 and for dev.pcm: dev.pcm.0.feedback_rate: 47999 dev.pcm.0.mixer.mute_1.desc:=20 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:=20 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 dev.pcm.0.play.vchanformat: s16le:2.0 dev.pcm.0.play.vchanrate: 48000 dev.pcm.0.play.vchanmode: fixed dev.pcm.0.play.vchans: 1 dev.pcm.0.hwvol_mixer: vol dev.pcm.0.hwvol_step: 5 dev.pcm.0.%parent: uaudio0 dev.pcm.0.%pnpinfo:=20 dev.pcm.0.%location:=20 dev.pcm.0.%driver: pcm dev.pcm.0.%desc: USB audio dev.pcm.%parent:=20 When running squeezelite, compiled to use portaudio (from ports), = /dev/sndstat says: FreeBSD Audio Driver (64bit 2009061500/amd64) Installed devices: pcm0: <USB audio> at ? kld snd_uaudio (1p:1v/0r:0v) default snddev = flags=3D0x200002e3<SIMPLEX,AUTOVCHAN,BUSY,MPSAFE,REGISTERED,VPC,PRIO_WR> [pcm0:play:dsp0.p0]: spd 48000, fmt 0x00200010/0x08801000, flags = 0x00002108, 0x00000046 interrupts 543, underruns 0, feed 1084, ready 0 = [b:24576/12288/2|bs:4096/2048/2] channel flags=3D0x2108<TRIGGERED,BUSY,HAS_VCHAN> {userland} -> feeder_mixer(0x00200010) -> = feeder_format(0x00200010 -> 0x00201000) -> feeder_matrix(2.0 -> 7.1) -> = {hardware} pcm0:play:dsp0.p0[pcm0:virtual:dsp0.vp0]: spd 44100/48000, fmt = 0x00200010, flags 0x1000114c, 0x00000029, pid 9675 (squeezelite) interrupts 0, underruns 0, feed 1072, ready 7232 = [b:0/0/0|bs:8192/2048/4] channel = flags=3D0x1000114c<RUNNING,TRIGGERED,NBIO,BUSY,HAS_SIZE,VIRTUAL> {userland} -> feeder_root(0x00200010) -> = feeder_volume(0x00200010) -> feeder_rate(0x00200010 q:1 44100 -> 48000) = -> {hardware} No devices installed from userspace. 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? If I run my little test program (attached) to drive all eight channels = directly, it does something much weirder: FreeBSD Audio Driver (64bit 2009061500/amd64) Installed devices: pcm0: <USB audio> at ? kld snd_uaudio (1p:1v/0r:0v) default snddev = flags=3D0x200002e3<SIMPLEX,AUTOVCHAN,BUSY,MPSAFE,REGISTERED,VPC,PRIO_WR> [pcm0:play:dsp0.p0]: spd 48000, fmt 0x00200010/0x08801000, flags = 0x00002108, 0x00000046 interrupts 409, underruns 0, feed 816, ready 0 = [b:24576/12288/2|bs:4096/2048/2] channel flags=3D0x2108<TRIGGERED,BUSY,HAS_VCHAN> {userland} -> feeder_mixer(0x00200010) -> = feeder_format(0x00200010 -> 0x00201000) -> feeder_matrix(2.0 -> 7.1) -> = {hardware} pcm0:play:dsp0.p0[pcm0:virtual:dsp0.vp0]: spd 48000, fmt = 0x08801000/0x00200010, flags 0x1000012c, 0x00000063, pid 9752 (singen) interrupts 0, underruns 0, feed 34680, ready 131072 = [b:0/0/0|bs:131072/4096/32] channel = flags=3D0x1000012c<RUNNING,TRIGGERED,SLEEPING,BUSY,VIRTUAL> {userland} -> feeder_root(0x08801000) -> = feeder_format(0x08801000 -> 0x08800010) -> feeder_matrix(7.1 -> 2.0) -> = feeder_volume(0x00200010) -> {hardware} No devices installed from userspace. 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? 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? 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. If I sysctl dev.pcm.0.play.vchanformat=3Ds32le:7.1 then sndstat seems = more promising: FreeBSD Audio Driver (64bit 2009061500/amd64) Installed devices: pcm0: <USB audio> at ? kld snd_uaudio (1p:1v/0r:0v) default snddev = flags=3D0x200002e3<SIMPLEX,AUTOVCHAN,BUSY,MPSAFE,REGISTERED,VPC,PRIO_WR> [pcm0:play:dsp0.p0]: spd 48000, fmt 0x08801000, flags = 0x00002108, 0x00000004 interrupts 6612, underruns 0, feed 6611, ready 0 = [b:24576/12288/2|bs:32768/16384/2] channel flags=3D0x2108<TRIGGERED,BUSY,HAS_VCHAN> {userland} -> feeder_mixer(0x08801000) -> {hardware} pcm0:play:dsp0.p0[pcm0:virtual:dsp0.vp0]: spd 48000, fmt = 0x08801000, flags 0x1000012c, 0x00000021, pid 9819 (singen) interrupts 0, underruns 0, feed 6611, ready 131072 = [b:0/0/0|bs:131072/4096/32] channel = flags=3D0x1000012c<RUNNING,TRIGGERED,SLEEPING,BUSY,VIRTUAL> {userland} -> feeder_root(0x08801000) -> = feeder_volume(0x08801000) -> {hardware} No devices installed from userspace. 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. Setting dev.pcm.0.bitperfect=3D1 doesn't seem to make any difference, = except the feeder_volume() node goes away in the sndstat output: FreeBSD Audio Driver (64bit 2009061500/amd64) Installed devices: pcm0: <USB audio> at ? kld snd_uaudio (1p:1v/0r:0v) default snddev = flags=3D0x200003e3<SIMPLEX,AUTOVCHAN,BUSY,MPSAFE,REGISTERED,BITPERFECT,VPC= ,PRIO_WR> [pcm0:play:dsp0.p0]: spd 48000, fmt 0x08801000, flags = 0x00002108, 0x00000004 interrupts 359, underruns 0, feed 358, ready 0 = [b:24576/12288/2|bs:32768/16384/2] channel flags=3D0x2108<TRIGGERED,BUSY,HAS_VCHAN> {userland} -> feeder_mixer(0x08801000) -> {hardware} pcm0:play:dsp0.p0[pcm0:virtual:dsp0.vp0]: spd 48000, fmt = 0x08801000, flags 0x3000012c, 0x00000001, pid 9993 (singen) interrupts 0, underruns 0, feed 358, ready 131072 = [b:0/0/0|bs:131072/4096/32] channel = flags=3D0x3000012c<RUNNING,TRIGGERED,SLEEPING,BUSY,VIRTUAL,BITPERFECT> {userland} -> feeder_root(0x08801000) -> {hardware} No devices installed from userspace. 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? Where can I find documentation about the mixer/feeder architecture, to = interpret those sndstat outputs? Cheers, Andrew Reilly M: 0409-824-272 areilly@bigpond.net.au --Apple-Mail=_F7D93643-DD45-453F-8ACD-B7288588073E Content-Disposition: attachment; filename=Makefile Content-Type: application/octet-stream; x-unix-mode=0644; name="Makefile" Content-Transfer-Encoding: 7bit CFLAGS= -Wall -Wextra -O2 -ggdb singen: singen.c $(CC) -o singen $(CFLAGS) singen.c -lm --Apple-Mail=_F7D93643-DD45-453F-8ACD-B7288588073E--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5042D970-166F-4D13-8B0C-BD7216064567>