Logo

Linux 内核

6.16.0-rc4

快速搜索

目录

  • 开发流程
  • 提交补丁
  • 行为准则
  • 维护者手册
  • 所有开发流程文档
  • 核心 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
                    |         |
                     ---------

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

©内核开发社区。 | 由 Sphinx 5.3.0 & Alabaster 0.7.16 驱动 | 页面来源