⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwmci.cpp

📁 RS232
💻 CPP
字号:
// HwMCI.cpp: implementation of the CHwMCI class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "sdsd.h"
#include "HwMCI.h"

// 为 MCI 函数添加库文件
#include <mmsystem.h>
#pragma comment ( lib, "winmm.lib" )

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHwMCI::CHwMCI()
	: m_wDeviceID ( NULL )
{
	memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) );
}

CHwMCI::~CHwMCI()
{
	Close ();
}

MCIERROR CHwMCI::hwMciSendCommand(
		MCIDEVICEID IDDevice, 
		UINT uMsg,             
		DWORD fdwCommand,      
		DWORD dwParam
	)
{
	MCIERROR mciError = ::mciSendCommand ( IDDevice, uMsg, fdwCommand, dwParam );
	if ( mciError != 0 )
	{
		memset ( m_szErrorStr, 0, sizeof(m_szErrorStr) );
		mciGetErrorString ( mciError, m_szErrorStr, sizeof(m_szErrorStr) );
#ifdef _DEBUG
		AfxMessageBox ( m_szErrorStr );
#endif
	}

	return mciError;
}

BOOL CHwMCI::Open(LPCTSTR lpszWaveFileName/*=NULL*/)
{
	MCI_OPEN_PARMS OpenParms = {0};
	OpenParms.lpstrDeviceType = (LPCSTR)(lpszWaveFileName?NULL:MCI_DEVTYPE_WAVEFORM_AUDIO);
	OpenParms.lpstrElementName = (LPCSTR)(lpszWaveFileName?lpszWaveFileName:"");	// 打开的声音文件名
	m_wDeviceID = NULL;	// 打开的音频设备的ID
	if ( hwMciSendCommand ( NULL,
		MCI_OPEN,
		( lpszWaveFileName?0:(MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID) ) | MCI_WAIT | MCI_OPEN_ELEMENT,
		(DWORD)(LPVOID) &OpenParms ) != 0 )
		return FALSE;

	m_wDeviceID = OpenParms.wDeviceID;
	return TRUE;
}

void CHwMCI::Close()
{
	if ( m_wDeviceID != NULL )
	{
		hwMciSendCommand ( m_wDeviceID, MCI_CLOSE, NULL, NULL );
	}
	m_wDeviceID = NULL;	// 打开的音频设备的ID

}

BOOL CHwMCI::Play(DWORD dwFrom/*=0*/, DWORD dwTo/*=0*/)
{
	Stop ();
	// 播放wave文件
	MCI_PLAY_PARMS PlayParms = {0};
	PlayParms.dwFrom = dwFrom;		// 这是为了指定从什么地方(时间)播放WAVE文件
	PlayParms.dwTo = dwTo;
	if ( hwMciSendCommand ( m_wDeviceID, MCI_PLAY, MCI_FROM,
		(DWORD)(LPVOID)&PlayParms ) != 0)
		return FALSE;
	return TRUE;

}

BOOL CHwMCI::Stop()
{
	if ( m_wDeviceID == NULL ) return FALSE;

	return ( hwMciSendCommand ( m_wDeviceID, MCI_STOP, NULL, NULL ) == 0 );
}

BOOL CHwMCI::Pause()
{
	if ( m_wDeviceID == NULL ) return FALSE;

	return ( hwMciSendCommand ( m_wDeviceID, MCI_PAUSE, NULL, NULL ) == 0 );
}

BOOL CHwMCI::Save(CString Filename)
{
	Stop ();
	MCI_SAVE_PARMS SaveParms = {0};
	SaveParms.lpfilename = (LPCSTR) Filename;
	hwMciSendCommand ( m_wDeviceID, 
		MCI_SAVE, 
		MCI_SAVE_FILE | MCI_WAIT, 
		(DWORD)(LPVOID) &SaveParms);
	/*return ( hwMciSendCommand ( m_wDeviceID, 
		MCI_SAVE, 
		MCI_SAVE_FILE | MCI_WAIT, 
		(DWORD)(LPVOID) &SaveParms) == 0 );*/
	Close ();
	return 1;
}

LPSTR CHwMCI::GetErrorStr()
{
	return m_szErrorStr;
}

BOOL CHwMCI::Rec ( int nChannels,WORD nSamplesPerSec,int wBitsPerSample)
{
	if ( nChannels != 1 && nChannels != 2 )
		return FALSE;

	Close ();	// 为成功打开设备,录制前关闭一次设备
	if ( !Open () ) return FALSE;
	SetPara ( WAVE_FORMAT_PCM, nChannels, nSamplesPerSec, nSamplesPerSec*nChannels*wBitsPerSample/8, nChannels*wBitsPerSample/8, wBitsPerSample);

	MCI_RECORD_PARMS RecordParms = {0};
	return ( hwMciSendCommand ( m_wDeviceID, 
		MCI_RECORD, 
		NULL, 
		(DWORD)(LPVOID) &RecordParms) == 0 );
}

BOOL CHwMCI::DeviceIDValid()
{
	return ( m_wDeviceID != NULL );
}

//
// 设置参数
//
BOOL CHwMCI::SetPara (
		WORD        wFormatTag,			/* format type */
		WORD        nChannels,			/* 纪录声音的通道数 */
		DWORD       nSamplesPerSec,		/* 记录每秒取样数 */
		DWORD       nAvgBytesPerSec,	/* 记录每秒的数据量 */
		WORD        nBlockAlign,		/* 记录区块的对齐单位 */
		WORD        wBitsPerSample		/* 记录每个取样所需的位元数 */
	)
{
	if ( m_wDeviceID == NULL )
		return FALSE;

	MCI_WAVE_SET_PARMS  SetParms = {0};
	SetParms.wFormatTag = wFormatTag;
	SetParms.nChannels = nChannels;
	SetParms.nSamplesPerSec = nSamplesPerSec;
	SetParms.nAvgBytesPerSec = nAvgBytesPerSec;
	SetParms.nBlockAlign = nBlockAlign;
	SetParms.wBitsPerSample = wBitsPerSample;

	return ( hwMciSendCommand ( m_wDeviceID, MCI_SET, MCI_WAIT |
		MCI_WAVE_SET_FORMATTAG | MCI_WAVE_SET_CHANNELS | MCI_WAVE_SET_SAMPLESPERSEC | MCI_WAVE_SET_AVGBYTESPERSEC |
		MCI_WAVE_SET_BLOCKALIGN | MCI_WAVE_SET_BITSPERSAMPLE,
		(DWORD)(LPVOID) &SetParms ) == 0 );

}

//u 最大录音时长的处理,超过这个时间,应该自动将文件保存

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -