www.pudn.com > renju_src.rar > Midi.cpp


// Midi.cpp: implementation of the CMidi class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Renju.h" 
#include "Midi.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
////////////////////////////////////////////////////////////////////// 
 
CMidi::CMidi() 
{ 
	m_bOpened=FALSE; 
	m_bPaused=FALSE; 
	m_bPlaying=FALSE; 
	m_wDeviceID=0; 
} 
 
CMidi::~CMidi() 
{ 
	Close(); 
} 
 
WORD CMidi::GetDevicID() 
{ 
	return  m_wDeviceID; 
} 
 
BOOL CMidi::Open(CString strFileName) 
{ 
	if(m_bOpened) 
		Close(); 
 
	m_bOpened = m_bPaused = m_bPlaying = FALSE; 
	m_wDeviceID = 0; 
	 
	CFileStatus Status; 
	if(!CFile::GetStatus(strFileName, Status)) 
		return FALSE; 
	 
	MCI_OPEN_PARMS OpenParams; 
	OpenParams.dwCallback = FALSE; 
	OpenParams.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER; 
	OpenParams.wDeviceID = 0; 
	OpenParams.lpstrElementName = (LPCSTR)strFileName; 
 
	if(mciSendCommand(NULL, MCI_OPEN,  
					MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT, 
					(DWORD)&OpenParams)) 
		return FALSE; 
 
	m_wDeviceID=OpenParams.wDeviceID; 
	m_bOpened=TRUE; 
	 
	MCI_SET_PARMS SetParams; 
	SetParams.dwTimeFormat = MCI_FORMAT_MILLISECONDS; 
	if(mciSendCommand(m_wDeviceID, MCI_SET, 
					MCI_SET_TIME_FORMAT, (DWORD)&SetParams)) 
	{ 
		Close(); 
		return FALSE; 
	} 
 
	mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL); 
	return TRUE; 
} 
 
void CMidi::Close() 
{ 
	if(m_bOpened) 
	{ 
		if(m_bPlaying || m_bPaused) 
			mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL); 
 
		mciSendCommand(m_wDeviceID, MCI_CLOSE, NULL, NULL); 
		m_bOpened = m_bPaused = m_bPlaying = FALSE; 
		m_wDeviceID = 0; 
	} 
} 
 
BOOL CMidi::Play() 
{ 
	if(m_bOpened) 
	{ 
		SeekTo(0, 0); 
		MCI_PLAY_PARMS PlayParams; 
		PlayParams.dwCallback = NULL; 
		PlayParams.dwFrom = 0; 
		//PlayParams.dwFrom=((GetCurrentMin()*60)+GetCurrentSec())*1000; 
 
		if(mciSendCommand(m_wDeviceID, MCI_PLAY, (MCI_FROM), (DWORD)&PlayParams) != 0) 
			return FALSE; 
 
		m_bPaused=FALSE; 
		m_bPlaying=TRUE; 
		return TRUE; 
	} 
	return FALSE; 
} 
 
void CMidi::Stop() 
{ 
	if(m_bOpened && m_bPlaying) 
	{ 
		mciSendCommand(m_wDeviceID, MCI_STOP, NULL, NULL); 
		mciSendCommand(m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL); 
		m_bPlaying = FALSE; 
		m_bPaused = FALSE; 
	} 
} 
		 
int CMidi::GetCurrentMin() 
{ 
	if(m_bOpened) 
	{ 
		MCI_STATUS_PARMS StatusParams; 
		StatusParams.dwItem = MCI_STATUS_POSITION; 
		if(mciSendCommand(m_wDeviceID, MCI_STATUS,  
						MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams)) 
			return -1; 
 
		return (int)((StatusParams.dwReturn / 1000) / 60); 
	} 
	return -1; 
} 
 
int CMidi::GetCurrentSec() 
{ 
	if(m_bOpened) 
	{ 
		MCI_STATUS_PARMS StatusParams; 
		StatusParams.dwItem = MCI_STATUS_POSITION; 
		if(mciSendCommand(m_wDeviceID, MCI_STATUS, 
						MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams)) 
			return -1; 
 
		return (int)(StatusParams.dwReturn / 1000 - (StatusParams.dwReturn / 1000) / 60); 
	} 
	return -1; 
} 
 
