トイテック本社 2026-03-18 08:44 采纳率: 0%
浏览 4

AC696X BR25系列(Jieli) 如何使用 DACL/DACR 独立播放提示音

例如,在以下 app_common.c 代码中,我希望能够使用 DACL 播放 IDEX_TONE_NUM_1,使用 DACR 播放 IDEX_TONE_NUM_2。

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2026-03-18 08:45
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    AC696X BR25 系列(Jieli) 芯片中,使用 DACL/DACR 独立播放提示音是可行的。该系列芯片支持双通道 DAC 输出(DACL 和 DACR),可以分别用于左声道和右声道音频输出。

    要实现你的需求:使用 DACL 播放 IDEX_TONE_NUM_1,使用 DACR 播放 IDEX_TONE_NUM_2,你需要:

    1. 配置 DACL 和 DACR 为独立音频输出通道
    2. 将不同的音频数据分别发送到 DACL 和 DACR
    3. 确保音频数据格式与 DAC 配置匹配

    ✅ 一、准备工作

    • 确保你已经了解 Jieli 芯片的 DAC 驱动机制
    • 确认你有对应的音频数据文件(例如 .wav.pcm 格式)
    • 确认 IDEX_TONE_NUM_1IDEX_TONE_NUM_2 是两个不同的音频片段或提示音

    ✅ 二、代码实现步骤

    1. 初始化 DACL 和 DACR

    app_common.c 中,通常会有一个 audio_init() 函数,用于初始化音频系统。你可以在此函数中配置 DACL 和 DACR 为独立模式。

    void audio_init(void) {
        // 初始化 DACL 和 DACR
        dac_init(DAC_CHL);   // 初始化 DACL
        dac_init(DAC_CHR);   // 初始化 DACR
    
        // 设置 DACL 和 DACR 的采样率和格式
        dac_set_sample_rate(DAC_CHL, SAMPLE_RATE_48K);
        dac_set_sample_rate(DAC_CHR, SAMPLE_RATE_48K);
    
        dac_set_format(DAC_CHL, DAC_FORMAT_16BIT);
        dac_set_format(DAC_CHR, DAC_FORMAT_16BIT);
    
        // 启用 DACL 和 DACR
        dac_enable(DAC_CHL);
        dac_enable(DAC_CHR);
    }
    

    重点: 通过 DAC_CHLDAC_CHR 区分左右声道,确保它们是独立的 DAC 通道。


    2. 定义音频数据结构

    假设你有两个音频数据数组 tone1_data[]tone2_data[],分别对应 IDEX_TONE_NUM_1IDEX_TONE_NUM_2

    extern const short tone1_data[]; // IDEX_TONE_NUM_1
    extern const short tone2_data[]; // IDEX_TONE_NUM_2
    

    3. 创建独立的音频播放函数

    你可以创建两个函数,分别用于播放左右声道:

    void play_tone_left(const short *data, int length) {
        dac_start(DAC_CHL, data, length);
    }
    
    void play_tone_right(const short *data, int length) {
        dac_start(DAC_CHR, data, length);
    }
    

    重点: 使用 dac_start() 时传入不同的 DAC 通道(DAC_CHLDAC_CHR


    4. 调用播放函数

    在需要播放提示音的地方,调用这两个函数:

    // 播放 IDEX_TONE_NUM_1 到 DACL
    play_tone_left(tone1_data, sizeof(tone1_data) / sizeof(short));
    
    // 播放 IDEX_TONE_NUM_2 到 DACR
    play_tone_right(tone2_data, sizeof(tone2_data) / sizeof(short));
    

    ✅ 三、注意事项

    1. 音频数据格式一致性

      • 确保 tone1_datatone2_data16-bit PCM 格式,且采样率与 DAC 配置一致(如 48kHz)。
      • 如果是 .wav 文件,建议使用工具转换为 .pcm 格式,避免头信息干扰。
    2. DMA 缓冲区管理

      • 如果使用 DMA 方式播放音频,需确保缓冲区足够大,并正确设置回调函数。
    3. 多任务/线程安全

      • 如果应用运行在多任务环境中,请确保对 DAC 的访问是线程安全的。

    ✅ 四、完整示例代码(修改后的 app_common.c)

    #include "audio.h"
    
    // 假设这是从其他地方导入的音频数据
    extern const short tone1_data[];
    extern const short tone2_data[];
    
    // 定义播放函数
    void play_tone_left(const short *data, int length) {
        dac_start(DAC_CHL, data, length);
    }
    
    void play_tone_right(const short *data, int length) {
        dac_start(DAC_CHR, data, length);
    }
    
    // 初始化音频系统
    void audio_init(void) {
        dac_init(DAC_CHL);
        dac_init(DAC_CHR);
    
        dac_set_sample_rate(DAC_CHL, SAMPLE_RATE_48K);
        dac_set_sample_rate(DAC_CHR, SAMPLE_RATE_48K);
    
        dac_set_format(DAC_CHL, DAC_FORMAT_16BIT);
        dac_set_format(DAC_CHR, DAC_FORMAT_16BIT);
    
        dac_enable(DAC_CHL);
        dac_enable(DAC_CHR);
    }
    
    // 示例调用
    void play_tones(void) {
        play_tone_left(tone1_data, sizeof(tone1_data) / sizeof(short));
        play_tone_right(tone2_data, sizeof(tone2_data) / sizeof(short));
    }
    

    ✅ 五、总结

    • DACL 和 DACR 可以独立使用,只需区分 DAC 通道。
    • 音频数据必须与 DAC 配置一致(采样率、位深等)。
    • 推荐使用 dac_start() 函数 来分别启动左右声道播放。

    如果你能提供具体的音频数据或更详细的代码上下文,我可以进一步帮你优化或调试。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月18日
  • 创建了问题 3月18日