C-Media 8338/8738/8768/8770 驱动简要说明

Takashi Iwai <tiwai@suse.de>

前/后多声道播放

CM8x38 芯片可以使用 ADC 作为第二个 DAC,以便两个不同的立体声道可用于前/后播放。由于有两个 DAC,因此与下面部分中的 4/6 声道多声道播放不同,这两个流是独立处理的。

默认情况下,ALSA 驱动程序将第一个 PCM 设备(即 card#0 的 hw:0,0)分配给前置和 4/6 声道播放,而第二个 PCM 设备 (hw:0,1) 分配给第二个 DAC 用于后置播放。

两个 DAC 之间存在细微差别

  • 第一个 DAC 支持 U8 和 S16LE 格式,而第二个 DAC 仅支持 S16LE。

  • 第二个 DAC 仅支持双声道立体声。

请注意,CM8x38 DAC 不支持连续播放速率,而仅支持固定速率:5512、8000、11025、16000、22050、32000、44100 和 48000 Hz。

只有在禁用“四声道模式”开关时才能听到后置输出。否则,没有信号会路由到后置扬声器。默认情况下,它是打开的。

警告

当“四声道模式”开关关闭时,后置扬声器的输出将为满音量,而与主音量和 PCM 音量无关 [1]。这可能会损坏您的音频设备。请在关闭此开关之前断开扬声器连接。

如果您的声卡具有用于后置输出的额外输出插孔,则默认情况下应将后置播放路由到那里。如果没有,驱动程序中有一个控制开关“线路输入作为后置”,您可以通过 alsamixer 或其他方式更改它。 当此开关打开时,线路输入插孔用作后置输出。

还有两个与后置输出相关的控件。“交换 DAC”开关用于交换前置和后置播放路由,即第二个 DAC 从前置输出输出。

4/6 多声道播放

最新的 CM8738 芯片支持 4/6 多声道播放功能。 这对于 AC3 解码特别有用。

当支持多声道时,驱动程序名称会带有一个后缀“-MC”,例如“CMI8738-MC6”。 您可以从 /proc/asound/cards 检查此名称。

启用 4/6 声道输出后,第二个 DAC 最多可接受 6 个(或 4 个)声道。 虽然双 DAC 支持两种不同的速率或格式,但 4/6 声道播放仅支持所有声道的相同条件。由于多声道播放模式使用两个 DAC,因此您无法以全双工方式运行。

4.0 和 5.1 模式在 alsa-lib 中定义为 pcm “surround40” 和 “surround51”。 例如,您可以播放带有 6 个声道的 WAV 文件,如下所示

% aplay -Dsurround51 sixchannels.wav

对于编程 4/6 声道播放,您需要根据需要指定 PCM 声道并设置格式 S16LE。 例如,对于播放 4 个声道,

snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED);
    // or mmap if you like
snd_pcm_hw_params_set_format(pcm, hw, SND_PCM_FORMAT_S16_LE);
snd_pcm_hw_params_set_channels(pcm, hw, 4);

并使用交错的 4 声道数据。

有一些控制开关会影响扬声器连接

线路输入模式

一个枚举控制来更改线路输入插孔的行为。 可以选择“线路输入”、“后置输出”或“低音输出”。 最后一个项目仅适用于 039 或更新的型号。 选择“后置输出”时,环绕声道 3 和 4 将输出到线路输入插孔。

麦克风输入模式

一个枚举控制来更改麦克风输入插孔的行为。 可以选择“麦克风输入”或“中央/LFE 输出”。 选择“中央/LFE 输出”时,中央声道和低音声道(声道 5 和 6)将输出到麦克风输入插孔。

数字 I/O

CM8x38 以非常便宜的价格提供了出色的 SPDIF 功能(是的,这就是我购买该声卡的原因:))

SPDIF 播放和捕获是通过第三个 PCM 设备 (hw:0,2) 完成的。 通常,这被分配给 PCM 设备“spdif”。 可用速率为 44100 和 48000 Hz。 对于使用 aplay 进行播放,您可以像下面这样运行

% aplay -Dhw:0,2 foo.wav

% aplay -Dspdif foo.wav

实验性地支持 24 位格式。

通过 SPDIF 进行播放和捕获分别使用普通的 DAC 和 ADC,因此您不能同时播放模拟和数字流。

要启用 SPDIF 输出,您需要通过混音器或 alsactl 打开“IEC958 输出开关”控制(“IEC958”是所谓的 S/PDIF 的官方名称)。 然后您会从卡上看到红灯亮起,因此您知道它正在工作 :) SPDIF 输入始终处于启用状态,因此您可以随时通过“IEC958 输入监视器”开关从线路输出听到 SPDIF 输入数据(请参见下文)。

