-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcplayer.h
305 lines (283 loc) · 8.92 KB
/
cplayer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
//音乐播放器的头文件
//32位程序版本
#ifndef __CPLAYER_H__
#define __CPLAYER_H__
#define DebugLog(...)
class CPlayer
{
public:
CPlayer();
~CPlayer();
public:
BOOL Open(LPCTSTR lpFileName);//打开文件
BOOL Play(DWORD dwPos = 0);//播放
BOOL Close();//关闭
BOOL Stop();//停止
BOOL Pause();//暂停
BOOL Continue();//继续
BOOL SetVolume(DWORD dSize);
BOOL SetPos(DWORD dwPos);
BOOL SetAudio(bool AudioOff);
BOOL SetSpeed(DWORD Speed);
DWORD GetLength();//获取歌曲长度
BOOL GetError(LPTSTR pszText, UINT cchText);
DWORD GetPos();
void SetWindowHwnd(HWND hWnd);//设置主窗口句柄
private:
MCI_OPEN_PARMS m_ciOpen;//打开设备参数
HWND m_hWnd;//主窗口句柄
DWORD m_dwFrom;//播放起始点
MCIERROR m_dwError;
};
//#include "stdafx.h"
//#include "Player.h"
#include <digitalv.h>
#pragma comment(lib, "Winmm.lib")
#define _USER_MCI_COMMAND
CPlayer::CPlayer()
: m_hWnd(nullptr)
, m_dwFrom(0)
, m_dwError(0)
{
ZeroMemory(&m_ciOpen, sizeof(MCI_OPEN_PARMS));
}
CPlayer::~CPlayer()
{
if (m_ciOpen.wDeviceID)///如果有打开的MCI设备就关闭
Close();
}
/// 打开设备
BOOL CPlayer::Open(LPCTSTR lpFileName)
{
DebugLog(__func__);
TCHAR lpszShortPath[MAX_PATH] = { 0 };
GetShortPathName(lpFileName, lpszShortPath, _countof(lpszShortPath));// 获得短路经
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)///如果有打开的MCI设备就关闭
Close();
m_ciOpen.dwCallback = (DWORD) &(m_hWnd);
DebugLog(__func__);
m_ciOpen.lpstrDeviceType = NULL;
m_ciOpen.lpstrElementName = lpszShortPath;///播放文件路径
m_ciOpen.lpstrAlias = _T("MusicAlias");
if (m_dwError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD) &(m_ciOpen)))///打开设备时,设备号为0
{
DebugLog(__func__);
return FALSE;
}
m_dwFrom = 0;
return TRUE;
#else
mciSendString(_T("Stop MusicAlias"), nullptr, 0, m_hWnd);
TCHAR lpstrCommand[MAX_PATH * 2] = {};
_stprintf_s(lpstrCommand, _T("Open %s Alias MusicAlias"), lpszShortPath);// MusicAlias 是设备别名
return !(m_dwError = mciSendString(lpstrCommand, nullptr, 0, m_hWnd));
#endif
}
/// 播放音乐
BOOL CPlayer::Play(DWORD dwPos)
{
DebugLog(__func__);
m_dwFrom = dwPos;
#ifdef _USER_MCI_COMMAND
MCI_PLAY_PARMS mciplayparms;///播放参数结构
DWORD cdlen = GetLength();///得到文件大小
mciplayparms.dwCallback = (DWORD) &(m_hWnd);
mciplayparms.dwFrom = m_dwFrom;///设置起始位置
mciplayparms.dwTo = cdlen;///设置终止位置
if (m_ciOpen.wDeviceID != 0)///判断是否打开文件
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_PLAY, MCI_TO | MCI_FROM, (DWORD) &(mciplayparms)));
return FALSE;
#else
return !(m_dwError = mciSendString(_T("Play MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
/// 执行MCI_CLOSE操作,关闭MCI设备
BOOL CPlayer::Close()
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_CLOSE, 0, 0));
return FALSE;
#else
return !(m_dwError = mciSendString(_T("Close MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
/// 执行MCI_STOP操作,停止播放音乐
BOOL CPlayer::Stop()
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)
{
if (0 == mciSendCommand(m_ciOpen.wDeviceID, MCI_STOP, 0, 0))
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0));///把播放位置设定为音乐文件的开头(下一次播放操作从文件开头位置开始)
}
m_dwFrom = 0;
return FALSE;
#else
return !(m_dwError = mciSendString(_T("Stop MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
/// 执行MCI_PAUSE操作,暂停播放音乐
BOOL CPlayer::Pause()
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
if (m_ciOpen.wDeviceID)
{
DWORD dwsf = GetPos();
m_dwFrom = MCI_MAKE_MSF(MCI_MSF_MINUTE(dwsf), MCI_MSF_SECOND(dwsf), MCI_MSF_FRAME(dwsf));
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_PAUSE, 0, 0));
}
return FALSE;
#else
return !(m_dwError = mciSendString(_T("Pause MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
BOOL CPlayer::Continue()
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
MCI_PLAY_PARMS mciplayparms;///播放参数结构
DWORD cdlen = GetLength();///得到文件大小
mciplayparms.dwCallback = (DWORD) &(m_hWnd);
mciplayparms.dwTo = cdlen;///设置终止位置
if (m_ciOpen.wDeviceID != 0)///判断是否打开文件
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_PLAY, MCI_TO, (DWORD) &(mciplayparms)));
return FALSE;
#else
return !(m_dwError = mciSendString(_T("Play MusicAlias"), nullptr, 0, m_hWnd));
#endif
}
/// 得到文件大小
DWORD CPlayer::GetLength()
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
MCI_STATUS_PARMS mcistatusparms;
mcistatusparms.dwCallback = (DWORD) &(m_hWnd);
mcistatusparms.dwItem = MCI_STATUS_LENGTH;
mcistatusparms.dwReturn = 0;
m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD) &(mcistatusparms));
return mcistatusparms.dwReturn;/// 单位是毫秒 mm
#else
TCHAR sPosition[256];
DWORD lLength;
mciSendString(_T("Status MusicAlias length"), sPosition, 255, m_hWnd);
lLength = _tcstol(sPosition, nullptr, 10);
return lLength;/// 单位是毫秒 mm
#endif
}
/// 得到文件播放位置
DWORD CPlayer::GetPos()
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
MCI_STATUS_PARMS mcistatusparms;
mcistatusparms.dwCallback = (DWORD) &(m_hWnd);
mcistatusparms.dwItem = MCI_STATUS_POSITION;
mcistatusparms.dwReturn = 0;
m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD) &(mcistatusparms));
return mcistatusparms.dwReturn;
#else
TCHAR sPosition[256];
DWORD lLength;
mciSendString(_T("Status MusicAlias position"), sPosition, 255, m_hWnd);
lLength = _tcstol(sPosition, nullptr, 10);
return lLength;/// 单位是毫秒 mm
#endif
}
void CPlayer::SetWindowHwnd(HWND hWnd)
{
DebugLog(__func__);
m_hWnd = hWnd;
}
/// 设置音量 0-100,百分比
BOOL CPlayer::SetVolume(DWORD dSize)
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;
mciSetAudioPara.dwCallback = (DWORD) &(m_hWnd);
mciSetAudioPara.dwItem = MCI_DGV_SETAUDIO_VOLUME;
mciSetAudioPara.dwValue = dSize * 10; ///此处就是音量大小 (0--1000)
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD)&(mciSetAudioPara)));
#else
TCHAR lpstrCommand[32] = {};
_stprintf_s(lpstrCommand, _T("setaudio MusicAlias volume to %ld"), dSize);
return !(m_dwError = mciSendString(lpstrCommand, nullptr, 0, m_hWnd));
#endif
}
/// 设置进度
BOOL CPlayer::SetPos(DWORD dwPos)
{
DebugLog(__func__);
m_dwFrom = dwPos;
#ifdef _USER_MCI_COMMAND
DWORD dwLength = GetLength();///得到文件大小
MCI_SEEK_PARMS Seek;
Seek.dwCallback = (DWORD)&(m_hWnd);
Seek.dwTo = dwPos;
DWORD dwFlags = MCI_WAIT;
if (dwPos > 0 && dwPos < dwLength)
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_TO, (DWORD) &(Seek)));
else if (dwPos >= dwLength)
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_END, 0));
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, 0));
#else
TCHAR lpstrCommand[32] = {};
_stprintf_s(lpstrCommand, _T("seek MusicAlias to %ld"), dwPos);
return !(m_dwError = mciSendString(lpstrCommand, nullptr, 0, m_hWnd));
#endif
}
/// 静音True为静音,FALSE为取消静音
BOOL CPlayer::SetAudio(bool AudioOff)
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
MCI_SET_PARMS setAudio;
setAudio.dwCallback = (DWORD)&(m_hWnd);
setAudio.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
setAudio.dwAudio = MCI_SET_AUDIO_ALL;
DWORD dwFlags = MCI_SET_AUDIO;
if (AudioOff)
dwFlags |= MCI_SET_ON;
else
dwFlags |= MCI_SET_OFF;
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SET, dwFlags, (DWORD) &(setAudio)));
#else
if (AudioOff)
return !(m_dwError = mciSendString(_T("setaudio MusicAlias off"), nullptr, 0, m_hWnd));
else
return !(m_dwError = mciSendString(_T("setaudio MusicAlias on"), nullptr, 0, m_hWnd));
#endif
}
/// 设置播放速度1-100,百分比
BOOL CPlayer::SetSpeed(DWORD Speed)
{
DebugLog(__func__);
#ifdef _USER_MCI_COMMAND
MCI_DGV_SET_PARMS setSpeed;
setSpeed.dwCallback = (DWORD)&(m_hWnd);
//setSpeed.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
//setSpeed.dwAudio = MCI_SET_AUDIO_ALL;
//setSpeed.dwFileFormat = 0;
setSpeed.dwSpeed = Speed * 10;/// 设置播放速度1-2000,1000为正常速度
DWORD dwFlags = MCI_DGV_SET_SPEED;
return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_SET, dwFlags, (DWORD) &(setSpeed)));
#else
TCHAR lpstrCommand[32] = {};
_stprintf_s(lpstrCommand, _T("set MusicAlias speed %ld"), Speed);
return !(m_dwError = mciSendString(lpstrCommand, nullptr, 0, m_hWnd));
#endif
}
/// 获得错误描述
BOOL CPlayer::GetError(LPTSTR pszText, UINT cchText)
{
return mciGetErrorString(m_dwError, pszText, cchText);
}
//from https://blog.csdn.net/u010682281/article/details/66473313
//↑ 请支持作者!
#endif