Skip to main content
GameDev.net gamedev.net
🔒 Locked

sound code

Started by Raxvan Sep 19, 2005 at 9:39 AM 3 replies 600+ views
Original Post
Raxvan
Raxvan
[source lag="CPP"]
// Sound.cpp: implementation of the CSound class.
//
//////////////////////////////////////////////////////////////////////

#include "Sound.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSound::CSound()
{	
	m_pDirectAudioPerformance = NULL;
	m_pDirectAudioLoader = NULL;
	m_pSegment = NULL;
	m_pGraph = NULL;
	m_pMediaControl = NULL;
	m_pMediaPosition = NULL;
	m_enumFormat = Unknown;
	loaded=false;
	LogInfo("<li>Sound created OK");

 }

void CSound::InitialiseForWavMidi(IDirectMusicPerformance8* pDirectAudioPerformance, IDirectMusicLoader8* pDirectAudioLoader)
{

	m_pDirectAudioPerformance = pDirectAudioPerformance;
	m_pDirectAudioLoader = pDirectAudioLoader;

	m_enumFormat = WavMidi;

	
}

void CSound::InitialiseForMP3()
{
	CoCreateInstance(CLSID_FilterGraph, NULL,
                     CLSCTX_INPROC, IID_IGraphBuilder, (void**)&m_pGraph);

	m_pGraph->QueryInterface(IID_IMediaControl, (void**)&m_pMediaControl);

	m_pGraph->QueryInterface(IID_IMediaPosition, (void**)&m_pMediaPosition);

	m_enumFormat = MP3;
}


CSound::~CSound()
{
	Stop();

	SafeRelease(m_pSegment);
	SafeRelease(m_pGraph);
	SafeRelease(m_pMediaControl);
	SafeRelease(m_pMediaPosition);

	LogInfo("<li>Sound destroyed OK");
}

bool CSound::LoadSound(const char* szSoundFileName)
{
	WCHAR wstrSoundPath[MAX_PATH];
	CHAR strSoundPath[MAX_PATH];
	
	switch(m_enumFormat)
	{
		case MP3:
			//Get the our applications "sounds" directory.
			if(loaded==true)
			{
			m_pGraph->Abort();
			}
			GetCurrentDirectory(MAX_PATH, strSoundPath);
			strcat(strSoundPath, "\\Sounds\\");
			strcat(strSoundPath, szSoundFileName);

			//Convert the path to unicode.
			MultiByteToWideChar(CP_ACP, 0, strSoundPath, -1, wstrSoundPath, MAX_PATH);

			m_pGraph->RenderFile(wstrSoundPath, NULL);
		break;
		case WavMidi:
			//Convert the filename to unicode.	
			MultiByteToWideChar(CP_ACP, 0, szSoundFileName, -1, wstrSoundPath, MAX_PATH);

			//Load a sound
			m_pDirectAudioLoader->LoadObjectFromFile(CLSID_DirectMusicSegment, IID_IDirectMusicSegment8,
													 wstrSoundPath, (void**) &m_pSegment);

			m_pSegment->Download(m_pDirectAudioPerformance);
		break;
		default:
			return false;
	}
	loaded=true;
	return true;
}

bool CSound::Play(DWORD dwNumOfRepeats)
{

	switch(m_enumFormat)
	{
		case MP3:
			//Make sure that we are at the start of the stream
			m_pMediaPosition->put_CurrentPosition(0);
			
			//Play mp3
			m_pMediaControl->Run();
		break;
		case WavMidi:
			//Set the number of times the sound repeats
			m_pSegment->SetRepeats(dwNumOfRepeats);		//To loop the sound forever, pass in DMUS_SEG_REPEAT_INFINITE

			//Play the loaded sound
			m_pDirectAudioPerformance->PlaySegmentEx(m_pSegment, NULL, NULL, 0, 0, NULL, NULL, NULL);
		break;
		default:
			return false;
	}

	return true;
}

bool CSound::Stop()
{
	switch(m_enumFormat)
	{
		case MP3:
			m_pMediaControl->Stop();
		break;
		case WavMidi:
			//Stop the loaded sound
			m_pDirectAudioPerformance->StopEx(m_pSegment, 0, 0);
		break;
		default:
			return false;
	}

	return true;
}

bool CSound::IsPlaying()
{
	switch(m_enumFormat)
	{
		case MP3:
			REFTIME refPosition;
			REFTIME refDuration;

			m_pMediaPosition->get_CurrentPosition(&refPosition);
			m_pMediaPosition->get_Duration(&refDuration);
			
			if(refPosition < refDuration)
			{
				return true;
			}
			else
			{
				return false;
			}
		break;
		case WavMidi:
			if(m_pDirectAudioPerformance->IsPlaying(m_pSegment, NULL) == S_OK)
			{
				return true;
			}
			else
			{
				return false;
			}
		break;
		default:
			return false;
	}
return true;}


is there someting wrong in my code...... becaude it is not working tnx
Dave Hunt
Dave Hunt
You're not checking the return values from any of the DirectMusic functions. It is possible that one of them is failing. If you check the HRESULT from each function, it might tell you what is going wrong.
Raxvan
Raxvan
it appears there is nothing wrong with all the loadings and all the functions
Raxvan
Raxvan
or not
the:
m_pGraph->QueryInterface(IID_IMediaControl, (void**)&m_pMediaControl)
m_pGraph->QueryInterface(IID_IMediaPosition, (void**)&m_pMediaPosition)
lines are not working
i don't understand, before this code was working
Dave Hunt
Dave Hunt
Did the CoCreateInstance succeed? If not, did you call CoInitialize?

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.