如何调试启动期间发生的 USB 音频事件?

如何调试启动期间发生的 USB 音频事件?

我有一个顶级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 的事件跟踪,这似乎是一种更好的调试方法,但似乎我试图跟踪的事件不受支持,无论如何我都必须编译。

有没有一种我不知道的更简单的调试方法?也许是我忽略的一面旗帜?理想情况下,不涉及无休止的重新启动和编译?不过,我在其他地方从未遇到过这个问题,所以不确定这怎么可能。

谢谢!

相关内容