概述
Internet Radio是一个为S60第三版设备开发的声音应用参考实现,支持SHOUTcast (America Online) 协议。
目的:为开发更多新颖的S60声音应用提供一个学习工具。
设计与实现
两个主要组成部分,UI和Engine。(一般比较好的程序都是这么设计的,以保证更好的模块化)。
- UI:负责用户界面逻辑,以及展示Engine的数据
- Engine:分配资源,声音回放,与其他子系统交互,基于ECom Plugin架构
在多处使用了Adapter设计模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Application UI
普通的单view架构,类图如下所示,这是标准的Symbian图形化应用程序框架之一(共有三种),大多数Symbian应用程序都是用的这个框架。
AppUi实现了MAdapterObserver接口,其作用是由CPlayerAdapter和Engine(通过CPluginAdapter)回调显示元数据及状态信息。
class CS60InternetRadioAppUi : public MAdapterObserver, public CAknAppUi
另外该类又包含了如下类。
private: // Data
CPlayerAdapter* iPlayerAdapter; // the audio player adapter 播放本地文件
MAudioAdapter* iAudioAdapter; // the current audio adapter 一个统一的接口
CS60InternetRadioView* iAppView; //the application view 界面显示部分
RPointerArray<CPluginAdapter> iAudioPlugins; // list of plugin adapters 播放shoutcast流
CPlayerAdapter封装了系统的CMdaAudioPlayerUtility类进行本地文件播放,并提供相应接口给AppUi调用。
CPluginAdapter提供了实现EComPlugin接口,实现shoutcast流数据的播放。
MAudioAdapter抽象出了播放本地文件和shoutcast流内容的所需接口,以及一些界面显示接口。
CPlayerAdapter和CPluginAdapter都实现MAudioAdapter接口,UI可以使用同一个接口处理播放本地文件或者播放Shoutcast流数据。
class CPlayerAdapter : public CBase, public MAudioAdapter, public MMdaAudioPlayerCallback
class CPluginAdapter : public CBase, public MAudioAdapter
MAudioAdapter* iAudioAdapter;
if ( iAudioPlugins.Count() ) // If plugin adapters were found, use the first one on the list.
{
iAudioAdapter = iAudioPlugins[0];
}
else // otherwise, we use the file player adapter
{
iAudioAdapter = iPlayerAdapter;
}
AppView主要处理界面上的Label的显示以及进行按键处理,如左右键为调低、调高音量。
Application Engine
程序引擎由两部分组成,但使用同一个接口MAudioAdapter来播放本地文件和shoutcast流:
1. Shoutcast stream播放功能采用ECom Plugin实现,具体通过CShoutcastAdapter类实现(下一节介绍)。
2. 本地文件播放功能通过CPlayerAdapter类实现,封装了系统的CMdaAudioPlayerUtility(Adapter模式)。
CPlayerAdapter类图
封装了系统的CMdaAudioPlayerUtil