C5000铃音响不停bug

本文详细描述了C5000设备来电铃声在特定情况下无法停止的问题及修复过程。通过调整IMEDIA接口使用方式,确保了铃声正确播放与停止。

问题描述:
C5000遗留bug,在来电话铃响瞬间,主叫挂断电话,铃音会继续响不停,此时按任何键都无法关闭铃音

解决过程:

查看代码后发现在使用IMEDIA接口设置的回调函数中,在接收到MM_STATE_DONE后,重新调用了IMEDIA_Play()接口。而在调用IMEDIA_Play之前,曾调用过IMEDIA_SetVolume()接口设置IMEDIA的音量,查找BREW API得知,设置音量属性会引起IMEDIA接口发送MM_STATE_DONE状态到注册的回调函数中。因此,其实在调用IMEDIA_Play()播放midi之前,midi早就通过调用IMEDIA_SetVolume()引发的MM_STATE_DONE而在回调函数中开始播放了。
解决这个问题的思路是:
因为IMEDIA在设置Param时,只会触发MM_STATE_DONE,而不会触发MM_STATE_START,所以可以通过设置一个变量,记录IMEDIA的播放状态,当开始调用IMEDIA_Play()之前,设置该变量为FALSE, 当回调接受到MM_STATE_START时,将变量设置为TRUE,而在回调接收到MM_STATE_DONE时,判断该标记是否为TRUE,如果为TRUE,表示不是通过MM_STATE_DONE在回调引发IMEDIA_Play()。

在解决了上面这个问题后,重新测试发现依旧存在该BUG,通过打印log,发现在调用IMEDIA_Stop()接口关闭音乐时,音乐其实并没有关掉,通过进一步分析,发现在调用IMEDIA_Stop()时,IMEDIA的状态并不是MM_STATE_PLAY状态,因此在stop音乐时,实现代码检测到非Play状态,直接返回导致音乐无法关闭。

通过查BREW  API关于IMEDIA state的API,API指出,在IMedia 的状态转换时,调用的IMEDIA 接口函数都有可能失败。
这个问题的解决思路是:
在要调用IMEDIA_Stop()关闭IMEDIA时,通过IMEDIA_GetState()检测IMedia此时的状态,如果不是MM_STATE_START,则设定一个定时器,延时调用IMEDIA_Stop()。
至此问题解决。


总结:
1、使用IMEDIA接口设置Param时,即调用IMEDIA_SetParam()时,必须注意其副作用,部分属性会导致IMEDIA状态的改变。
2、使用IMEDIA_Stop()关闭音乐前,必须检测IMEDIA此时的状态,如果状态不是MM_STATE_START,则要注意IMEDIA_Stop()不会关闭音乐。

在IT领域,C5000通常指德州仪器(TI)推出的TMS320C5000系列数字信号处理器(DSP)。这一系列处理器具有低功耗、高性能等特点,在多个领域有广泛应用。 ### 特性 TMS320C5000系列具备哈佛结构,能够实现指令和数据的并行读取,从而提高处理速度。其指令集丰富,支持单周期乘法和累加操作,适合进行数字信号处理算法的实现。该系列处理器还提供了多种片上外设,如定时器、串口、DMA控制器等,方便系统的开发和集成。 ### 应用领域 - **通信领域**:C5000系列DSP可用于无线基站、调制解调器、软件无线电等设备中,实现信号的调制、解调、编解码等功能。 - **音频处理**:在音频设备如音频播放器、数字调音台等中,C5000能够进行音频滤波、音效处理、语音识别等操作。 - **工业控制**:可应用于工业自动化系统中的电机控制、传感器数据处理等方面,实现精确的控制和高效的数据处理。 ### 开发环境 TI为C5000系列提供了集成开发环境Code Composer Studio(CCS)。该环境支持代码的编写、调试和优化,提供了图形化的界面和丰富的调试工具,方便开发者进行开发工作。 以下是一个简单的使用C5000系列DSP进行信号处理的伪代码示例: ```python # 初始化DSP def init_dsp(): # 配置寄存器 configure_registers() # 初始化外设 init_peripherals() # 信号处理函数 def signal_processing(input_signal): # 进行滤波处理 filtered_signal = filter_signal(input_signal) # 进行增益调整 output_signal = adjust_gain(filtered_signal) return output_signal # 主程序 if __name__ == "__main__": init_dsp() input_signal = read_input_signal() output_signal = signal_processing(input_signal) send_output_signal(output_signal) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值