芯方式

6250关机pop音

0
阅读(1108)

[Description]
50基线关机有pop音, 之前6250D有出现过, 解决方法是将afe_def.h文件的
__AFE_PA_DELAY_OFF__定义为1, 能够解决。而50按此方法处理后,能将pop音消除,但录音机
录音后,立刻播放会死机。
[Solution]半导体
分析过程:因为是播放声音的末尾有pop音,采用提前关PA的方法,这个方法在较多平台经常使用
,如6236,6253,6252等。
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的外部消息队列满。
作如下修改后,问题解决。
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
}