MT6580 android6.0平台上的喇叭听筒二合一的实现
参考文档:https://onlinesso.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ14283
当前V118上使用的喇叭听筒二合一接法是:听筒的声音从PMU MT6350的AU_HPR输出到外置功放,再由外置功放输出HSP_OUT和HSN_OUT,最后输出到喇叭听筒二合一器件上,如图(1)、图(2)、图(3)
图(1)
图(2)
图(3)
软件实现:
(一) 通路的切换
80_c_m\update\alps\vendor\mediatek\proprietary\hardware\audio\mt6580\aud_drv\AudioALSAHardwareResourceManager.cpp
status_t AudioALSAHardwareResourceManager::OpenReceiverPath(const uint32_t SampleRate)
{
#ifdef ENABLE_XMLCONFIG
if (IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER))
{
mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_2IN1_SPEAKER);
}
else
{
#ifndef KST_AUDIO_SUPPORT_2IN1_SPEAKER
mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_RECEIVER);
#else
mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_HEADPHONE); //声音从耳机通路输出
mDeviceConfigManager->ApplyDeviceTurnonSequenceByName(AUDIO_DEVICE_EXT_SPEAKER); //打开外置功放使能
#endif
}
#else
AudioALSACodecDeviceOutReceiverPMIC::getInstance()->open();
#endif
return NO_ERROR;
}
status_t AudioALSAHardwareResourceManager::CloseReceiverPath()
{
ALOGD("%s(), AUDIO_DEVICE_OUT_EARPIECE", __FUNCTION__);
#ifdef ENABLE_XMLCONFIG
if (IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER))
{
mDeviceConfigManager->ApplyDeviceTurnoffSequenceByName(AUDIO_DEVICE_2IN1_SPEAKER);
}
else
{
#ifndef KST_AUDIO_SUPPORT_2IN1_SPEAKER
mDeviceConfigManager->ApplyDeviceTurnoffSequenceByName(AUDIO_DEVICE_RECEIVER);
#else
mDeviceConfigManager->ApplyDeviceTurnoffSequenceByName(AUDIO_DEVICE_EXT_SPEAKER); //声音从耳机通路输出
mDeviceConfigManager->ApplyDeviceTurnoffSequenceByName(AUDIO_DEVICE_HEADPHONE); //打开外置功放使能
#endif
}
#else
AudioALSACodecDeviceOutReceiverPMIC::getInstance()->close();
#endif
return NO_ERROR;
}
(二) 声音的调节
(1)把听筒的参数值调低,把喇叭的参数值调高
80_c_m\update\alps\kst\drv\audio_para\v118_p3_audio_para\audio_ver1_volume_custom_default.h
--- a/update/alps/kst/drv/audio_para/v118_p3_audio_para/audio_ver1_volume_custom_default.h
+++ b/update/alps/kst/drv/audio_para/v118_p3_audio_para/audio_ver1_volume_custom_default.h
@@ -129,10 +129,10 @@
32,48,64,80,96,112,128,144,160,176,192,208,224,255,255
#define VER1_AUD_VOLUME_SPH \
- 40,60,80,100,120,130,148,0,0,0,0,0,0,0,0,\
- 40,52,64,76,88,100,112,0,0,0,0,0,0,0,0,\
- 48,60,72,84,96,108,120,0,0,0,0,0,0,0,0,\
- 40,52,64,76,88,100,112,0,0,0,0,0,0,0,0
+ 10,15,20,25,30,35,40,0,0,0,0,0,0,0,0,\
+ 10,15,20,25,30,35,40,0,0,0,0,0,0,0,0,\
+ 100,110,120,130,140,150,160,0,0,0,0,0,0,0,0,\
+ 10,15,20,25,30,35,40,0,0,0,0,0,0,0,0
(2)把SetReceiverGain改为SetHeadPhoneRGain,设置听筒的改为设置HeadPhoneR的,否则听筒的声音会时大时小
80_c_m\update\alps\vendor\mediatek\proprietary\hardware\audio\mt6580\aud_drv\AudioALSAVolumeController.cpp
status_t AudioALSAVolumeController::ApplyVoiceGain(int degradeDb, audio_mode_t mode, uint32_t device)
{
……
if (device & AUDIO_DEVICE_OUT_EARPIECE)
{
ALOGD("DigitalgradeDb = %d Enh1degradeDb = %d VoiceAnalogRange = %d ", DigitalgradeDb, Enh1degradeDb, VoiceAnalogRange);
if (IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER))
{
ApplyMdDlGain(DigitalgradeDb);
ApplyMdDlEhn1Gain(Enh1degradeDb);
SetReceiverGain(VoiceAnalogRange);
}
else
{
ApplyMdDlGain(DigitalgradeDb);
ApplyMdDlEhn1Gain(Enh1degradeDb);
#ifndef KST_AUDIO_SUPPORT_2IN1_SPEAKER
SetReceiverGain(VoiceAnalogRange);
#else
SetHeadPhoneRGain(VoiceAnalogRange);
SetHeadPhoneLGain(VoiceAnalogRange);
#endif
}
if (AudioALSASpeechPhoneCallController::getInstance()->checkTtyNeedOn() == false)
{
ApplyMicGain(Normal_Mic, mode); // set incall mic gain
}
}
……
}
int AudioALSAVolumeController::ApplyAudioGainTuning(int Gain, uint32_t mode, uint32_t device)
{
……
switch (device)
{
case Audio_Earpiece:
{
if (VoiceAnalogRange >= (_countof(DL_PGA_Handset_GAIN) - 1))
{
VoiceAnalogRange = _countof(DL_PGA_Handset_GAIN) - 1;
}
if (IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER))
{
SetReceiverGain(VoiceAnalogRange);
}
else
{
#ifndef KST_AUDIO_SUPPORT_2IN1_SPEAKER
SetReceiverGain(VoiceAnalogRange);
#else
SetHeadPhoneRGain(VoiceAnalogRange);
SetHeadPhoneLGain(VoiceAnalogRange);
#endif
}
break;
}
……
}
备注:如果听筒的声音从PMU MT6350的内置功放的AU_SPKP和AU_SPKN输出到HSP_OUT和HSN_OUT,最后输出到喇叭听筒二合一器件上的,也可以参考以上方法更改通路来实现。