BOOL CMidi::IsPlaying() 
{ 
	return m_bPlaying; 
} 
 
BOOL CMidi::SeekTo(int nMinute,int nSeconds) 
{ 
	if(m_bOpened) 
	{ 
		MCI_SEEK_PARMS SeekParams; 
		SeekParams.dwTo = (nMinute * 60 + nSeconds) * 1000; 
		if(m_bPlaying && m_bPaused) 
		{ 
			mciSendCommand(m_wDeviceID, MCI_PAUSE, NULL, NULL); 
			if(mciSendCommand(m_wDeviceID, MCI_SEEK, 
							MCI_TO | MCI_WAIT, (DWORD)&SeekParams)) 
				return FALSE; 
		} 
		if(m_bPlaying && !m_bPaused) 
			Play(); 
 
		return TRUE; 
	} 
	return FALSE; 
} 
 
void CMidi::Forward(int nSeconds) 
{ 
	if(m_bOpened) 
	{ 
		MCI_STATUS_PARMS StatusParams; 
		DWORD dwPos; 
		StatusParams.dwItem = MCI_STATUS_POSITION; 
		 
		mciSendCommand(m_wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&StatusParams); 
		dwPos = StatusParams.dwReturn ; 
		dwPos += nSeconds*1000; 
		MCI_SEEK_PARMS SeekParams; 
		SeekParams.dwTo = dwPos; 
		if(m_bPlaying && m_bPaused) 
		{ 
			mciSendCommand(m_wDeviceID, MCI_PAUSE, NULL, NULL); 
			mciSendCommand(m_wDeviceID, MCI_SEEK, 
						MCI_TO | MCI_WAIT, (DWORD)&StatusParams); 
		} 
		if(m_bPlaying && !m_bPaused) 
			Play(); 
	} 
} 
 
void CMidi::Backward(int nSeconds) 
{ 
	if(m_bOpened) 
	{ 
		MCI_STATUS_PARMS StatusParams; 
		DWORD dwPos; 
		StatusParams.dwItem = MCI_STATUS_POSITION; 
		 
		mciSendCommand(m_wDeviceID, MCI_STATUS, 
					MCI_STATUS_ITEM, (DWORD)&StatusParams); 
		dwPos = StatusParams.dwReturn ; 
		dwPos -= nSeconds * 1000; 
		MCI_SEEK_PARMS SeekParams; 
		SeekParams.dwTo = dwPos; 
		if(m_bPlaying && m_bPaused) 
		{ 
			mciSendCommand(m_wDeviceID, MCI_PAUSE, NULL, NULL); 
			mciSendCommand(m_wDeviceID, MCI_SEEK, 
						MCI_TO | MCI_WAIT, (DWORD)&SeekParams); 
		} 
		if(m_bPlaying && !m_bPaused) 
			Play(); 
	} 
} 
 
int CMidi::GetTempo(int) 
{ 
	if(m_bOpened) 
	{ 
		MCI_STATUS_PARMS StatusParams; 
		StatusParams.dwItem = MCI_SEQ_STATUS_TEMPO; 
		if(mciSendCommand(m_wDeviceID, MCI_STATUS, 
						MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams)) 
		return -1; 
		return (int)StatusParams.dwReturn; 
	} 
	return -1; 
} 
 
int CMidi::GetMidiLen() 
{ 
	if(m_bOpened) 
	{ 
		MCI_STATUS_PARMS StatusParams; 
		StatusParams.dwItem = MCI_STATUS_LENGTH; 
		if(mciSendCommand(m_wDeviceID, MCI_STATUS, 
						MCI_WAIT | MCI_STATUS_ITEM, (DWORD)&StatusParams)) 
			return -1; 
 
		return (int)StatusParams.dwReturn; 
	} 
	return -1; 
}