www.pudn.com > tetris.zip > SOUND.CPP


// Sound.cpp: implementation of the CSound class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Tetris.h" 
#include "Sound.h" 
#include  
 
 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
 
HINSTANCE CSound :: m_hLib; 
CSound::SoundFnc CSound::m_fncSoundPlayer; 
BOOL	CSound :: m_bHaveSound = InitSound(); 
BOOL	CSound :: m_bWantSound = TRUE; 
 
 
CSound::CSound() 
{ 
	VERIFY(m_hApplication = ::GetModuleHandle(0)); 
 
	HRSRC hResInfo = ::FindResource(m_hApplication, MAKEINTRESOURCE(IDR_MidiRussians), "MIDI"); 
	ASSERT(hResInfo != 0); 
 
	HGLOBAL hRes = ::LoadResource(m_hApplication, hResInfo); 
	ASSERT(hRes != 0); 
 
	void * pSound = ::LockResource(hRes); 
	ASSERT(pSound == hRes); 
 
	DWORD dwSize = ::SizeofResource(m_hApplication, hResInfo); 
	TRACE("Size of MIDI sound: %lu\n", dwSize); 
 
	LPCTSTR pszFile = _ttempnam(0, 0); 
	if( pszFile ) { 
		CString strFile = pszFile; 
		strFile += TEXT(".mid"); 
		free(LPVOID(pszFile)); 
		if( _taccess(LPCTSTR(strFile), 0) != 0 ) { 
			TRACE("Tempfile to use: \"%s\"\n", LPCTSTR(strFile)); 
			try { 
				CFile file(strFile, CFile::modeCreate|CFile::modeWrite); 
				file.Write(pSound, UINT(dwSize)); 
				file.Close(); 
				CString strOpen; 
				strOpen.Format(TEXT("open %s alias tetris"), strFile); 
				if( m_hLib ) { 
					MusicFnc fncMusicPlayer = MusicFnc(::GetProcAddress(m_hLib, TEXT("mciSendStringA"))); 
					if( fncMusicPlayer ) { 
						VERIFY((*fncMusicPlayer)(strOpen, 0, 0, 0) == 0); 
						VERIFY((*fncMusicPlayer)(TEXT("play tetris"), 0, 0, 0) == 0); 
					} 
				} 
			} catch(...) { 
			} 
		} 
	} 
} 
 
 
CSound::~CSound() 
{ 
	StopSounds(); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// Operations 
////////////////////////////////////////////////////////////////////// 
 
void CSound :: PlaySound( CSound::SoundType eType, BOOL bAsync /* = FALSE */, BOOL bLoop /* = FALSE */ ) { 
	if( m_bHaveSound && m_bWantSound ) { 
		ASSERT(m_hApplication); 
		ASSERT(m_fncSoundPlayer); 
 
		UINT uResource = 0; 
 
		switch( eType ) { 
			case SND_STOPALLSOUNDS: 
				(*m_fncSoundPlayer)(0, 0, SND_PURGE); 
				return; 
 
			case SND_KEYPRESSED: 
				uResource = IDR_SndKey; 
				break; 
 
			case SND_PLACE: 
				uResource = IDR_SndPlace; 
				break; 
 
			case SND_LEVELWARP: 
				uResource = IDR_SndLevelWarp; 
				break; 
 
			case SND_GAMEOVER: 
				uResource = IDR_SndGameOver; 
				break; 
		} 
 
		// wrong sound specified ? 
		ASSERT(uResource > 0); 
 
		DWORD dwFlags = SND_NODEFAULT|SND_NOSTOP|SND_NOWAIT|SND_RESOURCE; 
		if( bAsync ) 
			dwFlags |= SND_ASYNC; 
		else 
			dwFlags |= SND_SYNC; 
		if( bLoop ) 
			dwFlags |= SND_LOOP; 
 
		(*m_fncSoundPlayer)(MAKEINTRESOURCE(uResource), m_hApplication, dwFlags); 
	} 
} 
 
 
BOOL CSound::InitSound() 
{ 
	m_hLib = ::LoadLibrary(TEXT("winmm.dll")); 
	if( m_hLib ) { 
		m_fncSoundPlayer = SoundFnc(::GetProcAddress(m_hLib, TEXT("PlaySound"))); 
		if( m_fncSoundPlayer ) 
			return TRUE; 
	} 
	return FALSE; 
}