一个时序混乱导致的bug分析过程记录

本文分析了一种DTV系统中出现的静音问题。当播放只有音频的频道时,系统偶尔会突然失去声音。通过分析App_BG_Service和Plf_Check_AVData两个线程的工作逻辑,发现了在特定条件下系统未能正确取消静音的状态。
摘要由CSDN通过智能技术生成

      我们先来介绍下业务需求. 业务大致逻辑为:

     (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.

           分析完毕。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值