《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > 一种嵌入式PPC下音频播放的方法

一种嵌入式PPC下音频播放的方法

2008-05-06
作者:朱世交1,廖明军2

  摘 要: 通过对嵌入式Pocket PC环境下音频播放的研究,提出了基于FMOD音频播放的设计与实现原理,以此说明Pocket PC下多媒体应用" title="多媒体应用">多媒体应用的开发方法。
  关键词: Pocket PC 多媒体 FMOD


  随着嵌入式应用的迅速发展,很多传统的基于台式机的应用迅速转向嵌入式应用平台。WinCE为微软开发的嵌入式系统" title="嵌入式系统">嵌入式系统,其广泛应用于Pocket PC(PPC)嵌入式应用平台。在嵌入式平台下实现多媒体应用是当前应用研究的热点。
  使用嵌入式技术与音频播放相结合的研究已经很多,如嵌入式音频点播、MP3播放系统等,但它们多是使用特定的硬件解码器完成音频解码,对于嵌入式PPC下如何实现软实时音频解码缺乏系统性研究。通过研究发现FMOD可以实现完整的音频播放功能。由于PPC上没有DirectSound的设计,因此只能用CPU来模拟。
  本文使用EVC作为开发语言,设计方法亦适合其他平台。此方法也可以在游戏和应用程序" title="应用程序">应用程序中使用,为PPC上的音频播放提供解决思路。
1 音频技术介绍
1.1 PPC上音频播放的现状

  PPC上通常使用WAV声音文件进行音频播放。若使用微软的Media接口进行音频播放,一方面播放效率比较低,满足不了实时应用对时间效率的要求,例如游戏、多媒体、播放器等应用;另一方面,播放文件格式单一,WAV文件相对于mp3等压缩音频文件所占存储空间较多,对以存储卡" title="存储卡">存储卡为存储介质的PPC来说,显然不合适。
  对于音频引擎中API编程的应用,可选择Windows Multimedia、DirectSound、OpenAL、Aureal A3D,其中以DirectSound较为著名。但是这些技术不适合在资源紧张的PPC上使用。
  另外,还有一些没有真正硬件支持的应用程序接口,它们以API组件包的形式提供给应用程序使用,例如:Miles Sound System、RenderWare Audio、GameCoda、FMOD、Galaxy、BASS、SEAL。其中FMOD是最新引入的技术,具有广泛的功能选择和对API技术的完美支持。
1.2 PPC上FMOD简介
  FMOD是一个非常容易使用的跨平台声音引擎,支持三维环绕声、MIDI、MOD、MP3、OGG、WMA、AIFF、CD,可以在Windows、Windows CE、Linux、Macintosh、GAMECUBE、PLAYSTATION 2和XBOX上使用,支持C/C++、VB、DELPHI。同时通过分析其接口可知,它还为PPC平台定制了一个mini版本,用以在PPC上进行音频播放,并且在非商业程序的情况下是免费的,这为研究提供了便利条件。
2 音频播放器实现中的关键技术
2.1 形式化结构设计
  自20世纪90年代后期以来,软件体系结构的研究成为一个热点。从研究现状来看,当前的研究和对软件体系结构的描述,在很大程度上还停留在非形式化的层次上。从FDT[5](Formal Description Technique)在实际项目应用中的技术特征来看,SDL(Specification and De-
  scription Language)与UML(Unified Modeling Language)是比较容易结合使用的。
  PPC上音频播放借助于FMOD的音频解码,本文尝试使用形式化描述的方法设计音频播放流程。
  PPC上音频播放的功能EBNF[6]范式描述如下:
  player:={player_files,player_status,player_decoder,frame_views}
  player_files:={*.MOD|*.S3M|*.XM|*.IT|*.MID|*.RMI|*.SGT|*.FSB}
  player_status:=sequence(play,pause,stop);
  player_decoder:={FMOD modules}
  frame_views:={Player information}
  音频播放的系统协作图如图1所示。


  (1)PPC上的控制逻辑:用以对音频文件的播放、停止、文件装载、显示等的控制。
  (2)FMOD引擎:具体音频数据解码、软实时播放,同时与PPC的播放控制和音频文件管理相关联。
  (3)PPC音频文件管理:管理要播放的音频文件,播放音频列表等。对PPC上文件管理不方便的功能进行扩充。
