脉冲/alsa 上的音频失真,在 JACK 上运行良好。如何分析 JACK 工作正常的原因并利用这些知识来修复脉冲/alsa 配置?

脉冲/alsa 上的音频失真,在 JACK 上运行良好。如何分析 JACK 工作正常的原因并利用这些知识来修复脉冲/alsa 配置?

为了测试和解决这个问题,我使用全新安装的 Fedora 33,音频设置或配置文件保持不变。

默认情况下,音频严重失真(它可以辨别正在播放的内容,但总体来说不可用)。

但是,当我安装并启动jackd并使其运行时,设置如下:

jackd -r -dalsa -dhw:0 -r48000 -p256 -n2

然后尝试一个音频文件mpv(可以使用JACK),声音清脆清晰,按预期工作:

mpv --ao=jack test.flac

注:也jackd-r44100作品。

这当然不是令人满意的通用方法,因为并非每个软件都能够单独使用 JACK,因此它不适用于 Firefox。

因为 JACK 能够正确处理事情,所以我猜是脉冲或 alsa(自动)设置导致了问题?或者可能是其他什么?

简而言之:我如何使用 ALSA 配置(或脉冲音频)复制 JACK 所做的事情。通过 ALSA 的解决方案是首选使这个答案有效无脉搏以及。当然也有可能是pulsuadio导致了这个问题,我不知道。


附加信息:

  • 输出aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Studio [Audiofuse Studio], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 0: ALC1220 Analog [ALC1220 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 1: ALC1220 Digital [ALC1220 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
  • 输出jackd -r -dalsa -dhw:0 -r48000 -p256 -n2
jackdmp 1.9.14
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2016 Grame.
Copyright 2016-2019 Filipe Coelho.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
no message buffer overruns
no message buffer overruns
no message buffer overruns
JACK server starting in non-realtime mode
self-connect-mode is "Don't restrict self connect requests"
audio_reservation_init
Acquire audio card Audio0
creating alsa driver ... hw:0|hw:0|256|2|48000|0|0|nomon|swmeter|-|32bit
configuring for 48000Hz, period = 256 frames (5.3 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 32bit integer little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 32bit integer little-endian
ALSA: use 2 periods for playback
  • 输出aplay --dump-hw-params -D hw:Studio -t raw /dev/zero
Playing raw data '/dev/zero' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "hw:Studio":
--------------------
ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT:  S32_LE
SUBFORMAT:  STD
SAMPLE_BITS: 32
FRAME_BITS: [320 576]
CHANNELS: [10 18]
RATE: [44100 192000]
PERIOD_TIME: [125 297211)
PERIOD_SIZE: [6 13107]
PERIOD_BYTES: [240 524288]
PERIODS: [2 1024]
BUFFER_TIME: (62 594422)
BUFFER_SIZE: [12 26214]
BUFFER_BYTES: [480 1048576]
TICK_TIME: ALL
--------------------
aplay: set_params:1343: Sample format non available
Available formats:
- S32_LE
  • 输出cat /proc/asound/Studio/stream0(仅“播放”):
Playback:
  Status: Stop
  Interface 1
    Altset 1
    Format: S32_LE
    Channels: 18
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000
    Data packet interval: 125 us
    Bits: 24
  Interface 1
    Altset 2
    Format: S32_LE
    Channels: 18
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000
    Data packet interval: 125 us
    Bits: 24
  Interface 1
    Altset 3
    Format: S32_LE
    Channels: 10
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000
    Data packet interval: 125 us
    Bits: 24
    Channel map: FL FR FC LFE RL RR FLC FRC RC SL

答案1

我明白了,我尝试使用 sox 自己转换文件。然后我得到的是以下错误:播放 WAVE 'CONVERTED-test.wav' :签名 32 位 Little Endian,速率 44100 Hz,立体声 aplay:set_params:1349:通道计数不可用。使用通道 18 和 sox 命令最终使 aplay 正确且清晰地播放文件!注意:当我使用通道 10 的 sox 转换文件时,文件也会由 aplay 播放,但在这种情况下,文件会再次失真。通道的任何其他数字将导致通道计数不可用错误。

因此,看起来 10 通道的接口在驱动程序或其他地方存在错误,您需要说服 Pulseaudio 使用 18 通道的接口。

看着模块 alsa 接收器,你可以把它放在一个ALSA设备上。

这可能意味着您需要在~/.asoundrc.

您可以配置通道数硬件插件,但我自己从未这样做过,而且我没有具有这些通道选择的硬件。

所以我想这需要对各种配置文件进行一些实验。这很难远程完成,我无法向您提供分步说明。

另一种选择是在 ALSA 跟踪器上提交错误报告。他们可能会发现驱动程序中的问题(如果是通用 USB 驱动程序,这可能需要一个怪癖),或者为您提供配置文件的建议。

ALSA Bug 跟踪解释这里

相关内容