为ALSA dapm创建编解码器到编解码器dai链接
大多数音频流始终是从CPU到编解码器,因此您的系统将如下所示:
--------- --------- | | dai | | CPU -------> codec | | | | --------- ---------
如果您的系统如下所示:
--------- | | codec-2 | | --------- | dai-2 | ---------- --------- | | dai-1 | | CPU -------> codec-1 | | | | ---------- --------- | dai-3 | --------- | | codec-3 | | ---------
假设codec-2是一个蓝牙芯片,而codec-3连接到扬声器,你有一个下面的场景:codec-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, .params = &dsp_codec_params, }, { .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, .params = &dsp_codec_params, },
上面的代码片段来自sound / soc / samsung / speyside.c。
注意“params”回调,它让dapm知道这个dai_link是编解码器连接的编解码器。
在dapm核心中,在cpu_dai回放小部件和用于回放路径的codec_dai捕获小部件之间创建路由,反之亦然,对于捕获路径。为了使上述路由被触发,DAPM需要找到有效的端点,该端点可以是分别对应于回放和捕获路径的接收器或源小部件。
为了触发这个dai_link小部件,可以创建一个用于扬声器放大器的精简编解码器驱动程序,如wm8727.c文件中所示,它为设备设置了适当的约束,即使它不需要控制。
确保命名相应的cpu和编解码器播放,并分别捕获以“播放”和“捕获”结尾的dai名称,因为dapm核心将根据名称链接并为这些dais供电。
请注意,在当前设备树中,无法将dai_link标记为编解码器的编解码器。但是,将来可能会发生变化。