asoc之為ALSA dapm建立編解碼器到編解碼器dai連結
阿新 • • 發佈:2018-12-18
為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標記為編解碼器的編解碼器。但是,將來可能會發生變化。