您甚至可以使用第一个设备 (hw:0,0) 通过 SPDIF 进行播放,但是仅当使用正确的格式 (S16LE)、采样率 (441100 或 48000) 和声道 (2) 时,SPDIF 才会被启用。 否则它会关闭。 (也别忘了打开“IEC958 输出开关”。)

此外,还有相关的控制开关

IEC958 混合模拟

混合模拟 PCM 播放和 FM-OPL/3 流,并通过 SPDIF 输出。 此开关仅出现在旧的芯片型号(CM8738 033 和 037)上。

注意:没有此控件,您可以将 PCM 输出到 SPDIF。 这是流的“混合”,因此例如它不适用于 AC3 输出(请参见下一部分)。

IEC958 输入选择

选择 SPDIF 输入、内部 CD 输入(假)和外部输入(真)。

IEC958 环路

SPDIF 输入数据循环回 SPDIF 输出(又名旁路)

IEC958 版权

设置版权位。

IEC958 5V

选择 0.5V(同轴)或 5V(光纤)接口。 在某些声卡上,这不起作用,您需要使用硬件拨动开关更改配置。

IEC958 输入监视器

SPDIF 输入被路由到 DAC。

IEC958 输入相位反转

将 SPDIF 输入格式设置为反转。 [FIXME:这并非在所有芯片上都有效..]

IEC958 输入有效

设置输入有效性标志检测。

注意:当“PCM 播放开关”打开时,您将通过模拟线路输出听到数字输出流。

AC3(原始数字)输出

该驱动程序支持通过 SPDIF 进行原始数字(通常为 AC3)I/O。 这可以通过 IEC958 播放控制来切换,但是通常您需要通过 alsa-lib 访问它。 有关更多详细信息,请参见 alsa-lib 文档。

在原始数字模式下,“PCM 播放开关”会自动关闭,以便从模拟线路输出听到非音频数据。 类似地,以下开关关闭:“IEC958 混合模拟”和“IEC958 环路”。 关闭 SPDIF PCM 设备后,这些开关会自动恢复到以前的状态。

在 033 型号上,AC3 是通过 alsa-lib 中的软件转换实现的。 如果您需要绕过 IEC958 子帧的软件转换,请传递“soft_ac3=0”模块选项。 这在较新的型号上无关紧要。

模拟混音器接口

CM8x38 上的混音器界面与 SB16 类似。 有主音量、PCM、合成器、CD、线路、麦克风和 PC 扬声器播放音量。 合成器、CD、线路和麦克风也具有播放和捕获开关,以及 SB16。

除了标准的 SB 混音器之外,CM8x38 还提供了更多功能。 - PCM 播放开关 - PCM 捕获开关(用于捕获发送到 DAC 的数据) - 麦克风增强开关 - 麦克风捕获音量 - 辅助播放音量/开关和捕获开关 - 3D 控制开关

MIDI 控制器

对于 CMI8338 芯片,MPU401-UART 接口默认情况下已禁用。 您需要将模块选项“mpu_port”设置为有效的 I/O 端口地址才能启用 MIDI 支持。 有效的 I/O 端口为 0x300、0x310、0x320 和 0x330。 选择一个不与其他卡冲突的值。

对于 CMI8738 和更新的芯片,默认情况下会启用 MIDI 接口,并且驱动程序会自动选择一个端口地址。

此芯片上没有硬件波表功能(除了下面的 OPL3 合成器)。 Windows 上所说的 MIDI 合成器是软件合成器仿真。 在 Linux 上使用 TiMidity 或其他软合成器程序来播放 MIDI 音乐。

FM OPL/3 合成器

默认情况下,仅对于第一张卡也启用 FM OPL/3。 为更多卡设置“fm_port”模块选项。

但是,FM OPL/3 的输出质量非常奇怪。 我不知道为什么..

CMI8768 和更新的芯片没有 FM 合成器。

操纵杆和调制解调器

支持传统的操纵杆。 要启用操纵杆支持,请传递 joystick_port=1 模块选项。 值 1 表示自动检测。 如果自动检测失败,请尝试传递确切的 I/O 地址。

调制解调器通过卡控制开关“调制解调器”动态启用。

调试信息

寄存器显示在 /proc/asound/cardX/cmipci 中。 如果您有任何问题(尤其是混音器的意外行为),请将此 proc 文件的输出以及错误报告一起附加。