设置Pulseaudio的默认ALSA设备

我最近购买了一个外置声卡/DAC(Fiio E17),目前正在尝试在我的Ubuntu 12.04系统上正确配置它。当通过USB插入时,系统立即识别并在音频设置中显示为新设备。播放功能基本正常(除了一些与音量相关的小问题,超出了本问题的范围)。
然而,当我尝试使用mplayer播放24位/96 kHz的音频文件进行测试时,遇到了一个小问题:
Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 96000 Hz, 2 ch, s24le, 4608.0 kbit/100.00% (ratio: 576000->576000)
Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)
==========================================================================
AO: [pulse] 96000Hz 2ch s16le (2 bytes per sample)

从输出中可以看出,尽管播放的文件包含24位/96 kHz音频,但在播放之前被重新采样为16位。使用aplay播放相同的文件可以看到原因。
Playing WAVE 'sr003-02-2496.wav' : Signed 24 bit Little Endian in 3bytes, Rate 96000 Hz, Stereo
aplay: set_params:1081: Sample format non available
Available formats:
- U8
- S16_LE
- S16_BE
- S32_LE
- S32_BE
- FLOAT_LE
- FLOAT_BE
- MU_LAW
- A_LAW

然而,/proc/asound/card1/stream0 证实了硬件确实支持24位。
FiiO FiiO USB DAC-E17 at usb-0000:00:1a.0-1.1, full speed : USB Audio

Playback:
  Status: Running
    Interface = 3
    Altset = 1
    Packet Size = 388
    Momentary freq = 44100 Hz (0x2c.199a)
  Interface 3
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 3 OUT (ADAPTIVE)
    Rates: 32000, 44100, 48000, 96000
  Interface 3
    Altset 2
    Format: S24_3LE
    Channels: 2
    Endpoint: 3 OUT (ADAPTIVE)
    Rates: 32000, 44100, 48000, 96000

这个时候我注意到在声音设置的硬件选项卡中,我可以为声卡选择两个不同的配置文件:数字立体声(IEC958)和模拟立体声。然而,在这两者之间切换并没有什么变化,就我所知。
不过,指定ALSA设备确实有帮助(也就是说,aplay -Dhw:1,0 sr003-02-2496.wav可以正常工作并播放文件而不进行重新采样)。但由于Pulseaudio在声音设置中只显示一个Fiio设备/输出,我不确定如何告诉Pulseaudio使用ALSA设备hw:1,0。将load-module module-alsa-source device=hw:1,0添加到/etc/pulse/default.pa会导致Pulseaudio在启动时中止,并显示module.c: Failed to load module "module-alsa-source" (argument: "device=hw:1,0"): initialization failed.
所以,这就是前言,接下来是我的实际问题
  • 我怎么知道当我在声音设置中选择Fiio E17时,Pulseaudio实际使用哪个ALSA设备?
  • 我怎么告诉Pulseaudio在选择Fiio E17时使用ALSA设备hw:1,0?

一些更多(希望有帮助的)调试信息:


“mplayer” 和 “aplay” 是什么命令行? - CL.
@CL。我运行mplayer -ao alsa:device=hw=1.0 sr003-02-2496.wavaplay -Dhw:1,0 sr003-02-2496.wav来使用正确的设备,如果这是你问的。 - tmnt
我在询问那些没有成功的电话。你想要使用PulseAudio吗? - CL.
@CL。啊,抱歉,那些只是普通的调用,没有任何标志,即aplay sr003-02-2496.wavmplayer sr003-02-2496.wav。如果可能的话,我想使用PulseAudio。 - tmnt
6个回答

回答这两个问题:
您可以使用GNOME音量控制、pavucontrol或从命令行使用pacmd set-default-sink来选择PulseAudio中的默认设备。
默认情况下,PulseAudio以44.1 kHz或48 kHz打开设备,选择会导致较低的重采样工作(因此,96 kHz音频通常会以48 kHz打开设备)。此外,默认情况下我们以S16LE打开设备。
现在,您有两个选择。如果您只想播放一些文件的原始格式,paplay --passthrough <file>应该适合您。您甚至可以指定要使用的设备。
另一个选择是全局设置PA使用96/24。您可以在/etc/pulse/default.conf中更改该设置( alternate-sample-rate = 96000default-sample-format=s24-32le)。不过,这将增加CPU的使用率。这是一个有点傻的情况,需要对所有设备应用全局配置。我们计划在某个时候添加每个设备的单独配置。
请注意,在这之后,您应该使用mplayer的PulseAudio后端,而不是让mplayer与ALSA通信,然后再通过ALSA与PulseAudio进行通信。您可以使用mplayer -ao pulse ...来实现这一点,如果您想要永久设置它,请在~/.mplayer/config中添加ao=pulse