2.2 PPC上音频文件选择的方法
  可使用GetOpenFileName方法对PPC上音频文件进行选择,但选择的文件位置被系统固定在My Document的Personal目录之下,使文件可选择范围缩小并存在很多限制,例如,在这种情况下文件不能存放在存储卡上。
  在PPC系统不以盘符存放文件,只根据系统的根目录,即“”。为此需要通过以下文件选择实现对PPC上文件目录的访问:
  (1)文件目录选择:在此功能下可以对文件目录进行浏览访问;
  (2)文件目录中的文件选择:包括文件名称、大小、创建日期等内容;
  (3)文件过滤功能:包括对特定后缀音频文件的选择。
  在PPC的模拟器上进行文件选择时,由于PPC的文件系统是以双字节UNICODE形式编码,所以要使用WideCharToMultiByte把文件名称转换为多字节流信息,否则无法打开具体的音频文件。对于目录下的文件目录和文件名称,可通过以下遍历搜索方法获得:
  hFind=FindFirstFile(strSearch,&fd);
  bFind=(hFind !=INVALID_HANDLE_VALUE);
  while(bFind)
  {if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&!(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
   {
   strFile=pszPath;
   strFile +=fd.cFileName;//处理文件名方法
   m_cont.push_back(fd);//保存到队列中
   }
  bFind=FindNextFile(hFind,&fd);
  }
  通过使用FindFirstFile和FindNextFile可以获得PPC下文件系统相关信息的列表,同时为了对文件类型进行较好的表示,系统通过SHGetFileInfo方法获得在系统中注册的图标信息。PPC下自制音频文件浏览器如图2所示。


2.3 音频文件播放时波形显示
  对于播放的音频文件信息,通常使用波形表示声音的时频变化,通过在FMOD引擎中创建DSP效果单元和相关数据缓冲单元得到音频的FFT(快速傅式变换)变换数据。使用FSOUND_DSP_GetSpectrum方法获得512个频谱幅度的浮点数值信息,然后把频谱数据绘制成波形谱。将FFT频谱数据转换到界面显示的算法描述如下:
  (1)假设对于频谱数据要显示区域的长度、宽度分别为height、width;
  (2)将频谱数值f(i),i1...512归一化后映射到显示区域:
  
  (3)频谱线显示着色映射方法。事实上对于频谱的振幅,期望其高振幅与低振幅有明显的对比度,同时还要在振幅的变化过程中体现出着色变化的联系性。据此,采用彩色空间RGB系统。可固定其中的B(blue)分量,把R、G分量进行线性划分,即R=255-G,把归一化的heightf(i)映射到0~255范围f′(i),令R=f′(i),则彩色空间G分量:G=255-f′(i)。因此,可以通过连续变化的RGB彩色空间分量表示频率分量的振幅信息。
  (4)通过上述方法,把频谱信息映射到图像中,映射处理完毕。
  声音播放的频谱波形显示如图3(a)所示,通过这种直观方式可以更加清楚地了解音频的频谱特征。同理可以获得频谱振荡情况的振荡曲线图如图3(b)所示。


2.4 音频文件播放时控制
  对于FMOD音频引擎库,FMOD SDK函数处理方式如下:
  FSOUND_Sample_Load(int index,const char *name_or_data,unsigned int inputmode,int offset,int length);
  或者:FSOUND_PlaySound(int channel,FSOUND_SAMPLE*sptr)
  其中index和channel为音频数据标识,通过控制音频数据块实现声音的播放。
  音频播放文件类型可分为FMUSIC_MODULE和FSOUND_STREAM类型。其中FMUSIC_MODULE是对MOD、S3M、XM、IT、MID、RMI、SGT、FSB等后缀播放文件的处理描述,而FSOUND_STREAM是对audio file、url网上流媒体文件、 cd文件的描述。
  为了对音频播放模块进行控制并在文件播放时进行管理,定义管理结构如下:
  typedef struct{
  FMUSIC_MODULE *mod;//音频标示
  FSOUND_STREAM *stream;//流数据音频标示
  int channel;
  } SONGTYPE;
  音频文件加载" title="加载">加载及播放形式如下:
  WideCharToMultiByte(CP_ACP,0,strFullPath,-1,s,256,NULL,NULL);//转换
  FMUSIC_MODULE mod=FMUSIC_LoadSong(s);
  //加载音频文件
  FMUSIC_PlaySong(mod);//播放音频数据
  播放过程中暂停的方法:
  FMUSIC_SetPaused(mod,!FMUSIC_GetPaused(mod));
  停止播放的方法:
  FMUSIC_FreeSong(mod);
3 音频播放及其性能分析
  通过以上分析和关键技术实现,得到如图4所示的音频播放界面,包括打开文件、播放停止、信息显示等功能。


  为了测试在PPC上使用FMOD进行软播放音频的性能,随机从网上获取一些不同格式的音频文件进行测试:以100ms为周期对CPU使用率进行采样,然后把整个时间内的CPU使用率平均,可由以下公式计算得到:
  
  其中:xi表示各个时刻的CPU使用百分比。
  表1描述了PPC模拟器上的测试结果,其中宿主机为赛扬1.2,内存392MB。从实际的CPU使用消耗来看,效果非常好。对于时间反应要求较高的应用(例如游戏、仿真等),音频播放也是完全可以胜任的。
  本文讨论了在嵌入式PPC上进行音频播放的方法,并对开发中存在的问题提出了解决方案。作为PPC上的音频开发研究,可以应用到其他PPC应用中,为PPC上多媒体开发提供借鉴。当然,如何把当前流行的多媒体与嵌入式系统更好地结合,有待于进一步研究。
参考文献
1 杜 剑,熊建设,邵敏等.基于嵌入式系统的音频点播系统[J].重庆邮电学院学报,2005;(17)
2 亓中瑞,高振明.MP3播放系统的设计与实现[J].山东电子,2003;(3)
3 FMOD组织网站.http://www.fmod.org/[DB/OL]
4 Kruchten P B.The 4+1 view model of architecture.IEEE Software[J],1995;12(6)

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。