Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
244 chris 1
#include "DSoundInstance.h"
2
#include "DSoundManager.h"
3
 
4
using namespace Sexy;
5
 
6
DSoundInstance::DSoundInstance(DSoundManager* theSoundManager, LPDIRECTSOUNDBUFFER theSourceSound)
7
{
8
        mSoundManagerP = theSoundManager;
9
        mReleased = false;
10
        mAutoRelease = false;
11
        mHasPlayed = false;
12
        mSourceSoundBuffer = theSourceSound;
13
        mSoundBuffer = NULL;
14
 
15
        mBaseVolume = 1.0;
16
        mBasePan = 0;
17
 
18
        mVolume = 1.0;
19
        mPan = 0;
20
 
21
        mDefaultFrequency = 44100;
22
 
23
        HRESULT hr;
24
 
25
        if (mSourceSoundBuffer != NULL)
26
        {
27
                hr=mSoundManagerP->mDirectSound->DuplicateSoundBuffer(mSourceSoundBuffer, &mSoundBuffer);
28
                if (hr!=DS_OK)
29
                {
30
                        switch (hr)
31
                        {
32
                        case DSERR_ALLOCATED: MessageBoxA(0,"DSERR_ALLOCATED","Hey",MB_OK);break;
33
                        case DSERR_INVALIDCALL: MessageBoxA(0,"DSERR_INVALIDCALL","Hey",MB_OK);break;
34
                        case DSERR_INVALIDPARAM: MessageBoxA(0,"DSERR_INVALIDPARAM","Hey",MB_OK);break;
35
                        case DSERR_OUTOFMEMORY: MessageBoxA(0,"DSERR_OUTOFMEMORY","Hey",MB_OK);break;
36
                        case DSERR_UNINITIALIZED: MessageBoxA(0,"DSERR_UNINITIALIZED","Hey",MB_OK);break;
37
                        }
38
                        exit(0);
39
                }
40
 
41
                mSoundBuffer->GetFrequency(&mDefaultFrequency);
42
        }
43
 
44
        RehupVolume();
45
}
46
 
47
DSoundInstance::~DSoundInstance()
48
{
49
        if (mSoundBuffer != NULL)
50
                mSoundBuffer->Release();
51
}
52
 
53
void DSoundInstance::RehupVolume()
54
{
55
        if (mSoundBuffer != NULL)
56
                mSoundBuffer->SetVolume(mSoundManagerP->VolumeToDB(mBaseVolume * mVolume * mSoundManagerP->mMasterVolume));
57
}
58
 
59
void DSoundInstance::RehupPan()
60
{
61
        if (mSoundBuffer != NULL)
62
                mSoundBuffer->SetPan(mBasePan + mPan);
63
}
64
 
65
void DSoundInstance::Release()
66
{
67
        Stop();
68
        mReleased = true;                      
69
}
70
 
71
void DSoundInstance::SetVolume(double theVolume) // 0 = max
72
{
73
        mVolume = theVolume;
74
        RehupVolume(); 
75
}
76
 
77
void DSoundInstance::SetPan(int thePosition) //-db to =db = left to right
78
{
79
        mPan = thePosition;
80
        RehupPan();    
81
}
82
 
83
void DSoundInstance::SetBaseVolume(double theBaseVolume)
84
{
85
        mBaseVolume = theBaseVolume;
86
        RehupVolume();
87
}
88
 
89
void DSoundInstance::SetBasePan(int theBasePan)
90
{
91
        mBasePan = theBasePan;
92
        RehupPan();
93
}
94
 
95
bool DSoundInstance::Play(bool looping, bool autoRelease)
96
{
97
        Stop();
98
 
99
        mHasPlayed = true;     
100
        mAutoRelease = autoRelease;    
101
 
102
        if (mSoundBuffer == NULL)
103
        {
104
                return false;
105
        }
106
 
107
        if (looping)
108
        {
109
                if (mSoundBuffer->Play(0, 0, DSBPLAY_LOOPING) != DS_OK)
110
                        return false;
111
        }
112
        else
113
        {
114
                if (mSoundBuffer->Play(0, 0, 0) != DS_OK)
115
                {
116
                        return false;
117
                }
118
        }
119
 
120
        return true;
121
}
122
 
123
void DSoundInstance::Stop()
124
{
125
        if (mSoundBuffer != NULL)
126
        {
127
                mSoundBuffer->Stop();
128
                mSoundBuffer->SetCurrentPosition(0);
129
                mAutoRelease = false;
130
        }
131
}
132
 
133
#include "DirectXErrorString.h"
134
void DSoundInstance::AdjustPitch(double theNumSteps)
135
{
136
        if (mSoundBuffer != NULL)
137
        {
138
                double aFrequencyMult = pow(1.0594630943592952645618252949463, theNumSteps);
139
                double aNewFrequency = mDefaultFrequency*aFrequencyMult;
140
                if (aNewFrequency < DSBFREQUENCY_MIN)
141
                        aNewFrequency = DSBFREQUENCY_MIN;
142
                if (aNewFrequency > DSBFREQUENCY_MAX)
143
                        aNewFrequency = DSBFREQUENCY_MAX;
144
 
145
                mSoundBuffer->SetFrequency((DWORD)aNewFrequency);
146
        }
147
}
148
 
149
bool DSoundInstance::IsPlaying()
150
{
151
        if (!mHasPlayed)
152
                return false;
153
 
154
        if (mSoundBuffer == NULL)
155
                return false;
156
 
157
        DWORD aStatus;
158
        if (mSoundBuffer->GetStatus(&aStatus) == DS_OK)
159
                // Has the sound stopped?
160
                return ((aStatus & DSBSTATUS_PLAYING) != 0);
161
        else
162
                return false;
163
}
164
 
165
bool DSoundInstance::IsReleased()
166
{
167
        if ((!mReleased) && (mAutoRelease) && (mHasPlayed) && (!IsPlaying()))  
168
                Release();     
169
 
170
        return mReleased;
171
}
172
 
173
double DSoundInstance::GetVolume()
174
{
175
        return mVolume;
176
}
177