MT6250基线关机有pop音,之前MT6250D有出现过,解决方法是将afe_def.h文件的__AFE_PA_DELAY_OFF__定义为1,能够解决。而MT6250按此方法处理后,能将pop音消除,但录音机录音后,立刻播放会死机。
[Solution]
分析过程:因为是播放声音的末尾有pop音,采用提前关PA的方法,这个方法在较多平台经常使用,如MT6236,MT6253,MT6252等。
AFE_TurnOffSpeaker函数修改如下:
void AFE_TurnOffSpeaker( kal_uint8 aud_func )
{
kal_uint32 savedMask;
stack_print("AFE_TurnOffSpeaker v1-afe_common.c line 2872-2");
savedMask = SaveAndSetIRQMask(); /* Disable interrupt to prevent race
condition */
afe.sp_flag &= ~(1<<aud_func);
RestoreIRQMask(savedMask);
if( !afe.gpio_lock && (afe.aud[aud_func].out_dev & L1SP_BUFFER_EXT)) {
AFE_SwitchExtAmplifier( false );
kal_sleep_task(1);
afe.ext_op_on = KAL_FALSE;
}
AFE_SetRefresh();
L1Audio_Msg_AFE_TurnSpk( L1AUDIO_Str_onoff(0), L1AUDIO_Func_Name(aud_func)
);
}
但经试验会出现通话时,对方听不到我们手机的声音,或者对方说话,我们听不到了,免提可以听到.
考虑到若是再去分析通话的问题,会比较发散。于是从__AFE_PA_DELAY_OFF__定义为1,引发死机问题着手。仍将__AFE_PA_DELAY_OFF__定义为1,但录音机录音后,立刻播放会死机,抓memory dump分析。
AFE_Stop_and_Wait_DelayOff中kal_sleep_task,MMI (等待事件<aud_even:0x1>,一直等不到,导致MMI的外部消息队列满。
作如下修改后,问题解决。http://bbs.16rd.com/thread-476848-1-1.html
void AFE_Stop_and_Wait_DelayOff(kal_uint8 aud_func, kal_uint32 asp_fs)
{
#if __AFE_AudVoice_SingleClkSrc__
#if defined(MT6250)
kal_uint32 savedMask;
kal_bool stop_and_wait = KAL_FALSE;
kal_bool in_delayoff = KAL_FALSE;
savedMask = SaveAndSetIRQMask();
if(AFE_IsInDelayOff() )
in_delayoff = KAL_TRUE;
RestoreIRQMask(savedMask);
switch(aud_func)
{
case L1SP_SPEECH:
case L1SP_SND_EFFECT:
case L1SP_VOICE:
if( in_delayoff )
{
stop_and_wait = KAL_TRUE;
if(*AFE_VMCU_CON&0x0001)
AFE_TurnOff8K();
if(*AFE_AMCU_CON0&0x0001)
AFE_TurnOffAudioClock();
}
break;
case L1SP_AUDIO:
if( (!AFE_IsKaraok()) && (*AFE_VMCU_CON&0x0001) )
{
AFE_TurnOff8K();
stop_and_wait = KAL_TRUE;
}
else if(in_delayoff)
{
if( AFE_IsKaraok() )
stop_and_wait = KAL_TRUE;
else if(afe.die2die_status == AFE_DIE2DIE_UPLINK)
stop_and_wait = KAL_TRUE;
else if( (afe.die2die_status == AFE_DIE2DIE_DOWNLINK) && (afe.audio_fs != asp_fs) )
stop_and_wait = KAL_TRUE;
}
break;
case L1SP_KEYTONE:
case L1SP_TONE:
if( (afe.die2die_status == AFE_DIE2DIE_DOWNLINK) && in_delayoff )
-à 修改为: if( (afe.die2die_status == AFE_DIE2DIE_DOWNLINK) && (in_delayoff) &&
(AM_IsAudioPlaybackOn() == -1) )
stop_and_wait = KAL_TRUE;
break;
}
if(stop_and_wait)
{
AFE_Disable_IdleOffDelay();
while(afe.audio_clk_ena||afe.voice_clk_ena)
kal_sleep_task(1);
}
#endif
#else
return;
#endif
}
网友评论