为要通过 mpd 使用的 USB-DAC 配置音量控制

Posted

技术标签:

【中文标题】为要通过 mpd 使用的 USB-DAC 配置音量控制【英文标题】:Configuring volume control for USB-DAC to be used via mpd 【发布时间】:2014-04-12 13:14:53 【问题描述】:

我正在使用带有 Raspbian 的 Raspberry Pi 和 NuForce uDAC-3 USB-DAC 构建一个音乐播放器系统。

我使用 /etc/mpd.conf 中的这些行让 mpd 使用 DAC 而不是 Pi 的声音系统。据我所知,这里最重要的是选择硬件设备 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 中取消注释来控制音量:

mixer_type                      "software"

现在的主要问题是音量控制存在一些滞后,而集成音响系统则没有。我的意思是,当我在客户端程序 (QMPDClient) 中滑动音量控制时,在听到音量变化之前会有一个短暂但明显的延迟。这是可以忍受的,但让我怀疑一切是否真的按应有的方式运行。

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

我尝试了各种 /etc/asound.conf 示例,我在互联网上找到了这些示例,但要么我不明白它们应该做什么,要么它们根本不起作用。我想我会得到一个用于 mpd 识别的 DAC 的主音量控制,或者一个具有主音量控制并将声音馈送到 DAC 的虚拟声卡。最初,/etc/asound.conf 是空的,现在仍然是空的,现在似乎没有任何影响。

就其相关性而言,音乐位于从 CD 中翻录的 .flac 文件中。

【问题讨论】:

【参考方案1】:

snd-usb-audio 驱动程序确实支持外部 DAC 中的硬件音量控制。 问题是您的 DAC 是否支持它。 我正在使用设置为 USB 2.0 的 Micromega MYDAC,背面有一个小开关。 插入后,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 的界面,我们可以看到当我们将音量设置为 90% 时外部 DAC 实际做了什么。 由于其音量限制为 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。

当您想使用重放增益来自动控制音量时,这将变得更加灾难性。 mpd 使用我上面给出的 dB 比例。 我将我所有的 CD 都翻录到 flac 并添加了 replaygain 标签。 这些在不使用外部 DAC 的其他两个系统上运行良好(三星平板电脑上的 android 上的 Poweramp 和 openPandora 设备上的 Deadbeaf)。所有卷都很好地输出。

例如,当我将 mpd 与 MYDAC 一起使用时,会发生以下情况。 mpd 播放曲目重放增益为 -4.3 dB 的歌曲。 所以 mpd 指示接口从 20log 0.60 = -4.3 dB 开始达到 60%。 但是,界面并没有达到音量的 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 对音量百分比和 dB 音量的解释似乎完全没有用。不幸的是,我还有一个外部 DAC,它提供了“amixer scontents”命令的类似输出,即,它减少了整个 1dB 步长,并将百分比音量控制命令简单地映射到 DAC 音量参数的百分比。我不能说这里是谁的错。我会争论DAC制造商。最终结果是外部 DAC 中的音量控制实际上是不可能的。

我没有找到任何可以根据 dB 标度正确进行硬件音量控制的外部 DAC 的报告。所以我想软件混音器音量控制是唯一的选择,即使你这样会降低质量。不过,我很乐意纠正。

【讨论】:

非常有趣。从那时起,您是否找到任何支持硬件音量的外部 DAC?【参考方案2】:

要获得更低的延迟,请减少buffer_time setting:

audio_output 
    ...
    buffer_time 100000

【讨论】:

调整 buffer_time 就可以了。使用示例 100000 的值并没有改变任何声音,但将其减少到十分之一即 10000 有所帮助。这是合适的值吗?链接指向的文档说“除非您知道自己在做什么,否则不要更改。” 缓冲区的长度决定了卷更改的延迟。你不应该把它缩短到需要的时间以避免无用的中断。 好的。感谢您的建议!

以上是关于为要通过 mpd 使用的 USB-DAC 配置音量控制的主要内容,如果未能解决你的问题,请参考以下文章

带有 MPD 内核模块的 Firehol 规则

为 android 模拟 MPEG-DASH

如何解析 MPD 清单视频文件并获取图像适配集的片段?

MPD 挂载点未显示在 icecast 上

如何使用 .mpd 文件中的 dash shaka-player 添加多个字幕?

如何在不阻塞的情况下使用 mpd.idle() 从 GTK 轮询 MPD