通过mpd配置USB-DAC的音量控制

时间:2014-03-09 14:04:02

标签: audio linux-device-driver alsa mpd

我正在使用Raspberry Pi和Raspbian以及NuForce uDAC-3 USB-DAC构建音乐播放器系统。

我让mpd在/etc/mpd.conf中使用这些行使用DAC代替Pi的声音系统。据我所知,这里必不可少的是选择hw device 1而不是默认0。

audio_output {
   type            "alsa"
   name            "My ALSA Device"
   device          "hw:1,0"        # optional
   format          "44100:16:2"    # optional
   mixer_device    "default"       # optional
   mixer_control   "PCM"           # optional
   mixer_index     "0"             # optional
}

用于我的DAC(snd_usb_audio)的驱动程序不支持硬件音量控制。例如,在alsamixer中没有可用的音量控制。据我所知,这是该驱动程序的已知“功能”或它对该DAC的支持。我通过在/etc/mpd.conf中取消注释来让mpd控制音量:

mixer_type                      "software"

现在的主要问题是音量控制存在一些延迟,而集成音响系统并不存在。我的意思是,当我在我的客户端程序(QMPDClient)中滑动音量控制时,在听到音量变化之前有一个短暂但值得注意的延迟。这是可以忍受的,但让我怀疑一切是否真的有效。

与第一个问题有些相关的第二个问题是,我想知道是否有办法让声音更完美,就任何配置文件而言。

我已经尝试过在互联网上找到的/etc/asound.conf的各种例子,但要么我不明白他们应该做什么,要么他们根本不工作。我认为我会得到的是由mpd识别的DAC的主音量控制器或具有主音量控制并将声音馈送到DAC的虚拟声卡。最初,/ etc / asound.conf是空的,它仍然是,现在似乎什么也没有影响。

只是因为它有任何相关性,音乐是从CD中翻录的.flac文件。

2 个答案:

答案 0 :(得分:1)

要降低延迟,请减少buffer_time setting

audio_output {
    ...
    buffer_time 100000
}

答案 1 :(得分:1)

snd-usb-audio驱动程序支持外部dac中的硬件音量控制。 问题是你的dac是否支持它。 我使用Micromega MYDAC设置为USB 2.0,背面有一个小开关。 插入后,dmesg给出:

$ dmesg 
[  489.232193] usb 2-2: new high-speed USB device number 4 using ehci-pci
[  489.365330] usb 2-2: New USB device found, idVendor=26f2, idProduct=0200
[  489.365340] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  489.365348] usb 2-2: Product: MICROMEGA MYDAC
[  489.365355] usb 2-2: Manufacturer: MICROMEGA 
[  489.365361] usb 2-2: SerialNumber: 0000
[  489.855449] usbcore: registered new interface driver snd-usb-audio

使用amixer我可以看到音量控制界面:

$ amixer -c MYDAC scontents
Simple mixer control 'MICROMEGA Clock Selector',0
  Capabilities: pvolume pswitch
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 127
  Mono:
  Front Left: Playback 127 [100%] [0.00dB] [off]
  Front Right: Playback 127 [100%] [0.00dB] [off]
Simple mixer control 'MICROMEGA Clock Selector',1
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback 0 - 127
  Mono: Playback 121 [95%] [-6.00dB] [off]

我的mpd.conf的audio_output部分包含:

audio_output {
type "alsa"
name "MICROMEGA MYDAC"
device "hw:MYDAC" 
mixer_type "hardware"
mixer_device "hw:MYDAC"
mixer_control "MICROMEGA Clock Selector" 
replay_gain_handler "mixer"
auto_resample "no"
auto_channels "no"
auto_format "no"
}

使用mpc命令或任何其他mpd客户端,卷现在可以设置为任何百分比:

$ mpc volume 100
Oscar Peterson - On A Clear Day You Can See Forever
[playing] #169/213   0:30/4:25 (11%)
volume:100%   repeat: on    random: on    single: off   consume: off

