C++ 版 mciSendString 的使用例子(完整类)

5 篇文章 0 订阅

#pragma once
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)
{
	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;
	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
		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)
{
	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) (LPVOID) &mciplayparms));
	return FALSE;
#else
	return !(m_dwError = mciSendString(_T("Play MusicAlias"), nullptr, 0, m_hWnd));
#endif
}

/// 执行MCI_CLOSE操作,关闭MCI设备  
BOOL CPlayer::Close()
{
#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()
{
#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()
{
#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()
{
#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) (LPVOID) &mciplayparms));
	return FALSE;
#else
	return !(m_dwError = mciSendString(_T("Play MusicAlias"), nullptr, 0, m_hWnd));
#endif
}

/// 得到文件大小  
DWORD CPlayer::GetLength()
{
#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()
{
#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)
{
	m_hWnd = hWnd;
}

/// 设置音量 0-100,百分比
BOOL CPlayer::SetVolume(DWORD dSize)
{
#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) (LPVOID) &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)
{
	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)
{
#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)
{
#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);
}

需要注意的地方是,关闭或者切换歌曲时,要 先调用 Stop(); 再调用 Close();然后 调用 Play();

链接:

文件分享

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值