1.先要理解两个常量,一个是voccal.c中的常量voc_pcm_on_chip_0_gsm_cal,结构如下:
typedef struct {
voc_ec_type ec_mode; /* Echo Cancellation mode */
voc_ns_type ns_enable; /* Noise suppressor enable */
uint16 tx_gain; /* TX Voice Volume */
uint16 dtmf_tx_gain; /* TX DTMF gain */
uint16 codec_tx_gain; /* CODEC TX gain */
uint16 codec_rx_gain; /* CODEC RX gain */
uint16 codec_st_gain; /* CODEC ST gain */
qdsp_cmd_pcm_filter_type tx_filter; /* TX PCM filter coefficients*/
qdsp_cmd_pcm_filter_type rx_filter; /* RX PCM filter coefficients*/
sint15 rx_dbm_offset; /* RX offset in dBm */
qdsp_cmd_agc_param_type agc_param; /* AGC/AVC parameters */
……
……
}voc_pcm_path_cal_type;
根据注释,很容易找到Tx Codec Gain, Tx Volume, Rx Codec Gain, ST Codec Gain, Tx PCM Filter, Rx PCM Filter。这里找到的Gain和Volume增益计算公式为:Gain(dB) = 20*LOG(Value/16384)。
2.另一个是Sndcal.c中的snd_cal_handset_voice_vol。平台默认为四级音量,数组的第一竖列就是每级音量对应Rx Volume的大小。
VOL_MEMORY snd_gen_level_voc_type snd_cal_handset_voice_vol[] = {
{ VOC_VOL_SILENCE , VOC_VOL_SILENCE , 0 },
{ -1100 , -3400 , 0 },
{ -500 , -3300 , 0 },
{ 100 , -3200 , 0 },
{ 700 , -3100 , 0 }
};
Rx volume计算公式为:Value = 100* Gain(dB)。上例四级音量分别为-11,-5,1,7dB,最大音量7dB。需要说明的是每级音量至少间隔4dB,才能被人耳区分出来。
3. 对照音频的款图可以发现,以下参数可以调节:
Tx Volume ---------voccal.c
Tx Codec Gain ---------voccal.c
Rx Codec Gain ---------voccal.c
ST Codec Gain ---------voccal.c
Tx PCM Filter ---------voccal.c
Rx PCM Filter ---------voccal.c
Rx Volume(max) ---------snddcal.c