Don't store the buffer in the sound struct

openmw-38
Chris Robinson 9 years ago
parent fd7d58fe7e
commit ea70b0baee

@ -146,6 +146,19 @@ static ALenum getALFormat(ChannelConfig chans, SampleType type)
return AL_NONE; return AL_NONE;
} }
static double getBufferLength(ALuint buffer)
{
ALint bufferSize, frequency, channels, bitsPerSample;
alGetBufferi(buffer, AL_SIZE, &bufferSize);
alGetBufferi(buffer, AL_FREQUENCY, &frequency);
alGetBufferi(buffer, AL_CHANNELS, &channels);
alGetBufferi(buffer, AL_BITS, &bitsPerSample);
throwALerror();
return (8.0*bufferSize)/(frequency*channels*bitsPerSample);
}
// //
// A streaming OpenAL sound. // A streaming OpenAL sound.
// //
@ -515,7 +528,6 @@ protected:
OpenAL_Output &mOutput; OpenAL_Output &mOutput;
ALuint mSource; ALuint mSource;
ALuint mBuffer;
friend class OpenAL_Output; friend class OpenAL_Output;
@ -526,13 +538,12 @@ private:
OpenAL_Sound& operator=(const OpenAL_Sound &rhs); OpenAL_Sound& operator=(const OpenAL_Sound &rhs);
public: public:
OpenAL_Sound(OpenAL_Output &output, ALuint src, ALuint buf, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags); OpenAL_Sound(OpenAL_Output &output, ALuint src, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags);
virtual ~OpenAL_Sound(); virtual ~OpenAL_Sound();
virtual void stop(); virtual void stop();
virtual bool isPlaying(); virtual bool isPlaying();
virtual double getTimeOffset(); virtual double getTimeOffset();
virtual double getLength();
virtual void update(); virtual void update();
}; };
@ -545,16 +556,16 @@ class OpenAL_Sound3D : public OpenAL_Sound
OpenAL_Sound3D& operator=(const OpenAL_Sound &rhs); OpenAL_Sound3D& operator=(const OpenAL_Sound &rhs);
public: public:
OpenAL_Sound3D(OpenAL_Output &output, ALuint src, ALuint buf, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags) OpenAL_Sound3D(OpenAL_Output &output, ALuint src, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
: OpenAL_Sound(output, src, buf, pos, vol, basevol, pitch, mindist, maxdist, flags) : OpenAL_Sound(output, src, pos, vol, basevol, pitch, mindist, maxdist, flags)
{ } { }
virtual void update(); virtual void update();
}; };
OpenAL_Sound::OpenAL_Sound(OpenAL_Output &output, ALuint src, ALuint buf, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags) OpenAL_Sound::OpenAL_Sound(OpenAL_Output &output, ALuint src, const osg::Vec3f& pos, float vol, float basevol, float pitch, float mindist, float maxdist, int flags)
: Sound(pos, vol, basevol, pitch, mindist, maxdist, flags) : Sound(pos, vol, basevol, pitch, mindist, maxdist, flags)
, mOutput(output), mSource(src), mBuffer(buf) , mOutput(output), mSource(src)
{ {
mOutput.mActiveSounds.push_back(this); mOutput.mActiveSounds.push_back(this);
} }
@ -595,17 +606,6 @@ double OpenAL_Sound::getTimeOffset()
return t; return t;
} }
double OpenAL_Sound::getLength()
{
ALint bufferSize, frequency, channels, bitsPerSample;
alGetBufferi(mBuffer, AL_SIZE, &bufferSize);
alGetBufferi(mBuffer, AL_FREQUENCY, &frequency);
alGetBufferi(mBuffer, AL_CHANNELS, &channels);
alGetBufferi(mBuffer, AL_BITS, &bitsPerSample);
return (8.0*bufferSize)/(frequency*channels*bitsPerSample);
}
void OpenAL_Sound::updateAll(bool local) void OpenAL_Sound::updateAll(bool local)
{ {
alSourcef(mSource, AL_REFERENCE_DISTANCE, mMinDistance); alSourcef(mSource, AL_REFERENCE_DISTANCE, mMinDistance);
@ -815,11 +815,15 @@ void OpenAL_Output::unloadSound(Sound_Handle data)
SoundVec::const_iterator iter = mActiveSounds.begin(); SoundVec::const_iterator iter = mActiveSounds.begin();
for(;iter != mActiveSounds.end();++iter) for(;iter != mActiveSounds.end();++iter)
{ {
if((*iter)->mSource && (*iter)->mBuffer == buffer) if(!(*iter)->mSource)
continue;
ALint srcbuf;
alGetSourcei((*iter)->mSource, AL_BUFFER, &srcbuf);
if((ALuint)srcbuf == buffer)
{ {
alSourceStop((*iter)->mSource); alSourceStop((*iter)->mSource);
alSourcei((*iter)->mSource, AL_BUFFER, 0); alSourcei((*iter)->mSource, AL_BUFFER, 0);
(*iter)->mBuffer = 0;
} }
} }
alDeleteBuffers(1, &buffer); alDeleteBuffers(1, &buffer);
@ -847,9 +851,8 @@ MWBase::SoundPtr OpenAL_Output::playSound(Sound_Handle data, float vol, float ba
src = mFreeSources.front(); src = mFreeSources.front();
mFreeSources.pop_front(); mFreeSources.pop_front();
ALuint buffer = GET_PTRID(data);
try { try {
sound.reset(new OpenAL_Sound(*this, src, buffer, osg::Vec3f(0.f, 0.f, 0.f), vol, basevol, pitch, 1.0f, 1000.0f, flags)); sound.reset(new OpenAL_Sound(*this, src, osg::Vec3f(0.f, 0.f, 0.f), vol, basevol, pitch, 1.0f, 1000.0f, flags));
} }
catch(std::exception&) catch(std::exception&)
{ {
@ -858,13 +861,14 @@ MWBase::SoundPtr OpenAL_Output::playSound(Sound_Handle data, float vol, float ba
} }
sound->updateAll(true); sound->updateAll(true);
if(offset<0) if(offset < 0.0f)
offset=0; offset = 0.0f;
if(offset>1) if(offset > 1.0f)
offset=1; offset = 1.0f;
ALuint buffer = GET_PTRID(data);
alSourcei(src, AL_BUFFER, buffer); alSourcei(src, AL_BUFFER, buffer);
alSourcef(src, AL_SEC_OFFSET, static_cast<ALfloat>(sound->getLength()*offset / pitch)); alSourcef(src, AL_SEC_OFFSET, static_cast<ALfloat>(getBufferLength(buffer)*offset / pitch));
alSourcePlay(src); alSourcePlay(src);
throwALerror(); throwALerror();
@ -882,9 +886,8 @@ MWBase::SoundPtr OpenAL_Output::playSound3D(Sound_Handle data, const osg::Vec3f
src = mFreeSources.front(); src = mFreeSources.front();
mFreeSources.pop_front(); mFreeSources.pop_front();
ALuint buffer = GET_PTRID(data);
try { try {
sound.reset(new OpenAL_Sound3D(*this, src, buffer, pos, vol, basevol, pitch, min, max, flags)); sound.reset(new OpenAL_Sound3D(*this, src, pos, vol, basevol, pitch, min, max, flags));
} }
catch(std::exception&) catch(std::exception&)
{ {
@ -893,14 +896,14 @@ MWBase::SoundPtr OpenAL_Output::playSound3D(Sound_Handle data, const osg::Vec3f
} }
sound->updateAll(false); sound->updateAll(false);
if(offset < 0.0f)
offset = 0.0f;
if(offset > 1.0f)
offset = 1.0f;
if(offset<0) ALuint buffer = GET_PTRID(data);
offset=0;
if(offset>1)
offset=1;
alSourcei(src, AL_BUFFER, buffer); alSourcei(src, AL_BUFFER, buffer);
alSourcef(src, AL_SEC_OFFSET, static_cast<ALfloat>(sound->getLength()*offset / pitch)); alSourcef(src, AL_SEC_OFFSET, static_cast<ALfloat>(getBufferLength(buffer)*offset / pitch));
alSourcePlay(src); alSourcePlay(src);
throwALerror(); throwALerror();

Loading…
Cancel
Save