1. 程式人生 > >asoc之為ALSA dapm建立編解碼器到編解碼器dai連結

asoc之為ALSA dapm建立編解碼器到編解碼器dai連結

為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標記為編解碼器的編解碼器。但是,將來可能會發生變化。