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

Takashi Iwai <tiwai@suse.de>

前/后多声道播放

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

默认情况下,ALSA 驱动程序将第一个 PCM 设备(即卡 #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 将输出到线路输入插孔。

麦克风输入模式

一个枚举控件,用于更改麦克风输入插孔的行为。可以选择“麦克风输入”或“中置/低频输出”。选择“中置/低频输出”时,中置和低音声道(声道 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 输入始终启用,因此您可以随时从线路输出听到 SPDIF 输入数据,并使用“IEC958 输入监视器”开关(请参见下文)。

您甚至可以使用第一个设备 (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 地址。

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

调试信息

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