123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- #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;
- }
|