MCI音乐播放

缘由:

  在改正俄罗斯方块程序的功能的时候,想给这个程序增加一个背景音乐。本想用PlayWave来做的,但想到这个功能十分常用,那还不如封装一个自己的CMusic

类,以备不时之需。本来以为很容易的,可是在真正操作的时候,却出现了一个问题,就是无法准确的知道什么时候音乐播放完成。问题的难道就在于,怎样将类的成员函数作为窗口的回调函数。

 原本用thunk来解决这个问题的,但是在解决的时候出现了一个问题,调试了好几天都没有解决。直到最近才解决。(也就是前一篇文章的由来)

代码:(前面定义的宏主要是解决Unicode问题)

cMusic.h

复制代码
  1 #ifndef CMUSIC_H
  2 #define CMUSIC_H
  3 
 4 #ifdef _UNICODE  5 #define tstring wstring  6 #define tcout wcout  7 #define tcin wcin  8 #else  9 #define tstring string  10 #define tcout cout  11 #define tcin cin  12  13 #endif  14  15 #pragma warning(disable:4311)  16  17 #include "TCHAR.h"  18 #include<iostream>  19 #include<windows.h>  20 #include<string>  21 #include<vector>  22 #include<MMSystem.h>  23 #pragma comment(lib,"Winmm.lib")  24 using namespace std;  25  26 typedef LRESULT (*pfaCallBack)(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);  27 #pragma pack(push,1)  28 struct Thunk  29 {  30  BYTE op_movecx;  31  DWORD_PTR val_ecx;  32  BYTE op_call;  33  DWORD_PTR val_address;  34 };  35 #pragma pack(pop)  36  37 #define MY_WM_PLAY WM_USER+1  38 #define MY_WM_PAUSE WM_USER+2  39 #define MY_WM_STOP WM_USER+3  40 #define MY_WM_CLOSE WM_USER+4  41 #define MY_WM_PLAYNEXT WM_USER+5  42 #define MY_WM_PLAYLAST WM_USER+6  43 #define MY_WM_REPLAY WM_USER+7  44 #define MY_WM_PLAY_LOOP WM_USER+8  45 #define MY_WM_RESUME WM_USER+9  46 #define MY_WM_TEST0 WM_USER+10  47  48 //类说明开始  49 //=========================================================//  50 // 功能:播放音乐以及进行相关的控制  51 // 设计思路:  52 // 这个类的实现应该会比较简单,主要是利用MCI开头的函数来进行控制  53 // 最主要实现一下功能:  54 // 播放一个音频文件  55 // 暂停播放  56 // 恢复播放  57 // 得到音频文件的信息  58 // 文件名  59 // 长度  60 // 当前播放的位置  61 // 显示播放列表//一个文件夹中的所有MP3或者是wav文件  62 // 播放上一首  63 // 播放下一首  64 //  65 // 作者:张敏  66 // 日期:2013-1-10 邮箱 zhang19min88@163.com  67 // 注意:实现这个类我的最大的感想就是不要想在一个类中封装所有的函数  68 // 在真正要用的时候再进行继承  69 //也许这样不会焦头乱额  70 //=========================================================//  71 class ZMCMusic  72 {  73 public:  74  friend DWORD WINAPI ThreadProc(LPVOID);  75 public:  76 ZMCMusic();//构造函数  77 ~ZMCMusic();//析构函数  78 public:  79 void Init();  80 void AddPlayList(tstring tstrDir);  81  BOOL Play();  82  BOOL Pause();  83  BOOL Resume();  84  BOOL Stop();  85  BOOL Close();  86  BOOL Replay();  87 BOOL PlayNext();//播放下一曲  88 BOOL playLast();//播放上一曲  89  BOOL GetFileInfo();  90 BOOL LoadMusicFile(tstring const tstrFileNmae);  91 static void ShowError();  92 private:  93 void GetCurPos();  94 void GetFileLenth();  95 int MakeWindow();//产生一个窗口  96 int CreateWindowInThread();//在线程中创建窗口  97 LRESULT ProcWindow(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);//窗口过程的处理函数  98 private:  99  tstring m_tstrFileName; 100 vector<tstring> m_vcPlayList;//保存播放列表 101 int m_nCurPlayIndex;//当前正在播放文件夹的索引 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值