void MPEGDEC_dose(MPEGDEC_STREAM*mpds);
功能描述:关闭MPEG音频文件。
参数:mpds指向待关闭的音频文件。
无返回值。
unsigned long MPEGDEC_decode_frame(MPEGDEC_STREAM*mpds,short*pcm[MPEGDEC_MAX_CHANNELS]);;
功能描述:为当前打开的音频文件的一帧解码。
输入:mpds指向打开的音频文件。
输出:pcm[]存放解码后的16位音频数据;pcm[0]中存放单声道或左声道或声道1的数据;pcm[1]中存放右声道或声道2的数据。
返回值:返回解码一帧的音频数据数目;返回MPEG-DEC_ERR_EOF,则说明当前帧是最后一帧;返回MPEG-DEC_ERR_BADFRAME,则说明该帧已损坏。
3.2.2 歌曲基本信息结构体
按照MP3的ID3 V1.0标准定义,MP3文件的最后128字节用来存放标签头、歌曲名、演唱者等信息。为了在LCD屏上显示当前播放歌曲的基本信息,给出了一个结构体来读取并存放这些信息。这个结构体定义如下:
3.2.3 播放主流程
当用户选中歌曲进入播放界面时,ARM7主机首先通过串口给单片机发一个命令字0x01,通知从机进入识别“播放器”这组命令的函数。从机接收到命令后,首先判断“播放器”这组命令是否已经训练。若训练,则返回0x04,同时播放器的语音模式启动成功;若未训练,则返回0x06,LCD屏显示提醒用户训练该库;若从机在规定时间内(因实时性要求,这里“规定时间”指200 ms)返回其他值或未返回值,则播放器的语音模式启动失败。若成功启动语音模式,音乐是分帧解码后播放,在帧一帧循环中,主机需查询键盘和串口,来实现“ 上一首”、“下一首”、“播放”、“暂停”、“退出”和调节音量的功能。若语音模式启动失败,则只需查询键盘。每次接收到“退出”命令时,主机在退出音乐模式前需通过串口发送0x05给单片机,通知单片机同步退出该模式;单片机接收到命令后,需返回0x04告知主机已退出。播放的主流程如图4所示。关于语音命令如何训练,可见参考文献[5],这里不再赘述。
4 实验结果
以W90P710开发套件+凌阳SPCE061A为硬件,采用嵌入式操作系统μClinux,在实验室安静和嘈杂的情况下(安静时室内噪声为50 dB,嘈杂时为60 dB),测试播放器语音模式的工作效率。在测试语音模式的工作效率前,先进行了按键测试,测试通过率为100%,且音乐播放流畅,响应满足实时性要求。
要使语音模式有效工作,首先需训练“播放器”的语音命令,即“播放”、“暂停”、“上一首”、“下一首”、“退出”这5个命令。训练时环境至关重要,必须处于实验室安静环境下。训练的5个命令并不一定是上述5个词,只要表达出相应意思即可,如“上一首”、“下一首”命令直接训练成“上”、“下”。笔者在实验室安静环境下训练后,分别在安静、嘈杂的环境下进行语音测试,结果分别为96.8%、77.8%。实验结果显示,在安静环境下,语音通过率很高;在嘈杂环境下,语音通过率稍微低些,但可以和按键同时使用。
结 语
本文设计了一款由主机W90P710、从机凌阳SPCE061A单片机及其外围电路组成的智能音乐播放器。硬件上重点介绍了音频模块;软件上简单说明了 MP3解码过程及给出了相关接口函数,并详细讲述了播放主流程。最后在测试了按键能够实时、正确响应的基础上,又分别在安静、嘈杂的环境下,进行了语音模式的响应测试,实验结果说明,该播放器不仅能按键控制也能语音控制,且语音控制效果良好。