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 的报告。所以我想软件混音器音量控制是唯一的选择,即使你这样会降低质量。不过,我很想纠正。