為 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 將接收音訊資料,並且使用者希望透過 codec-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_CBP_CFP,
.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_CBP_CFP,
.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 需要找到一個有效的端點,該端點可以是分別對應於播放和捕獲路徑的 sink 或 source 小部件。
為了觸發此 dai_link 小部件,可以建立一個用於揚聲器放大器的精簡編解碼器驅動程式,如 wm8727.c 檔案中所示,即使它不需要控制,它也會為裝置設定適當的約束。
請確保命名您對應的 CPU 和編解碼器播放和捕獲 dai 名稱,分別以“Playback”和“Capture”結尾,因為 dapm 核心將根據名稱連結和供電這些 dai。
當連結上的所有 DAI 都屬於編解碼器元件時,“simple-audio-card”中的 dai_link 將自動被檢測為編解碼器到編解碼器。 dai_link 將使用連結上所有 DAI 支援的流引數(通道、格式、取樣率)的子集進行初始化。 由於無法在裝置樹中提供這些引數,因此這主要適用於與簡單的固定功能編解碼器(例如藍牙控制器或蜂窩調變解調器)的通訊。