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

📄 gamemp3.cpp

📁 一个类似坦克大战的小小游戏
💻 CPP
字号:

#include "GameMp3.h"
#include "GlobalDefs.h"
#include <iostream>
using namespace std;
#include <commdlg.h>



CGameMp3::CGameMp3(void)
{
	CoInitialize(NULL);		// Initializes the COM library 
	m_pGraph = NULL;
	m_pMediaControl = NULL;
	m_pMediaPosition = NULL;
	m_pEvent = NULL;
}

CGameMp3::~CGameMp3(void)
{
	Release();
	CoUninitialize();		// Closes the COM library 
}

// Init and release /////////////////////////////////////////////////////

BOOL CGameMp3::Init(HWND hWnd)
{
	BOOL bRtn = TRUE;
	if (NULL == m_pGraph)
	{
		if (SUCCEEDED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
			IID_IGraphBuilder, (void **)&m_pGraph)))
		{
			// Create IMediaControl interface
			if (NULL == m_pMediaControl)
			{
				bRtn = SUCCEEDED(m_pGraph->QueryInterface(IID_IMediaControl, 
												(void **)&m_pMediaControl));
			}
			if (NULL == m_pMediaPosition)
			{
				bRtn = SUCCEEDED(m_pGraph->QueryInterface(IID_IMediaPosition,
												(void **)&m_pMediaPosition));
			}
			if (NULL == m_pEvent)
			{
				bRtn = SUCCEEDED(m_pGraph->QueryInterface(IID_IMediaEventEx, 
														(void **)&m_pEvent));
				if (bRtn)
				{
					m_pEvent->SetNotifyWindow((OAHWND)hWnd, WM_GRAPHNOTIFY, 0);
				}
			}
		}
		else
		{
			return FALSE;
		}
	}
	
	return bRtn;
}

void CGameMp3::Release()
{
	if (NULL != m_pMediaControl)
	{
		if (IsPlaying())
		{
			m_pMediaControl->Stop();
		}
		SAFE_RELEASE(m_pMediaControl);
	}

	if (NULL != m_pMediaPosition)
	{
		SAFE_RELEASE(m_pMediaPosition);
	}

	if (NULL != m_pGraph)
	{
		SAFE_RELEASE(m_pGraph);
	}

	if (NULL != m_pEvent)
	{
		SAFE_RELEASE(m_pEvent);
	}
}

// Get IMediaEvent ///////////////////////////////////////////////////

IMediaEventEx * CGameMp3::GetEvnetInterface()
{
	return m_pEvent;
}

// Load mp3 file ///////////////////////////////////////////////////////

BOOL CGameMp3::LoadMp3File(HWND hWnd)
{
	OPENFILENAME ofn;       // Common dialog box structure   
	char szFile[255];       // Buffer for file name   
//	HANDLE hFile;           // The handle of file 
	
	// Initialize OPENFILENAME   
	ZeroMemory(&ofn, sizeof(ofn));   
	ofn.lStructSize = sizeof(ofn);   
	ofn.hwndOwner = NULL;   
	ofn.lpstrFile = szFile;   
	  
	// Set lpstrFile[0] to '\0' so that GetOpenFileName does not     
	// use the contents of szFile to initialize itself.   
	ofn.lpstrFile[0] = '\0';   
	ofn.nMaxFile = sizeof(szFile);   
	ofn.lpstrFilter = "(*.mp3)(*.wma)\0*.mp3;*.wma\0";   
	ofn.nFilterIndex = 1;   
	ofn.lpstrFileTitle = NULL;   
	ofn.nMaxFileTitle = 0;   
	ofn.lpstrInitialDir = NULL;   
	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;   
	
	// Display the Open dialog box.     
	if (GetOpenFileName(&ofn))   
	{   
		Release();		// Destory the oldder Graph
		if(Init(hWnd))	// Create a new Graph
		{
			WCHAR szFileName[255];
			MultiByteToWideChar(CP_ACP, 0, ofn.lpstrFile, -1, szFileName, 255);
			if (SUCCEEDED(m_pGraph->RenderFile(szFileName, NULL)))
			{
				return TRUE;
			}
		}
	}
	return FALSE;
}

// Load default /////////////////////////////////////////////////

BOOL CGameMp3::LoadDefaultMusic()
{
	if (m_pGraph && m_pMediaControl)
	{
		char sFileName[255] = ".\\sound\\background.mp3";
		WCHAR wsFileName[255];

		// Convert the path to unicode
		MultiByteToWideChar(CP_ACP, 0, sFileName, -1, wsFileName, 255);
		if (SUCCEEDED(m_pGraph->RenderFile(wsFileName, NULL)))
		{
			return TRUE;
		}
		MessageBox(NULL, "Cannot Load background.mp3", "ERROR!", MB_OK);
	}
	return FALSE;
}

// Media status //////////////////////////////////////////////////

BOOL CGameMp3::IsPlaying()
{
	if (m_pGraph && m_pMediaControl)
	{
		OAFilterState state = State_Stopped;
		if (SUCCEEDED(m_pMediaControl->GetState(10, &state)))
		{
			return (State_Running == state);
		}
	}
	return FALSE;
	
}

BOOL CGameMp3::IsPaused()
{
	if (m_pGraph && m_pMediaControl)
	{
		OAFilterState state = State_Stopped;
		if (SUCCEEDED(m_pMediaControl->GetState(10, &state)))
		{
			return (State_Paused == state);
		}
	}
	return FALSE;
}

BOOL CGameMp3::IsStopped()
{
	if (m_pGraph && m_pMediaControl)
	{
		OAFilterState state = State_Stopped;
		if (SUCCEEDED(m_pMediaControl->GetState(10, &state)))
		{
			return (State_Stopped == state);
		}
	}
	return FALSE;
}


// Media control //////////////////////////////////////////////////////

BOOL CGameMp3::Play()
{
	if (m_pGraph && m_pMediaControl)
	{	
		if (!IsPlaying())
		{
			// Make sure that we are at the start of the stream
			m_pMediaPosition->put_CurrentPosition(0);
			if (SUCCEEDED(m_pMediaControl->Run()))
			{
				return TRUE;
			}
		}
		else
		{
			return TRUE;
		}
	}
	return FALSE;
}

BOOL CGameMp3::Pause()
{
	if (m_pGraph && m_pMediaControl)
	{
		if (!IsPaused())
		{
			if (SUCCEEDED(m_pMediaControl->Pause()))
			{
				return TRUE;
			}
		}
		else
		{
			return TRUE;
		}
	}
	return FALSE;
}

BOOL CGameMp3::Stop()
{
	if (m_pGraph && m_pMediaControl)
	{
		if (!IsStopped())
		{
			if (SUCCEEDED(m_pMediaControl->Stop()))
			{
				return TRUE;
			}
		}
		else
		{
			return TRUE;
		}
	}
	return FALSE;
}

⌨️ 快捷键说明

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