我们先来介绍下业务需求. 业务大致逻辑为:
(1) App_BG_Service为一个线程,每隔50ms跑一次,它会去检查DTV系统的状态,然后根据DTV系统的状态去mute或取消mute.
如果当前状态为no-signal , 那么就要让系统系统静音,否者取消静音。
(2) Plf_Check_AVData为另外一个线程,它会每隔2s更新下当前系统状态。App_BG_Service线程会每隔50ms去拿下状态,并且buffer到tempStatus里。最终根据tempStatus去做上(1)步所说的mute 或unmute操作。
QA测出的系统bug表现为:在播一个只有音频的频道(audio channel)时,播一段时间后,会突然没有声音。(非必现)
经过debug发现,在播放audio channel码流时,中间会出现no-signal(无信号状态)。在无信号状态,系统应该去mute.但是恢复到有信号状态时候,系统并没有去unmute.
这是为什么呢?下面我们一步步分析。我们先贴出后台线程伪代码逻辑:
if (stillimage状态有变化)
{
如果是audio channel,
mute;
否者,
取消mute;
}
else
{
if( signal 状态有变化)
{
if ( 状态不是好的,如无信号 )
{
mute;
}
else
{
// Open video normally
if ( TempStatus.StillImageType != _STILLIMAGE_VCHIP_BLOCK_ &&
TempStatus.StillImageType != _STILLIMAGE_CHANNEL_LOCK_ &&
TempStatus.StillImageType != _STILLIMAGE_INPUT_LOCK_ &&
((TempStatus.ScreenColor == _NO_COLOR_) || (TempStatus.bAudioChan) ) )
{
取消mute;
}
else
{
mute;
}
}
}
}
下面我们分析下,如下图所示:
由上图可知,如果刚好在第2s和第4s分别发生由signa---->nosignal和nosignal--->signal状态的变化,那么系统可能出现长时间的异常mute.
分析完毕。