我有一个顶级D30Pro USB DAC一旦登录,它(大部分)工作得很好,但是在启动(systemd)期间,就在“达到目标声卡”周围,它开始输出,我不得不猜测,连续的锯齿声波。我的解决方法是将设备静音,直到我登录为止,因为它的声音很大。无论如何,登录过程可以解决该问题。
自从一年多前购买该设备以来,我就一直忍受着这个问题。最近,我发现自己有动力找出根本原因。
就在它周围发生,dmesg
输出以下内容:
usb 1-8: 1:3 : unsupported format bits 0x100000000
负责这一行的代码是在内核中。据我了解,该格式第一接口的第三替代设置,即DSD,无法识别:
$ cat /proc/asound/card0/stream0
Topping D30 Pro at usb-0000:00:14.0-8, high speed : USB Audio
Playback:
Status: Running
Interface = 1
Altset = 1
Packet Size = 72
Momentary freq = 44099 Hz (0x5.8328)
Feedback Format = 16.16
Interface 1
Altset 1
Format: S32_LE
Channels: 2
...
Interface 1
Altset 3
Format: SPECIAL DSD_U32_BE
Channels: 2
Endpoint: 0x01 (1 OUT) (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
Data packet interval: 125 us
Bits: 32
DSD raw: DOP=0, bitrev=0
Channel map: FL FR
Sync Endpoint: 0x81 (1 IN)
Sync EP Interface: 1
Sync EP Altset: 3
Implicit Feedback Mode: No
问题是,我可以使用 PipeWire 很好地播放 DSD 文件:
$ pw-dsdplay DSD128.dsf -v
dsffile: opened file "DSD128.dsf" channels:2 rate:5644800 samples:7098793984 bitorder:lsb
...
在这一点上,我最好的猜测是该怪癖适用于我的设备启动期间不工作。为什么它只在启动期间发生,我不知道。
物有所值;启动/使用 FreeBSD 或 Windows 时绝对没有问题。无论我尝试使用 LiveCD 启动哪个 Linux 发行版(Debian、Fedora、Arch、Ubuntu,...),它都会发生,所以它看起来与发行版无关,但我在6.4.12-arch1-1
.
作为下一步,我正在考虑编译一个新内核,并为函数中使用的结构添加打印语句,但后来我发现基于 Kprobe 的事件跟踪,这似乎是一种更好的调试方法,但似乎我试图跟踪的事件不受支持,无论如何我都必须编译。
有没有一种我不知道的更简单的调试方法?也许是我忽略的一面旗帜?理想情况下,不涉及无休止的重新启动和编译?不过,我在其他地方从未遇到过这个问题,所以不确定这怎么可能。
谢谢!