FAQ-MT6250基线关机有pop音

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<

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 (等待事件,一直等不到,导致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

}

你可能感兴趣的:(FAQ-MT6250基线关机有pop音)