非常感谢你的帮助!pacmd set-default-sink只能让我设置pacmd list-sinks中列出的其中一个sink,对吗?不过,我猜你回答的第二部分已经使这个问题无关了;)所以,如果我理解你的意思正确的话,Pulseaudio不支持在24位和16位之间动态切换?在更改了我的default.conf之后,mplayer似乎仍然会将所有内容重新采样为16位,然后再传递给pulse(请参见此处),这是因为CL在他的回答中描述的原因吗? - tmnt
哦,而且 paplay 似乎不喜欢我的音频文件 :) 播放24位文件会导致一个段错误,错误信息为 Code should not be reached at pulsecore/sndfile-util.c:391, function pa_sndfile_readf_function(). Aborting.,而播放32位文件甚至会导致Pulseaudio崩溃 - tmnt

更新到13.10后,Pulseaudio默认将音频输出设置为HDMI,可能是因为我通过迷你显示端口连接了一台额外的显示器(联想T430S笔记本电脑)。archlinux网站 提供了一个简单明了的答案来重置或设置默认输出:
  • 登录并将默认输出更改为模拟

  • 运行

    $ aplay -l

找到模拟音频是卡0

  • 运行

    $ pacmd list

找到以下行:

active profile: <output:analog-stereo+input:analog-stereo>

"output:analog-stereo+input:analog-stereo" 是我的配置文件名称,所以请添加。
set-card-profile 0 output:analog-stereo+input:analog-stereo

在/etc/pulse/default.pa中保存并退出。
  • 重新启动pulseaudio

应用程序与PulseAudio之间的接口中使用的示例格式并不总是与PulseAudio用于访问硬件设备的示例格式直接相关。
`S24_3LE`并非PulseAudio支持的应用程序格式之一(如`aplay`输出所示)。 为了让具有这种不寻常格式的应用程序能够与PulseAudio配合运行,您可以在`.asoundrc`文件中添加一个插件,用于默认PCM设备的自动格式转换。
pcm.!default {
    type linear
    slave.pcm pulse
}

感谢您的帮助,但我很抱歉这没有改变任何事情。即使在将此添加到我的.asoundrc后,mplayer仍会将音频降采样为16位(即输出与我问题中发布的相同),/proc/asound/card1/stream0仍显示使用错误的altset。如果实际上是PA支持的格式有问题,既然它仍然使用Pulseaudio,那么即使指定ALSA设备,mplayer也应该将音频降采样吗? - tmnt
现在aplay可以工作了吗?这似乎是mplayer中的一个错误。 - CL.
不,aplay仍然以相同的输出失败。我现在注意到,在我的.pulse/daemon.conf中设置default-sample-format = s24-32le可以强制PA使用正确的输出设备。然而,mplayer仍然会重新采样音频,当尝试播放24位音频文件时,aplay仍然无法成功,所以我猜这也没有帮助。 - tmnt

我发现了一个在Lubuntu Trusty Tahr上使用我的Fiio E17通过USB连接的快速解决方法: 我也对比特率感到好奇,所以我在这里找到了这些帖子。但由于我在一台相当老旧的Netbook上听音乐,所以我不想将其默认设置为96/24(因为CPU不是最快的) 然而,对我有效的方法是使用VLC,并在专家音频设置中指定使用ALSA模块进行输出,然后使用以下输出设备: "Fiio USB DAC-E17, USB Audio Direct hardware device without any conversions"
这样,当我想要时,我就能够通过USB将96/24的声音输出到Fiio上(Fiio的小屏幕上也显示)- 而且我不需要在操作系统中做更多根本性的改变。像audacious或浏览器这样的播放器仍然使用默认的pulseaudio输出。 有时候VLC会说设备已经被使用了 - 然后只需关闭其他软件,如正在使用pulseaudio输出的audacious,它应该就能工作。
问候, Andi

另请参阅:http://askubuntu.com/questions/334626/how-can-i-enable-digital-output-on-a-fiio-e7-without-ending-session - landroni

load-module module-alsa-source device=hw:1,0添加到/etc/pulse/default.pa是正确的方法。然而,为了避免设备冲突(你收到的initialization failed错误),必须卸载以下模块:
  • module-udev-detect
  • module-detect
仔细检查你的/etc/pulse/default.pa并删除包含这些模块的行。此外,在这种情况下无法自动检测设备,所以你需要加载module-alsa-sink来手动指定一个sink。

如果只手动加载捕获(源)设备,是否会出现冲突检测回放(接收器)? - Lucas

这是这个问题的正确答案:
ArchWiki获取。
确定您想要使用的ALSA hw设备。 然后将其添加到您的default.pa文件中。(根据您的设备更改0,0)
load-module module-alsa-sink device=hw:0,0