基于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