http://files.cnblogs.com/ququer/TWGPlayer.rar
3 系统分析
3.1系统概述
3.1.1概述
本系统是一款音频播放软件,尽量能播放各种常用的音乐格式,它要有漂亮的可定制的界面,高效的性能,简单的操作,绚丽的效果,能带用户进入一个完美的音乐空间。它是一款集播放、音效、歌词等多种功能于一身的音频播放软件。拥有自主研发的音频引擎,使用DirectSound,具有资源占用低、运行效率高、扩展能力强等优点。支持MP3/mp3PRO、AAC/AAC+、M4A/MP4、WMA、OGG、WAVE等音频格式。支持同步歌词滚动显示和拖动定位播放,并且支持在线歌词搜索和歌词编辑功能。支持多播放列表,支持多种视觉效果,同时具有水晶界面、磁性窗口、半透明/淡入淡出窗口、窗口阴影、任务栏图标、自定义快捷键、信息滚动、菜单功能提示等功能。
3.2需求分析
3.2.1播放功能
3.2.1.1音频:
能解码播放各种常见格式的本地音频文件,如mp3、AAC、AAC+、WMA、WAV、OGG等。并提供扩展功能,使用DirectSound加速播放,支持对各种格式的音频的转换。
3.2.1.2均衡器:
10波段均衡器,多级杜比环绕,常见音效的设置。
3.2.1.3播放列表:
列表插删改,文件插删改,添加文件夹,添加文件,本地搜索,删除(全部删除,错误文件删除,物理删除),排序(按标题、文件名、专辑名、文件长度、随机等),查找(定位,查找歌曲),编辑(剪贴复制粘贴,移动到列表,复制到列表,全选,不选,反选),模式(单曲,单曲循环,顺序,循环,随机),文件属性。
3.2.1.4在线播放功能:
提供正在下载播放,广播收听。
3.2.1.5播放:
播放,暂停,停止,上一首,下一首,静音,音量调节,播放位置调整。
3.2.2界面功能
3.2.2.1视觉效果:
频谱分析,示波显示,梦幻星空,专辑封面,全屏显示。
3.2.2.2界面效果:
音频信息的滚动显示,当前播放时间,滚动轴效果。
3.2.2.3皮肤主题:
换肤功能(背景更换,配色更换,主界面透明[毛玻璃])。
3.2.2.4歌词走马灯效果:
底纹(纹理),阴影,歌词手动调节,歌词编辑,歌谱下载,歌词下载,字体设置,主题设置。
3.2.3下载功能
3.2.3.1歌曲下载管理:
多线程下载,下载进度,下载速度,暂停,开始。
3.2.3.2音乐窗体:
提供在线音乐,在线广播。
3.2.3.3歌词下载:
歌词搜索,文件关联。
3.2.4其他功能
3.2.4.1快捷键:
快捷键设置。
3.2.4.2播放器设置窗口:
各种设置。
3.3系统设计约束
3.3.1需求约束
3.3.1.1规则约束
本系统的编码应遵循匈牙利标记法命名[1],开发流程应符合软件开发中的各种约束[1]。
3.3.1.2环境约束
表3-1开发环境约束
类别 |
标准配置 |
最低配置 |
计算机硬件 |
2G内存,320G硬盘 |
内存128M,硬盘80G |
软件 |
Win7,winxp3,VS2008 |
win2000以上 |
网络通信 |
0.5M带宽 |
无 |
其它 |
无 |
无 |
表3-2运行环境约束
类别 |
标准配置 |
最低配置 |
计算机硬件 |
2G内存,320G硬盘 |
内存128M,硬盘80G |
软件 |
Win7,winxp3,win2000 |
win2000以上 |
网络通信 |
0.5M带宽 |
无 |
其它 |
无 |
无 |
3.3.1.3软件质量的约束
(1) 健壮性约束:
能对数据文件(列表、皮肤xml、用户自定义数据等)的错误进行识别和自我修复。
(2) 兼容性约束:
能在常用xp和win7下实现所有功能。
(3)效率(性能)约束:
常驻内存级别要求,内存<=25M,磁盘<=15M,性能要求为高性能。
(4)可维护性约束:
软件架构应具有更好的扩展性,代码优化要求高。
(5)可测试性约束:
能对类,函数,模块的接口编写先行测试。
(6)编码约束:
名字、注释、代码格式的一致性,类接口约定的一致性,处理基本错误条件。
(7)易用性约束:
软件具有人性化界面设计,简单易用。
(8)可扩展性约束:
软件应该具有可扩展性:如音频解码格式的扩展,软件定制信息扩展等。
(9)安全性约束:
软件应安全运行,不能修改破坏用户系统,并对自身安全提供保护(如火种注入、单模块文件恢复等策略)。
3.3.2隐含约束
3.3.2.1用户受教育程度约束:
假设一般用户受教育程度为初中以上水平。
3.3.2.2用户计算机技能约束:
假设一般用户计算机技能比较低,只会使用操作简单的软件。
3.3.2.3用户计算机软件硬件约束:
请参看环境约束。
4 系统设计
4.1设计策略
4.1.1扩展策略
(1) 为了方便音频解码格式的扩展,本系统对音频解码模块采用多态策略。
(2) 对以后可能添加的各种视觉效果提供渲染接口。
(3) 设计易于扩展的主题模块和设置模块。
(4) 为web页面提供更多接口,使web站点更易扩展。
4.1.2复用策略
(1) 关于界面引擎考虑到代码复用。
(2) 对各种控件自绘基类考虑封装,使之有利于代码复用。
(3) 对于一些下载模块,解码模块和频谱模块等进行封装,有些作为dll单独编译,可用于以后代码的复用。
4.2总体设计
4.2.1总体架构
4.2.1.1架构规格书
表4-1 架构规格书
构造块 |
责任 |
负责需求 |
实现方法(简述) |
可用那个模块 |
通信规则 |
解码模块 |
音频解码,实现对各种音频文件的解码播放。 |
3.2.1.1 |
文件解码(可用mpg12或公开解码库实现)播放用DirectSound处理。 |
无 |
无 |
频谱模块 |
频谱分析,实现各种视觉效果。 |
3.2.2.1 |
FFT,gdi绘图等。 |
无 |
无 |
播放模块 |
播放,暂停等,并协调处理解码模块和频谱模块的相关操作。 |
3.2.1.5 |
可用事件,多线程,线程同步等实现。 |
解码模块,频谱模块。 |
has-a解码模块。 has-a频谱模块。 |
界面模块 |
毛玻璃界面实现,并负责界面主题的更换,是其他窗口类的基类。 |
3.2.2.2 |
毛玻璃效果实现。 |
播放模块,主题模块,列表模块,Http下载模块。 |
has--a播放模块。 has-a主题模块。 has-a列表模块。 has-a Http下载模块。 |
主题模块 |
界面主题包的管理。 |
3.2.2.3 |
无 |
无 |
|
Xml模块 |
Xml文件的管理,对所有数据的读取处理工作。 |
无 |
用开源xml管理库。 |
无 |
无 |
列表模块 |
列表管理,列表文件的管理。 |
3.2.1.3 |
用相关高效容器实现。 |
无 |
无 |
歌词模块 |
歌词显示和功能实现。 |
3.2.2.4 |
走马灯效果,双层窗体实现。 |
主题模块。 |
like-a主题模块。 |
Web模块 |
浏览器的接口实现。 |
3.2.3.2 |
CDHtmlDialog接口处理。 |
无 |
无 |
Http下载模块 |
下载,缓冲区的管理。 |
3.2.3.1 3.2.3.3 |
WinSock编程实现,多线程下载。 |
无 |
无 |
设置模块 |
各种用户设置支持。 |
3.2.4 |
略 |
Xml模块。 |
has -a Xml模块。 |
4.2.1.2模块逻辑架构图
图4-1 模块逻辑架构图
4.2.1.3架构规格书说明
(1)分解方法:根据各有关需求,结合所使用的MFC框架,设计以上相应模块。
(2)子系统的协调:通过各有关对象实例协调处理用户消息,实现相应功能。
4.2.2系统架构
4.2.2.1播放模块架构图:
图4-2 播放模块架构图
4.2.2.2解码模块架构图:
图4-3 解码模块架构图
4.2.2.3界面模块架构图
图4-4 界面模块架构图
4.2.2.4歌词模块架构图
图4-5 歌词模块架构图
4.3详细设计
4.3.1模块汇总表
表4-2模块汇总表
系统A:音频播放器 |
|
模块名称 |
功能简述 |
1.解码模块 |
音频解码,实现对音频文件的解码播放。 |
2.频谱模块 |
频谱分析,实现各种视觉效果。 |
3.播放模块 |
播放,暂停等,并协调处理解码模块和频谱模块的相关操作。 |
4.界面模块 |
毛玻璃界面实现,并负责界面主题的更换,是其他窗口类的基类。 |
5.主题模块 |
界面主题包的管理。 |
6.Xml模块 |
Xml文件的管理,对所有数据的读取处理工作。 |
7.列表模块 |
列表管理,列表文件的管理。 |
8.歌词模块 |
歌词显示和功能实现。 |
9.Web模块 |
浏览器的接口实现。 |
10.Http下载模块 |
下载,缓冲区的管理。 |
11.设置模块 |
各种用户设置支持。 |
4.3.2模块设计表
4.3.2.1解码模块A-1
表4-3解码模块设计表
模块名称 |
解码模块 |
功能描述 |
音频解码,实现对音频文件的解码播放。 |
接口与属性 |
(1) 继承关系图: 图4-6 解码模块继承关系图 (2) 类名:CInput Main Method: virtual void Pause();//暂停读取 virtual void Resume();//重新读取文件 virtual DWORD GetTotalTime();//获取音频文件 virtual LARGE_INTEGER GetTotalSamples();//获取总样本数 virtual WORD GetBitsPerSample() = 0;//获取量化位数 virtual WORD GetChannels() = 0;//获取声道数 virtual DWORD GetSampleRate() = 0;//获取采样频率 virtual DWORD GetCurrentPlayPos() = 0;//获取当前播放位置 LARGE_INTEGER GetSize();//获取文件大小 LARGE_INTEGER GetPosition(); void GetData(void** buffer, DWORD* size);//获取size位置的缓冲区指针,buffer返回 DWORD CopyData(void* buffer, DWORD size);//复制size位置的缓冲区数据到buffer DWORD FillBuffer(void* buffer, DWORD size, BOOL* eof);//复制填充buffer,eof返回是否成功 void Init(); void Flush(); (3) 类名:CFileIn CInput CStreamedInput CFileIn Constructor: CFileIn(void); virtual ~CFileIn(void); Main Method: virtual void OpenFile() = 0;//打开一个文件 virtual void CloseFile() = 0;//关闭一个文件 virtual void GetSoundInformation(char *title, char *artist, char *album, char *year, char *comments) = 0;//读取音频数据信息 void SetFileName(TCHAR* pszFileName);//设置文件名 size_t GetFileNameLen();//获取文件长度 WORD GetBitsPerSample(); DWORD GetSampleRate(); WORD GetChannels(); INT GetOpened();//获取打开状态 LARGE_INTEGER GetTotalSamples(); DWORD GetTotalTime(); BOOL SetStartTime(DWORD Minutes, DWORD Seconds); BOOL SetEndTime(DWORD Minutes, DWORD Seconds); void Reset(); void Jump(INT offset); |
算法与原理 |
内部实现使用相关解码库解码成pcm数据[3]。 |
补充说明 |
无 |
4.3.2.2频谱模块A-2
表4-4频谱模块设计表
模块名称 |
频谱模块 |
功能描述 |
频谱分析,实现各种视觉效果。 |
接口与属性 |
类名:CSpectrumAnalyser //频谱分析类 绘制频谱 Constructor: CSpectrumAnalyser(CBasicPlayer* pPlayer); ~CSpectrumAnalyser(void); Main Method: void drawSpectrumAnalyserBar(RECT* pRect, int pX, int pY, int pWidth, int pHeight, int band); //绘制频谱柱 void prepare(); //初始化 void Start(); //开始绘制 void Stop(); //停止绘制 char* GetAudioDataBuffer(); INT GetPosition(); void SetPosition(INT pPosition) ; DWORD GetAudioDataBufferLength(); void SetAudioDataBufferLength(DWORD pAudioDataBufferLength) ; |
算法与原理 |
对pcm数据执行FFT算法,根据视觉效果类型进行排序渲染绘制。 视觉效果实现原理:傅立叶变换是众多数学变化中应用最广泛的一种,其实质是将一个周期函数分解成一系列正交函数的(比如sin和cos函数)的线性集合。快速傅里叶变换将时域中难以处理的信号转换成易于处理的频域信号。通过把解码后的PCM数据流进行实时FFT,对处理后的频域信号进行分组排序等算法,根据要实现的视觉效果进行相关绘制即可。 |
补充说明 |
无 |
4.3.2.3播放模块A-3
表4-5播放模块设计表
模块名称 |
播放模块 |
功能描述 |
播放,暂停等,并协调处理解码模块和频谱模块的相关操作。 |
接口与属性 |
类名:CBasicPlayer Constructor: CBasicPlayer(HWND hWnd, TCHAR* pszFileName); ~CBasicPlayer(void); Main Method: DWORD GetSoundLength(); DWORD GetCurrentPosition(); void SetVolume(int iVolume); int GetVolume(); void SetCurrentPosition(int pos); DWORD GetBufferSize() void SetBufferSize(DWORD pBufferSize) FLOAT GetSampleRate() void SetSampleRate(FLOAT pSampleRate) WORD GetFrameSize() void SetFrameSize(WORD pFrameSize) WORD GetBitsPerSample() void SetBitsPerSample(WORD pBitsPerSample) WORD GetChannels() void SetChannels(WORD pChannels) CPlayThread* GetPlayThread() DS_Info* GetDSInfo() long GetBytePosition() void Start(); void Stop(); void Pause(); __int64 GetLongFramePosition(); |
算法与原理 |
均衡器实现原理[4]:均衡器的作用就是调节不同频率的信号的强度。声音作为一种波具有三个要素:幅度,频率,相位。其中幅度决定了声音的大小,频率决定了声音音调的高低。实际的声音往往都不是单一频率的波,而是有各种频率的波叠加而成,从而形成了各具特色的声音。y = Asin(wt+fi)+A0 (单频率声波描述) (2-1)y = A1sin(w1t+fi1) + A2sin(w2t+fi2) + .(实际的声波描述) (2-2)声音的不同就在于不同频率的声信号具有不同的强度。而均衡器就是根据这个原理来实现的。均衡器能自动分离不同频率的信号,并采取不同程度的放大或缩小,从而改变声音的效果。具体来说,均衡器一般把人能听到的频段范围(20Hz-20KHz)分为多个频段,对不同频段的声信号进行不同程度的放大或缩小(增益或负增益)。对处理后PCM数据流用DirectSound把数据放到音频设备上即可。 |
补充说明 |
无 |
4.3.2.4界面模块A-4
表4-6界面模块设计表
4.3.2.5主题模块A-5
表4-7主题模块设计表
模块名称 |
主题模块 |
功能描述 |
界面主题包的管理。 |
接口与属性 |
略 |
算法与原理 |
对每个主题使用xml组织页面控件位置大小,实现切换。 |
补充说明 |
无 |
4.3.2.6 XML模块A-6
表4-8 XML模块设计表
模块名称 |
Xml模块 |
功能描述 |
Xml文件的管理,对所有数据的读取处理工作。 |
接口与属性 |
略 |
算法与原理 |
用Markup实现xml的存取,对系统配置变量进行校验管理。 |
补充说明 |
无 |
4.3.2.7模块A-7
表4-9列表模块设计表
模块名称 |
列表模块 |
功能描述 |
列表管理,列表文件的管理。 |
接口与属性 |
略 |
算法与原理 |
用相关高效容器实现。 |
补充说明 |
无 |
4.3.2.8模块A-8
表4-10歌词模块设计表
模块名称 |
歌词模块 |
功能描述 |
歌词显示和功能实现。 |
接口与属性 |
类名:CLyricDlg CLyricDlg CDialog public: CString SearchLyricLocal(); //歌词本地搜索 bool OpenLyric(); //打开歌词文件 void GetLyric(CString strFileName); //分析歌词 void AnalyseLine(CString strLine); //分析一行 void SortLyric(); //行排序 void DrawText(CDC *pDC); //歌词绘制 void OnSliderSeek(int soundPos); //滑动条歌词定位 |
算法与原理 |
歌词走马灯效果实现:使用双层窗体,对这两层窗体通过进行GDI+绘制与和png图片融合,实现歌词走马灯效果。 |
补充说明 |
无 |
4.3.2.9模块A-9
表4-11 Web模块设计表
模块名称 |
Web模块 |
功能描述 |
浏览器的接口实现。 |
接口与属性 |
类名:CPageWeb Main Method: void WebGoBack(); void WebGoGoForward(); void WebRefresh(); void OnButtonAddOneSound(VARIANT& cSUrl, VARIANT& cSA, VARIANT& cSName, bool bIsFresh=true); void AfterAddedRefresh(); bool _IsSoundDownLoad(CString SoundName,CString SoundPath);//接口暴露 BEGIN_DISPATCH_MAP(CPageWeb, CDHtmlDialog) DISP_FUNCTION(CPageWeb, "OnButtonAddOneSound", OnButtonAddOneSound, VT_EMPTY, VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_I1) DISP_FUNCTION(CPageWeb, "AfterAddedRefresh", AfterAddedRefresh, VT_EMPTY,VTS_NONE) END_DISPATCH_MAP() |
算法与原理 |
用CDhtmlDialog给web页面暴露接口函数实现c++与javescript的交互。 |
补充说明 |
无 |
4.3.2.10模块A-10
表4-12 Http下载模块设计表
模块名称 |
Http下载模块 |
功能描述 |
下载,缓冲区的管理 |
接口与属性 |
类名:CHttpSocket Constructor: CHttpSocket(); virtual ~CHttpSocket(); Main Method: CHttpSocket(); virtual ~CHttpSocket(); int GetServerState();//返回服务器状态码-1表示不成功 int GetField(const char* szSession,char *szValue,int nMaxLength); //返回某个域值,-1表示不成功 int GetResponseLine(char *pLine,int nMaxLength);//获取返回头的一行 const char* GetResponseHeader(int &Length); //获取完整的返回头 const char * FormatRequestHeader(char *pServer, char *pObject,long &Length,char* pCookie=NULL, char *pReferer=NULL,long nFrom=0,long nTo=0, int nServerType=0); //格式化请求头 int GetRequestHeader(char *pHeader,int nMaxLength) const; BOOL SendRequest(const char* pRequestHeader = NULL,long Length = 0); BOOL SetTimeout(int nTime,int nType=0); long Receive(char* pBuffer,long nMaxLength); BOOL Connect(char* szHostName,int nPort=80); BOOL Socket(); BOOL CloseSocket(); |
算法与原理 |
WinSock多线程下载实现 |
补充说明 |
无 |
4.3.2.11模块A-11
表4-13设置模块设计表
模块名称 |
设置模块 |
功能描述 |
各种用户设置支持 |
接口与属性 |
类名:CPropertyMainDlg Constructor: CPropertyMainDlg(CWnd* pParent = NULL); ~CPropertyMainDlg(); private: vector int m_iCurPage; CRect m_frameRect; CString m_csConstantText; Main Method: void Init(); bool AddPage(CPropertySubDlg *page, const char *pCaption); void ShowPage(int iPage); |
算法与原理 |
略 |
补充说明 |
无 |
4.3.3界面详细设计
4.3.3.1应当遵循的界面设计规范
(1) 操作的简单性。
(2) 界面的一致性。
(3) 组织的合适性。
(4) 操作的灵活性。
4.3.3.2界面的关系图和工作流程图
4.3.3.3主界面设计
(1) 绘制子主界面的视图:
图4-8 主界面设计
(2) 主界面和整体界面的显示效果:
图4-9 主界面显示效果
图4-10 主界面去列表显示效果
图4-11 界面整体显示效果
(3) 主界面的功能与操作:
主要功能和操作:鼠标移至窗口即显示相关按钮,包括上一首,下一首,播放,暂停,停止,关闭,最小化,打开歌词,打开音乐窗,打开均衡器,打开歌曲列表,打开歌曲文件,声音调整,选时播放。
4.3.3.4 设置界面设计
(1) 设置界面显示效果:
图4-12 界面整体显示效果
(2) 设置界面的功能与操作:
可以设置各种属性项
4.3.3.5 下载管理界面设计
(1) 绘制下载管理弹出菜单视图:
图4-13 下载菜单设计
(2) 下载界面的显示效果:
图4-14 下载显示效果
(3) 下载界面的功能与操作:
包括开始播放,开始任务,暂停任务,上一道顶部,下移到底部,打开文件夹,从硬盘上删除。