1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/BeefySysLib/platform/win/DSoundInstance.cpp

178 lines
3.4 KiB
C++
Raw Normal View History

#include "DSoundInstance.h"
#include "DSoundManager.h"
using namespace Beefy;
DSoundInstance::DSoundInstance(DSoundManager* theSoundManager, LPDIRECTSOUNDBUFFER theSourceSound)
{
mSoundManagerP = theSoundManager;
mReleased = false;
mAutoRelease = false;
mHasPlayed = false;
mSourceSoundBuffer = theSourceSound;
mSoundBuffer = NULL;
mBaseVolume = 1.0;
mBasePan = 0;
mVolume = 1.0;
mPan = 0;
mDefaultFrequency = 44100;
HRESULT hr;
if (mSourceSoundBuffer != NULL)
{
hr=mSoundManagerP->mDirectSound->DuplicateSoundBuffer(mSourceSoundBuffer, &mSoundBuffer);
if (hr!=DS_OK)
{
switch (hr)
{
case DSERR_ALLOCATED: MessageBoxA(0,"DSERR_ALLOCATED","Hey",MB_OK);break;
case DSERR_INVALIDCALL: MessageBoxA(0,"DSERR_INVALIDCALL","Hey",MB_OK);break;
case DSERR_INVALIDPARAM: MessageBoxA(0,"DSERR_INVALIDPARAM","Hey",MB_OK);break;
case DSERR_OUTOFMEMORY: MessageBoxA(0,"DSERR_OUTOFMEMORY","Hey",MB_OK);break;
case DSERR_UNINITIALIZED: MessageBoxA(0,"DSERR_UNINITIALIZED","Hey",MB_OK);break;
}
exit(0);
}
mSoundBuffer->GetFrequency(&mDefaultFrequency);
}
RehupVolume();
}
DSoundInstance::~DSoundInstance()
{
if (mSoundBuffer != NULL)
mSoundBuffer->Release();
}
void DSoundInstance::RehupVolume()
{
if (mSoundBuffer != NULL)
mSoundBuffer->SetVolume(mSoundManagerP->VolumeToDB(mBaseVolume * mVolume * mSoundManagerP->mMasterVolume));
}
void DSoundInstance::RehupPan()
{
if (mSoundBuffer != NULL)
mSoundBuffer->SetPan(mBasePan + mPan);
}
void DSoundInstance::Release()
{
Stop();
mReleased = true;
}
void DSoundInstance::SetVolume(float theVolume) // 0 = max
{
mVolume = theVolume;
RehupVolume();
}
void DSoundInstance::SetPan(int thePosition) //-db to =db = left to right
{
mPan = thePosition;
RehupPan();
}
void DSoundInstance::SetBaseVolume(float theBaseVolume)
{
mBaseVolume = theBaseVolume;
RehupVolume();
}
void DSoundInstance::SetBasePan(int theBasePan)
{
mBasePan = theBasePan;
RehupPan();
}
bool DSoundInstance::Play(bool looping, bool autoRelease)
{
Stop();
mHasPlayed = true;
mAutoRelease = autoRelease;
if (mSoundBuffer == NULL)
{
return false;
}
if (looping)
{
if (mSoundBuffer->Play(0, 0, DSBPLAY_LOOPING) != DS_OK)
return false;
}
else
{
if (mSoundBuffer->Play(0, 0, 0) != DS_OK)
{
return false;
}
}
return true;
}
void DSoundInstance::Stop()
{
if (mSoundBuffer != NULL)
{
mSoundBuffer->Stop();
mSoundBuffer->SetCurrentPosition(0);
mAutoRelease = false;
}
}
//#include "DirectXErrorString.h"
void DSoundInstance::AdjustPitch(float theNumSteps)
{
if (mSoundBuffer != NULL)
{
float aFrequencyMult = powf(1.0594630943592952645618252949463f, theNumSteps);
float aNewFrequency = mDefaultFrequency*aFrequencyMult;
if (aNewFrequency < DSBFREQUENCY_MIN)
aNewFrequency = DSBFREQUENCY_MIN;
if (aNewFrequency > DSBFREQUENCY_MAX)
aNewFrequency = DSBFREQUENCY_MAX;
mSoundBuffer->SetFrequency((DWORD)aNewFrequency);
}
}
bool DSoundInstance::IsPlaying()
{
if (!mHasPlayed)
return false;
if (mSoundBuffer == NULL)
return false;
DWORD aStatus;
if (mSoundBuffer->GetStatus(&aStatus) == DS_OK)
// Has the sound stopped?
return ((aStatus & DSBSTATUS_PLAYING) != 0);
else
return false;
}
bool DSoundInstance::IsReleased()
{
if ((!mReleased) && (mAutoRelease) && (mHasPlayed) && (!IsPlaying()))
Release();
return mReleased;
}
float DSoundInstance::GetVolume()
{
return mVolume;
}