• QCC TX 音频输入切换+提示声音


    QCC TX 音频输入切换+提示声音
    QCC蓝牙芯片(QCC3040 QCC3056 等等),AUX、I2S、USB输入

    蓝牙音频输入,模拟输出是最常见的方式。
    也可以再此基础上动态切换输入方式。
    在这里插入图片描述
    针对TX切换EQ,调节音量不能出提示声音问题,可以增加本地提示声音然后混合(mix)到a2dp audio,然后在BT(sink)端出提示声音。

    提示声音播放接口如下
    void appKymeraHandleInternalTonePromptPlay(const KYMERA_INTERNAL_TONE_PROMPT_PLAY_T *msg)
    {
    kymeraTaskData *theKymera = KymeraGetTaskData();
    output_source_t output = {0};
    int16 volume_db = (msg->tone != NULL) ? KYMERA_CONFIG_TONE_VOLUME : KYMERA_CONFIG_PROMPT_VOLUME;

    DEBUG_LOG("appKymeraHandleInternalTonePromptPlay, prompt %x, tone %p, ttp %d, int %u, lock 0x%x, mask 0x%x",
                msg->prompt, msg->tone, msg->time_to_play, msg->interruptible, msg->client_lock, msg->client_lock_mask);
    
    kymera_SendStartInd(msg);
    
    /* If there is a tone still playing at this point, it must be an interruptable tone, so cut it off */
    if(appKymeraIsPlayingPrompt() || (!kymera_IsTheCorrectTonePromptChainReady(msg) && kymera_TonePromptIsReady()))
    {
        appKymeraTonePromptStop();
    }
    
    kymera_PrepareOutputChain(msg->rate);
    KymeraOutput_ChainStart();
    output.aux = kymera_PrepareInputChain(msg);
    PanicFalse(Kymera_OutputConnect(output_user_prompt, &output));
    KymeraOutput_SetAuxVolume(volume_db);
    
    if (KymeraOutput_SetAuxTtp(msg->time_to_play))
    {
        rtime_t now = SystemClockGetTimerTime();
        rtime_t delta = rtime_sub(msg->time_to_play, now);
        DEBUG_LOG("appKymeraHandleInternalTonePromptPlay now=%u, ttp=%u, left=%d", now, msg->time_to_play, delta);
        uint16 delta_in_ms = (uint16)(delta/1000);
        TimestampEvent_Offset(TIMESTAMP_EVENT_PROMPT_PLAY, delta_in_ms);
    }
    
    /* Start tone */
    if (theKymera->chain_tone_handle)
    {
        ChainStart(theKymera->chain_tone_handle);
    }
    
    kymera_tone_state = kymera_tone_playing;
    /* May need to exit low power mode to play tone simultaneously */
    appKymeraConfigureDspPowerMode();
    
    if (!msg->interruptible)
    {
        appKymeraSetToneLock(theKymera);
    }
    theKymera->tone_client_lock = msg->client_lock;
    theKymera->tone_client_lock_mask = msg->client_lock_mask;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    }

  • 相关阅读:
    java实现贪心算法代码示例
    EasyAVFilter代码示例之将视频点播文件转码成HLS(m3u8+ts)视频点播格式
    区块链技术:解密去中心化的革命
    ECC加密算法的数学原理
    Could not resolve placeholder ‘jdbc.driver‘ in string value “${jdbc.driver}“
    使用 TiUP 升级 TiDB
    温故而知新七(C++)
    Rocky Linux 运维工具yum
    “华为杯”研究生数学建模竞赛2019年-【华为杯】F题:智能飞行器航迹规划模型(附优秀论文及Pyhton代码实现)
    golang中的字符串
  • 原文地址:https://blog.csdn.net/TengTaiTech/article/details/134195017