Logo

Linux 内核

6.13.0-rc6

快速搜索

目录

  • 开发流程
  • 提交补丁
  • 行为准则
  • 维护者手册
  • 所有开发流程文档
  • 核心 API
  • 驱动程序 API
  • 子系统
    • 核心子系统
    • 人机接口
      • 输入文档
      • 人机接口设备 (HID)
      • 声音子系统文档
      • GPU 驱动程序开发指南
      • 帧缓冲
      • LED
    • 网络接口
    • 存储接口
    • 其他子系统
  • 锁定
  • 许可规则
  • 编写文档
  • 开发工具
  • 测试指南
  • 黑客指南
  • 跟踪
  • 故障注入
  • 实时修补
  • Rust
  • 管理
  • 构建系统
  • 报告问题
  • 用户空间工具
  • 用户空间 API
  • 固件
  • 固件和设备树
  • CPU 架构
  • 未分类的文档
  • 翻译

本页

  • 显示源代码

为 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 支持的流参数(通道、格式、采样率)子集进行初始化。由于无法在设备树中提供这些参数,因此这主要用于与简单的固定功能编解码器(例如蓝牙控制器或蜂窝调制解调器)通信。

©内核开发社区。| 由 Sphinx 5.3.0 & Alabaster 0.7.16 提供支持 | 页面源代码