📄 aud_audio.c
字号:
aud_context_p->audio_param.selected_FIR_output_index = req_p->audio_param.selected_FIR_output_index;
kal_mem_cpy(
aud_context_p->audio_param.speech_common_para,
req_p->audio_param.speech_common_para,
(sizeof(kal_uint16) * 12));
kal_mem_cpy(
aud_context_p->audio_param.speech_mode_para,
req_p->audio_param.speech_mode_para,
(sizeof(kal_uint16) * 64));
aud_context_p->audio_param.max_swing = req_p->audio_param.max_swing;
L1SP_LoadCommonSpeechPara(aud_context_p->audio_param.speech_common_para);
/* set audio path and volume */
aud_set_aud_path_volume(aud_context_p->audio_mode);
/* set max swing for sw synthesizer */
aud_melody_set_max_swing(aud_context_p->audio_param.max_swing);
/* write to NVRAM */
param_p = &req_p->audio_param;
data_p = param_data;
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_input_coeff[0], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_output_coeff[0], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_output_coeff[1], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_output_coeff[2], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_output_coeff[3], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_output_coeff[4], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_output_coeff[5], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_input_coeff[1], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, aud_context_p->audio_param.FIR_output_coeff[6], (sizeof(kal_uint16) * 30));
data_p += (sizeof(kal_uint16) * 30);
kal_mem_cpy(data_p, &(aud_context_p->audio_param.selected_FIR_output_index), (sizeof(kal_uint16) * 1));
data_p += (sizeof(kal_uint16) * 1);
kal_mem_cpy(data_p, aud_context_p->audio_param.speech_common_para, (sizeof(kal_uint16) * 12));
data_p += (sizeof(kal_uint16) * 12);
kal_mem_cpy(data_p, aud_context_p->audio_param.speech_mode_para, (sizeof(kal_uint16) * 64));
data_p += (sizeof(kal_uint16) * 64);
kal_mem_cpy(data_p, &(aud_context_p->audio_param.max_swing), (sizeof(kal_uint16) * 1));
data_p += (sizeof(kal_uint16) * 1);
kal_mem_cpy(data_p, aud_context_p->audio_param.Speech_FIR_Input_Coeff_16k_Tbl1, (sizeof(kal_int16) * 62));
data_p += sizeof(kal_int16) * 62;
kal_mem_cpy(data_p, aud_context_p->audio_param.Speech_FIR_Output_Coeff_16k_Tbl1, (sizeof(kal_int16) * 62));
data_p += sizeof(kal_int16) * 62;
kal_mem_cpy(data_p, aud_context_p->audio_param.Speech_FIR_Input_Coeff_16k_Tbl2, (sizeof(kal_int16) * 62));
data_p += sizeof(kal_int16) * 62;
kal_mem_cpy(data_p, aud_context_p->audio_param.Speech_FIR_Output_Coeff_16k_Tbl2, (sizeof(kal_int16) * 62));
data_p += sizeof(kal_int16) * 62;
kal_mem_cpy(data_p, aud_context_p->audio_param.Melody_FIR_Output_Coeff_32k_Tbl1, (sizeof(kal_int16) * 45));
data_p += sizeof(kal_int16) * 45;
kal_mem_cpy(data_p, aud_context_p->audio_param.Melody_FIR_Output_Coeff_32k_Tbl2, (sizeof(kal_int16) * 45));
data_p += sizeof(kal_int16) * 45;
if (med_context_p->nvram_state == MED_POWERON_READING_NVRAM_FINISH)
{
aud_send_msg_to_nvram(MSG_ID_NVRAM_WRITE_REQ, NVRAM_EF_AUDIO_PARAM_LID, param_data, sizeof(param_data));
}
else
{
aud_send_set_audio_param_cnf(MED_RES_FAIL);
}
}
}
/*****************************************************************************
* FUNCTION
* aud_get_volume_gain
* DESCRIPTION
*
* PARAMETERS
* mode [IN]
* type [IN]
* level [IN]
* RETURNS
*
*****************************************************************************/
kal_uint8 aud_get_volume_gain(kal_uint8 mode, kal_uint8 type, kal_uint8 level)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
#if defined(TV_OUT_SUPPORT)
if (type == AUD_VOLUME_TVO)
{
if (level >= MAX_VOL_LEVEL)
{
return 0;
}
else
{
return aud_context_p->acoustic_data.tv_out_volume_gain[level];
}
}
#endif /* TV_OUT_SUPPORT */
if ((mode >= MAX_VOL_CATE) || (type >= MAX_VOL_TYPE) || (level >= MAX_VOL_LEVEL))
{
return 0;
}
return aud_context_p->acoustic_data.volume_gain[mode][type][level];
}
/*****************************************************************************
* FUNCTION
* aud_get_volume_level
* DESCRIPTION
*
* PARAMETERS
* mode [IN]
* type [IN]
* RETURNS
*
*****************************************************************************/
kal_uint8 aud_get_volume_level(kal_uint8 mode, kal_uint8 type)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if ((mode >= MAX_VOL_CATE) || (type >= MAX_VOL_TYPE))
{
return 0;
}
return aud_context_p->acoustic_data.volume[mode][type];
}
/*****************************************************************************
* FUNCTION
* aud_set_melody_volume
* DESCRIPTION
*
* PARAMETERS
* mode [IN]
* level [IN]
* RETURNS
* void
*****************************************************************************/
void aud_set_melody_volume(kal_uint8 mode, kal_uint8 level)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint8 analog_gain;
kal_int8 digital_gain;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (!(level & 0x80))
{
digital_gain = 0;
#if defined(TV_OUT_SUPPORT)
if (mode == VOL_TV_OUT)
{
analog_gain = aud_get_volume_gain(mode, AUD_VOLUME_TVO, level);
}
else
#endif /* TV_OUT_SUPPORT */
{
analog_gain = aud_get_volume_gain(mode, AUD_VOLUME_MEDIA, level);
}
aud_melody_set_output_volume(analog_gain, digital_gain); // Adam add
}
else
{
#ifdef __MED_BT_A2DP_MOD__
#if defined(__BTMTK__)
if (aud_bt_a2dp_is_mute_phone())
{
return;
}
#elif defined(__BTVCSR_HCI_BCHS__)
if (aud_bt_a2dp_is_media_output_on())
{
return;
}
#endif
#endif /* __MED_BT_A2DP_MOD__ */
#ifdef __16_LEVEL_AUDIO_VOLUME__
level &= 0x0F;
Media_SetLevelVolume( aud_context_p->acoustic_data.max_melody_volume_gain[mode],
aud_context_p->acoustic_data.melody_volume_gain_step[mode],
15 - level);
#else
ASSERT(0);
#endif /* __16_LEVEL_AUDIO_VOLUME__ */
}
}
/*****************************************************************************
* FUNCTION
* aud_set_aud_path_volume
* DESCRIPTION
*
* PARAMETERS
* audio_mode [IN]
* RETURNS
* void
*****************************************************************************/
void aud_set_aud_path_volume(kal_uint8 audio_mode)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
audio_param_struct *param_p;
kal_uint8 volume;
kal_uint8 gain_audio_mode;
/* To slove mute flag cleared by speech off */
kal_bool mute;
kal_uint8 speech_mode;
kal_uint8 speech_volume_level;
#ifdef __MED_CTM_MOD__
kal_bool tty_on;
#endif
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
param_p = &aud_context_p->audio_param;
/* for all audio mode */
Media_SetFilter(MEDIA_FIR_SPEECH_OUTPUT1_16K, 62, param_p->Speech_FIR_Output_Coeff_16k_Tbl1);
Media_SetFilter(MEDIA_FIR_SPEECH_INPUT1_16K, 62, param_p->Speech_FIR_Input_Coeff_16k_Tbl1);
Media_SetFilter(MEDIA_FIR_SPEECH_OUTPUT2_16K, 62, param_p->Speech_FIR_Output_Coeff_16k_Tbl2);
Media_SetFilter(MEDIA_FIR_SPEECH_INPUT2_16K, 62, param_p->Speech_FIR_Input_Coeff_16k_Tbl2);
Media_SetFilter(MEDIA_FIR_MELODY_OUTPUT1_32K, 45, param_p->Melody_FIR_Output_Coeff_32k_Tbl1);
Media_SetFilter(MEDIA_FIR_MELODY_OUTPUT2_32K, 45, param_p->Melody_FIR_Output_Coeff_32k_Tbl2);
#ifdef __MED_BT_HFP_MOD__
if (aud_bt_hfp_is_audio_path_on())
{
speech_mode = SPH_MODE_BT_EARPHONE;
}
else
#endif /* __MED_BT_HFP_MOD__ */
speech_mode = audio_mode;
speech_volume_level = aud_get_volume_level(audio_mode, AUD_VOLUME_SPH);
#ifdef __MED_CTM_MOD__
tty_on = aud_ctm_set_speech_vol_and_path(audio_mode);
#endif
switch (audio_mode)
{
/*----------------------- Normal Mode -------------------------*/
case AUD_MODE_NORMAL:
{
/* Set output device */
#ifndef __MED_CTM_MOD__
aud_speech_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER));
#endif
aud_keytone_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER));
aud_tone_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER));
#ifdef __MED_BT_A2DP_MOD__
#if defined(__BTMTK__)
if (!aud_bt_a2dp_is_mute_phone())
#elif defined(__BTVCSR_HCI_BCHS__)
if (!aud_bt_a2dp_is_media_output_on())
#endif
#endif
{
#if defined(TV_OUT_SUPPORT)
if (audio_tv_cable_in)
{
if(audio_tv_loud_speaker) /* Set output path to both TV out and mobile device */
{
aud_melody_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER_BOTH));
}
else /* Set output path to earphone to let it play through TV only. */
{
aud_melody_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER2));
}
}
else
#endif /* TV_OUT_SUPPORT */
{
aud_melody_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_LOUDSPEAKER));
}
}
#if defined(TV_OUT_SUPPORT)
if (audio_tv_cable_in)
{
if(audio_tv_loud_speaker) /* Set output path to both TV out and mobile device */
{
aud_fmr_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER_BOTH));
}
else /* Set output path to earphone to let it play through TV only. */
{
aud_fmr_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER2));
}
}
else
#endif /* TV_OUT_SUPPORT */
{
aud_fmr_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_LOUDSPEAKER));
}
#ifdef __MED_SND_MOD__
#if defined(TV_OUT_SUPPORT)
if (audio_tv_cable_in)
{
if(audio_tv_loud_speaker) /* Set output path to both TV out and mobile device */
{
aud_snd_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER_BOTH));
}
else /* Set output path to earphone to let it play through TV only. */
{
aud_snd_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_SPEAKER2));
}
}
else
#endif /* TV_OUT_SUPPORT */
{
aud_snd_set_output_device(custom_cfg_hw_aud_output_path(AUDIO_DEVICE_LOUDSPEAKER));
}
#endif /* __MED_SND_MOD__ */
/* For FM record, not use default input device during record phase, so don't apply input path right away */
if ((AUD_IN_STATE(AUD_MEDIA_RECORD) || AUD_IN_STATE(AUD_MEDIA_RECORD_PAUSED))
&& !aud_context_p->use_default_input)
{
aud_mic_set_device_no_apply(custom_cfg_hw_aud_input_path(AUDIO_DEVICE_MIC1));
}
else
{
#ifndef __MED_CTM_MOD__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -