为 ALSA dapm 创建编解码器到编解码器的 dai 链接¶
通常,音频流总是从 CPU 到编解码器,因此您的系统将如下所示
--------- ---------
| | dai | |
CPU -------> codec
| | | |
--------- ---------
如果您的系统如下所示
---------
| |
codec-2
| |
---------
|
dai-2
|
---------- ---------
| | dai-1 | |
CPU -------> codec-1
| | | |
---------- ---------
|
dai-3
|
---------
| |
codec-3
| |
---------
假设编解码器-2 是一个蓝牙芯片,编解码器-3 连接到一个扬声器,并且您有以下场景:编解码器-2 将接收音频数据,并且用户希望通过编解码器-3 播放音频,而不涉及 CPU。上述情况是应该使用编解码器到编解码器连接的理想情况。
您的 dai_link 在您的机器文件中应该如下所示
/*
* this pcm stream only supports 24 bit, 2 channel and
* 48k sampling rate.
*/
static const struct snd_soc_pcm_stream dsp_codec_params = {
.formats = SNDRV_PCM_FMTBIT_S24_LE,
.rate_min = 48000,
.rate_max = 48000,
.channels_min = 2,
.channels_max = 2,
};
{
.name = "CPU-DSP",
.stream_name = "CPU-DSP",
.cpu_dai_name = "samsung-i2s.0",
.codec_name = "codec-2,
.codec_dai_name = "codec-2-dai_name",
.platform_name = "samsung-i2s.0",
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
| SND_SOC_DAIFMT_CBM_CFM,
.ignore_suspend = 1,
.c2c_params = &dsp_codec_params,
.num_c2c_params = 1,
},
{
.name = "DSP-CODEC",
.stream_name = "DSP-CODEC",
.cpu_dai_name = "wm0010-sdi2",
.codec_name = "codec-3,
.codec_dai_name = "codec-3-dai_name",
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
| SND_SOC_DAIFMT_CBM_CFM,
.ignore_suspend = 1,
.c2c_params = &dsp_codec_params,
.num_c2c_params = 1,
},
上面的代码片段来自 sound/soc/samsung/speyside.c。
请注意 “c2c_params” 回调,它让 dapm 知道这个 dai_link 是一个编解码器到编解码器的连接。
在 dapm 核心中,为播放路径创建 cpu_dai 播放小部件和 codec_dai 捕获小部件之间的路由,反之亦然对于捕获路径。 为了触发上述路由,DAPM 需要找到一个有效的端点,该端点可以是分别对应于播放和捕获路径的接收器或源小部件。
为了触发这个 dai_link 小部件,可以为扬声器放大器创建一个精简的编解码器驱动程序,如 wm8727.c 文件中所示,即使它不需要任何控制,它也会为设备设置适当的约束。
请确保您对应的 cpu 和编解码器播放和捕获 dai 名称分别以 “Playback” 和 “Capture” 结尾,因为 dapm 核心将根据名称链接并启用这些 dai。
当链接上的所有 DAI 都属于编解码器组件时,“simple-audio-card” 中的 dai_link 将自动被检测为编解码器到编解码器。dai_link 将使用链接上所有 DAI 支持的流参数(通道、格式、采样率)子集进行初始化。由于无法在设备树中提供这些参数,因此这主要用于与简单的固定功能编解码器(例如蓝牙控制器或蜂窝调制解调器)通信。