$ mpc volume 90
Oscar Peterson - On A Clear Day You Can See Forever
[playing] #169/213   0:33/4:25 (12%)
volume: 90%   repeat: on    random: on    single: off   consume: off

然而,这是坏消息开始的地方。 看看amixer的界面,我们看到外部DAC在我们将其音量设置为90%时实际做了什么。 由于其音量限制为0..127,因此将音量设置为127的90%即114。 现在114是127-13所以它只是将音量降低了13 dB!

$ amixer -c MYDAC scontents
Simple mixer control 'MICROMEGA Clock Selector',0
  Capabilities: pvolume pswitch
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 127
  Mono:
  Front Left: Playback 114 [90%] [-13.00dB] [on]
  Front Right: Playback 114 [90%] [-13.00dB] [on]

因此从127开始的每一步都会使音量降低1 dB。 这根本不是90%的音量。 dB标度应如下工作:

0    dB = 100%
-0.9 dB =  90%
-1.9 dB =  80%
-6   dB =  50%
-20  dB =  10%

所以DAC应该将音量降低0.9 dB,而不是降低13 dB。

当您想使用replaygain自动控制音量时,这将变得更加灾难性。 mpd使用我上面给出的dB刻度。 我把所有的CD都撕成了flac并添加了replaygain标签。 这些在其他两个系统上运行良好,不使用外部DAC(三星平板电脑上的Android上的Poweramp和openPandora设备上的Deadbeaf)。所有卷都很顺利。

例如,当我使用mpd与MYDAC时,会发生以下情况。 mpd播放一首歌曲,曲目重放率为-4.3 dB。 所以mpd指示接口达到60%,因为20log为0.60 = -4.3 dB。 但是,界面没有达到60%的音量。 相反,它将其参数0..127设置为60%的值,即0.60 x 127 = 76。 由于最大参数值127对应于0 dB而76是127-51, DAC简单地降低到-51 dB而不是预期的-4.3 dB。 结果就是音乐再也听不到了!

$ metaflac --list 01.Dancers_in_Love.flac
....
METADATA block #2
  type: 4 (VORBIS_COMMENT)
  comments: 11
    comment[0]: ARTIST=Duke Ellington
    comment[1]: ALBUM=The Small Groups
    comment[2]: TITLE=Dancers in Love
    comment[3]: GENRE=Big Band
    comment[4]: TRACKNUMBER=01
    comment[5]: CDDB=7d10d619
    comment[6]: REPLAYGAIN_REFERENCE_LOUDNESS=89.0 dB
    comment[7]: REPLAYGAIN_TRACK_GAIN=-4.34 dB
    comment[8]: REPLAYGAIN_TRACK_PEAK=0.81216431
    comment[9]: REPLAYGAIN_ALBUM_GAIN=-3.61 dB
    comment[10]: REPLAYGAIN_ALBUM_PEAK=0.81216431

$ mpc 
Duke Ellington - Dancers in Love
[playing] #90/213   0:04/1:55 (3%)
volume: 60%   repeat: on    random: on    single: off   consume: off

$ amixer -c MYDAC scontents
Simple mixer control 'MICROMEGA Clock Selector',0
  Capabilities: pvolume pswitch
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 127
  Mono:
  Front Left: Playback 76 [60%] [-51.00dB] [on]
  Front Right: Playback 76 [60%] [-51.00dB] [on]

这个外部DAC对音量的百分比和音量的解释似乎完全没用。不幸的是,我还有一个外部DAC,可以提供类似的" amixer scontents"命令,即它减少整个1dB的步长,它将百分比音量控制命令简单地映射到DAC的音量参数的百分比。我无法说出谁在这里有过错。我会争论DAC制造商。最终结果是外部DAC中的音量控制实际上是不可能的。

我没有找到任何外部DAC的报告,它会根据dB刻度正确地进行硬件音量控制。所以我猜软件混音器音量控制是唯一的选择,即使你这样松散的质量。我很乐意站起来纠正。