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

📄 audio.cpp

📁 冰人引擎,本2d游戏引擎定位于游戏次中层引擎。他不像CDX等引擎那样
💻 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 + -