📄 gamemp3.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 + -