热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

#define_USER_MCI_COMMANDmciSendCommand最新SDK不能设置音量,所以没有使用#pragmaonce

// #define _USER_MCI_COMMAND
// mciSendCommand 最新SDK不能设置音量,所以没有使用



#pragma once
class CPlayer
{
public:
	CPlayer();
	~CPlayer();
public:
	BOOL Open(LPCWSTR lpFileName);//打开文件  
	BOOL Play();//播放  
	BOOL Close();//关闭  
	BOOL Stop();//停止  
	BOOL Pause();//暂停  
	BOOL SetVolume(DWORD dSize);
	BOOL SetPos(DWORD dwPos);
	BOOL SetAudioOnOff(bool AudioOff);
	BOOL SetSpeed(DWORD Speed);
	DWORD GetLength(DWORD dwItem);//获取歌曲长度  
	BOOL GetError(LPTSTR pszText, UINT cchText);
	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"


CPlayer::CPlayer()
	: m_hWnd(nullptr) 
	, m_dwFrom(0)
	, m_dwError(0)
{
	ZeroMemory(&m_ciOpen,sizeof(MCI_OPEN_PARMS));
}


CPlayer::~CPlayer()
{
}

// 打开设备
BOOL CPlayer::Open(LPCTSTR lpFileName)
{	
#ifdef _USER_MCI_COMMAND
	if (m_ciOpen.wDeviceID)//如果有打开的MCI设备就关闭  
		Close();
	m_ciOpen.lpstrDeviceType = NULL;
	m_ciOpen.lpstrElementName = lpFileName;//播放文件路径
	m_ciOpen.lpstrAlias = _T("MusicAlias");
	if (mciSendCommand(0, MCI_OPEN, MCI_DEVTYPE_WAVEFORM_AUDIO, (DWORD)&m_ciOpen))//打开设备时,设备号为0
		return FALSE;
	m_dwFrom = MCI_MAKE_HMS(0, 0, 0);
	return TRUE;
#else
	TCHAR lpszShortPath[MAX_PATH] = { 0 };
	GetShortPathName(lpFileName, lpszShortPath,sizeof (lpszShortPath));// 获得短路经
	mciSendString(_T("Stop MusicAlias"), nullptr, 0, m_hWnd);
	CDuiString lpstrCommand = _T("");
	lpstrCommand.Format(_T("Open %s Alias MusicAlias"), lpszShortPath);// MusicAlias 是设备别名
	return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}

// 播放音乐  
BOOL CPlayer::Play()
{	
#ifdef _USER_MCI_COMMAND
	MCI_PLAY_PARMS mciplayparms;//播放参数结构  	
	DWORD cdlen = GetLength(MCI_STATUS_LENGTH);//得到文件大小  
	DWORD cdto = MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen), MCI_HMS_MINUTE(cdlen), MCI_HMS_SECOND(cdlen));//把文件中读出的大小转换为时间数量  
	mciplayparms.dwCallback = NULL;
	mciplayparms.dwFrom = m_dwFrom;//设置起始位置  
	mciplayparms.dwTo = cdto;//设置终止位置  
	if (m_ciOpen.wDeviceID != 0)//判断是否打开文件  
		return !(m_dwError = mciSendCommand(m_ciOpen.wDeviceID, MCI_PLAY, MCI_TO | MCI_FROM, (DWORD)(LPVOID)&mciplayparms));
#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));
#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 = MCI_MAKE_HMS(0, 0, 0);
#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 = GetLength(MCI_STATUS_POSITION);
		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));
	}
#else
	return !(m_dwError = mciSendString(_T("Pause MusicAlias"), nullptr, 0, m_hWnd));
#endif
}

// 得到当前文件状态  
DWORD CPlayer::GetLength(DWORD dwItem)
{
#ifdef _USER_MCI_COMMAND
	MCI_STATUS_PARMS mcistatusparms;
	mcistatusparms.dwCallback = (DWORD)m_hWnd;
	mcistatusparms.dwItem = dwItem;
	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;
	if(MCI_STATUS_LENGTH == dwItem)
		mciSendString(_T("Status MusicAlias length"), sPosition, 255, m_hWnd);
	else if(MCI_STATUS_POSITION == dwItem)
		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-1000
BOOL CPlayer::SetVolume(DWORD dSize)
{
#ifdef _USER_MCI_COMMAND
#else
	CDuiString lpstrCommand = _T("");
	lpstrCommand.Format(_T("setaudio MusicAlias volume to %ld"), dSize);
	return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}

// 设置进度 单位是毫秒 mm
BOOL CPlayer::SetPos(DWORD dwPos)
{
#ifdef _USER_MCI_COMMAND
#else
	CDuiString lpstrCommand;
	lpstrCommand.Format(_T("seek MusicAlias to %ld"), dwPos);
	return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}

// 静音True为静音,FALSE为取消静音
BOOL CPlayer::SetAudioOnOff(bool AudioOff)
{
#ifdef _USER_MCI_COMMAND
#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-2000
BOOL CPlayer::SetSpeed(DWORD Speed)
{
#ifdef _USER_MCI_COMMAND
#else
	CDuiString lpstrCommand;
	lpstrCommand.Format(_T("set MusicAlias speed %ld"), Speed);
	return !(m_dwError = mciSendString(lpstrCommand.GetData(), nullptr, 0, m_hWnd));
#endif
}

// 获得错误描述
BOOL CPlayer::GetError(LPTSTR pszText, UINT cchText)
{
	return mciGetErrorString(m_dwError, pszText, cchText);
}

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


推荐阅读
author-avatar
mobiledu2502913437
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有