📄 audio.cpp
字号:
#include "StdAfx.h"
#include "audio.h"
#pragma comment(lib , "Strmiids.lib" )
CAudio::CAudio(void)
{
m_pLoader = NULL;
m_pPerformance = NULL;
m_pSegment = NULL;
m_p3DAudioPath = NULL;
m_pDSB = NULL;
m_pListener = NULL;
m_dwType = MUSICTYPE_NORMAL;
m_bLoop = false;
m_dwRepeats = 1;
m_b3DSound = false;
}
CAudio::~CAudio(void)
{
Free();
}
bool CAudio::Load(LPCTSTR strFile,DWORD dwType,bool b3DSound)
{
//初始化com
CoInitialize(NULL);
m_dwType = dwType;
m_b3DSound = b3DSound;
WCHAR wstrFile[255];
MultiByteToWideChar(CP_ACP, 0, strFile, -1, wstrFile,255);
if(dwType == MUSICTYPE_NORMAL) //为WAV/MIDI
{
if(!LoadNormalAudio(wstrFile))
{
DebugMsg("调用普通音频文件失败\n");
return false;
}
}
else if(dwType == MUSICTYPE_MP3) //为MP3
{
if(!LoadMP3Audio(wstrFile))
{
DebugMsg("调用MP3音频文件失败\n");
return false;
}
}
return true;
}
bool CAudio::Play(void)
{
if(m_dwType == MUSICTYPE_NORMAL)
{
if(m_b3DSound)
{
if(FAILED(m_pPerformance->PlaySegmentEx(m_pSegment,NULL,NULL,DMUS_SEGF_SECONDARY,0,NULL,NULL,m_p3DAudioPath)))
{
DebugMsg("Play audio 3d file 失败\n");
return false;
}
}
else
{
if(FAILED(m_pPerformance->PlaySegmentEx(m_pSegment,NULL,NULL,0,0,NULL,NULL,NULL)))
{
DebugMsg("Play audio file 失败\n");
return false;
}
}
}
else if(m_dwType == MUSICTYPE_MP3)
{
if(FAILED(m_pMSeekMp3->SetPositions(0,AM_SEEKING_AbsolutePositioning,NULL,AM_SEEKING_NoPositioning)))
{
DebugMsg("Play mp3 file 失败\n");
return false;
}
}
return true;
}
void CAudio::SetRepeats(DWORD dwRepeats)
{
if(dwRepeats == MUSIC_LOOP) //音乐循环
{
m_pSegment->SetRepeats(DMUS_SEG_REPEAT_INFINITE );
m_bLoop = true;
}
else //循环次数
{
m_pSegment->SetRepeats(dwRepeats);
m_dwRepeats = dwRepeats;
m_bLoop = false;
}
}
void CAudio::SetPos(float fX, float fY, float fZ)
{
m_pDSB->SetPosition(fX,fY,fZ,DS3D_IMMEDIATE);
}
void CAudio::SetListenerPos(float fX, float fY, float fZ)
{
m_pListener->SetPosition(fX,fY,fZ,DS3D_IMMEDIATE);
}
void CAudio::SetVolume(long lVolume)
{
if(m_b3DSound) //是3d音乐
{
m_lVolume = lVolume;
m_p3DAudioPath->SetVolume(lVolume, 0);
}
if(m_dwType == MUSICTYPE_MP3) //是MP3格式
{
m_pBAudioMp3->put_Volume(lVolume); //0到–10,000
}
}
void CAudio::Stop(void)
{
if(m_dwType == MUSICTYPE_MP3)
{
if(FAILED(m_pMMStreamMp3->SetState(STREAMSTATE_STOP)))
{
DebugMsg("停止MP3音乐失败\n");
return;
}
}
else if(m_dwType == MUSICTYPE_NORMAL)
{
if(FAILED(m_pPerformance->Stop(NULL,NULL,0,0)))
{
DebugMsg("停止普通音乐失败\n");
return;
}
}
}
bool CAudio::Free(void)
{
if(m_dwType == MUSICTYPE_NORMAL)
{
m_pPerformance->Stop(NULL, NULL,0,0);
m_pPerformance->CloseDown();
SAFE_RELEASE(m_pDSB);
SAFE_RELEASE(m_pListener);
SAFE_RELEASE(m_p3DAudioPath);
SAFE_RELEASE(m_pLoader);
SAFE_RELEASE(m_pPerformance);
SAFE_RELEASE(m_pSegment);
}
else if(m_dwType == MUSICTYPE_MP3)
{
SAFE_RELEASE(m_pBAudioMp3);
SAFE_RELEASE(m_pMSeekMp3);
SAFE_RELEASE(m_pMMStreamMp3);
}
CoUninitialize();
return true;
}
bool CAudio::LoadNormalAudio(WCHAR* wstrFile)
{
if(FAILED(CoCreateInstance(CLSID_DirectMusicLoader,NULL,CLSCTX_INPROC,IID_IDirectMusicLoader8,(void**)&m_pLoader)))
{
DebugMsg("Loader创建失败\n");
return false;
}
if(FAILED(CoCreateInstance(CLSID_DirectMusicPerformance,NULL,CLSCTX_INPROC,IID_IDirectMusicPerformance8,(void**)&m_pPerformance)))
{
DebugMsg("Performance创建失败\n");
return false;
}
//3d开
if(m_b3DSound)
{
if(FAILED(m_pPerformance->InitAudio(NULL,NULL,NULL,DMUS_APATH_DYNAMIC_3D,64,DMUS_AUDIOF_ALL,NULL)))
{
DebugMsg("3d Performance InitAudio失败\n");
}
}
else
{
if(FAILED(m_pPerformance->InitAudio(NULL,NULL,NULL,DMUS_APATH_SHARED_STEREOPLUSREVERB,64,DMUS_AUDIOF_ALL,NULL)))
{
DebugMsg("Normal Performance InitAudio失败\n");
return false;
}
}
if(FAILED(m_pLoader->LoadObjectFromFile(CLSID_DirectMusicSegment,IID_IDirectMusicSegment8,wstrFile,(LPVOID*)&m_pSegment)))
{
DebugMsg("音乐文件调用失败\n");
return false;
}
m_pSegment->Download(m_pPerformance);
SetRepeats(m_dwRepeats);
//3d开
if(m_b3DSound)
{
if (FAILED(m_pPerformance->CreateStandardAudioPath( DMUS_APATH_DYNAMIC_3D,64, TRUE, &m_p3DAudioPath )))
{
DebugMsg("创建3d音效路径失败\n");
return false;
}
if (FAILED(m_p3DAudioPath->GetObjectInPath(DMUS_PCHANNEL_ALL,DMUS_PATH_BUFFER,0,GUID_NULL,0,IID_IDirectSound3DBuffer,(LPVOID*)&m_pDSB)))
{
DebugMsg("获取路径buffer失败\n");
return false;
}
// get the listener from the 3d audiopath
if (FAILED(m_p3DAudioPath->GetObjectInPath(0,DMUS_PATH_PRIMARY_BUFFER,0,GUID_All_Objects,0,IID_IDirectSound3DListener,(void**)&m_pListener)))
{
DebugMsg("获取listener失败\n");
return false;
}
}
return true;
}
bool CAudio::LoadMP3Audio(WCHAR* wstrFile)
{
IAMMultiMediaStream *pAMStream;
if( FAILED(CoCreateInstance(CLSID_AMMultiMediaStream,NULL,CLSCTX_INPROC_SERVER,IID_IAMMultiMediaStream,(void **)&pAMStream)))
{
DebugMsg("创建媒体流接口失败\n");
return false;
}
//初始化
pAMStream->Initialize(STREAMTYPE_READ,AMMSF_NOGRAPHTHREAD,NULL);
//添加媒体流
pAMStream->AddMediaStream(NULL,&MSPID_PrimaryAudio,AMMSF_ADDDEFAULTRENDERER,NULL);
//打开文件
if( S_OK != pAMStream->OpenFile(wstrFile,0))
{
DebugMsg("打开MP3文件失败\n");
pAMStream->Release();
return false;
}
m_pMMStreamMp3 = pAMStream;
//滤波
IGraphBuilder *pGB;
pAMStream->GetFilterGraph( &pGB );
pGB->QueryInterface(IID_IBasicAudio,(void **)&m_pBAudioMp3 );
pGB->QueryInterface(IID_IMediaSeeking,(void **)&m_pMSeekMp3 );
pGB->Release();
if( !m_pBAudioMp3 || !m_pMSeekMp3 )
{
DebugMsg("滤波失败\n");
return false;
}
m_pMMStreamMp3->SetState(STREAMSTATE_RUN);
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -