基于最新1102的308X LDAC

基于1102开发:
1:长按6秒松开 开机;
2:解决三星等手机回连不是LDAC问题;
3:LDAC播放播提示音会死机,此版本未加解决方法

/*!
\copyright  Copyright (c) 2017 - 2022 Qualcomm Technologies International, Ltd.
            All Rights Reserved.
            Qualcomm Technologies International, Ltd. Confidential and Proprietary.
\version    
\file       kymera_sco.c
\brief      Kymera SCO
*/
 
#include "kymera_sco_private.h"
#include "kymera_state.h"
#include "kymera_config.h"
#include "kymera_dsp_clock.h"
#include "kymera_tones_prompts.h"
#include "kymera_aec.h"
#include "kymera_leakthrough.h"
#include "kymera_output.h"
#include "av.h"
#include "kymera_mic_if.h"
#include "kymera_output_if.h"
#include "kymera_data.h"
#include "kymera_setup.h"
#include "kymera_anc_common.h"
#ifdef INCLUDE_CVC_DEMO
#include "cap_id_prim.h"
#endif
#include <vmal.h>
#include <anc_state_manager.h>
#include <timestamp_event.h>
#include <opmsg_prim.h>
 
#define AWBSDEC_SET_BITPOOL_VALUE    0x0003
#define AWBSENC_SET_BITPOOL_VALUE    0x0001
 
#ifdef ENABLE_ADAPTIVE_ANC
#define AEC_TX_BUFFER_SIZE_MS 45
#else
#define AEC_TX_BUFFER_SIZE_MS 15
#endif
 
typedef struct set_bitpool_msg_s
{
 
    uint16 id;
    uint16 bitpool;
}set_bitpool_msg_t;
 
#ifdef INCLUDE_CVC_DEMO
typedef struct
{
 
    uint8 mic_config;
    kymera_cvc_mode_t mode;
    uint8 passthrough_mic;
    uint8 mode_of_operation;
 
} cvc_send_settings_t;
 
static cvc_send_settings_t cvc_send_settings = {0};
 
static void kymera_ScoSetCvc3MicSettings(void);
#endif /* INCLUDE_CVC_DEMO */
 
static kymera_chain_handle_t the_sco_chain;
static enum
{
 
    kymera_sco_idle,
    kymera_sco_prepared,
    kymera_sco_starting,
    kymera_sco_started,
} kymera_sco_state = kymera_sco_idle;
 
static bool kymera_ScoMicGetConnectionParameters(uint16 *mic_ids, Sink *mic_sinks, uint8 *num_of_mics, uint32 *sample_rate, Sink *aec_ref_sink);
static bool kymera_ScoMicDisconnectIndication(const mic_change_info_t *info);
 
static const mic_callbacks_t kymera_MicScoCallbacks =
{
 
    .MicGetConnectionParameters = kymera_ScoMicGetConnectionParameters,
    .MicDisconnectIndication = kymera_ScoMicDisconnectIndication,
};
 
static const mic_user_state_t kymera_ScoMicState =
{
 
    mic_user_state_non_interruptible,
};
static const bool kymera_ScoUseAecRef = TRUE;
 
static const mic_registry_per_user_t kymera_MicScoRegistry =
{
 
    .user = mic_user_sco,
    .callbacks = &kymera_MicScoCallbacks,
    .mandatory_mic_ids = NULL,
    .num_of_mandatory_mics = 0,
    .mic_user_state = &kymera_ScoMicState,
    .use_aec_ref = &kymera_ScoUseAecRef,
};
 
static const output_registry_entry_t output_info =
{
 
    .user = output_user_sco,
    .connection = output_connection_mono,
};
 
static void kymera_DestroyScoChain(void)
{
 
    ChainDestroy(the_sco_chain);
    the_sco_chain = NULL;
 
    /* Update state variables */
    appKymeraSetState(KYMERA_STATE_IDLE);
    kymera_sco_state = kymera_sco_idle;
 
    Kymera_LeakthroughResumeChainIfSuspended();
}
 
static kymera_chain_handle_t kymera_GetScoChain(void)
{
 
    return the_sco_chain;
}
 
static void kymera_ConfigureScoChain(uint16 wesco)
{
 
    kymera_chain_handle_t sco_chain = kymera_GetScoChain();
    kymeraTaskData *theKymera = KymeraGetTaskData();
    PanicNull((void *)theKymera->sco_info);
 
    const uint32_t rate = theKymera->sco_info->rate;
 
    /*! \todo Need to decide ahead of time if we need any latency.
        Simple enough to do if we are legacy or not. Less clear if
        legacy but no peer connection */
    /* Enable Time To Play if supported */
    if (appConfigScoChainTTP(wesco) != 0)
    {
 
        Operator sco_op = PanicZero(ChainGetOperatorByRole(sco_chain, OPR_SCO_RECEIVE));
        OperatorsStandardSetTimeToPlayLatency(sco_op, appConfigScoChainTTP(wesco));
        OperatorsStandardSetBufferSize(sco_op, appConfigScoBufferSize(rate));
    }
 
    Kymera_SetVoiceUcids(sco_chain);
 
#ifdef INCLUDE_LIS25BA_ACCELEROMETER
    Operator basic_pass_op = PanicZero(ChainGetOperatorByRole(sco_chain, OPR_PCM_MIC_GAIN));
    OperatorsSetPassthroughDataFormat(basic_pass_op, operator_data_format_pcm);
#endif
 
    if(theKymera->chain_config_callbacks && theKymera->chain_config_callbacks->ConfigureScoInputChain)
    {
 
        kymera_sco_config_params_t params = {0};
        params.sample_rate = theKymera->sco_info->rate;
        params.mode = theKymera->sco_info->mode;
        params.wesco = wesco;
        theKymera->chain_config_callbacks->Configur
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值