forked from teamnwah/openmw-tes3coop
Don't store the buffer in the sound struct
This commit is contained in:
parent
fd7d58fe7e
commit
ea70b0baee
1 changed files with 38 additions and 35 deletions
|
@ -146,6 +146,19 @@ static ALenum getALFormat(ChannelConfig chans, SampleType type)
|
|||
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.
|
||||
//
|
||||
|
@ -515,7 +528,6 @@ protected:
|
|||
OpenAL_Output &mOutput;
|
||||
|
||||
ALuint mSource;
|
||||
ALuint mBuffer;
|
||||
|
||||
friend class OpenAL_Output;
|
||||
|
||||
|
@ -526,13 +538,12 @@ private:
|
|||
OpenAL_Sound& operator=(const OpenAL_Sound &rhs);
|
||||
|
||||
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 void stop();
|
||||
virtual bool isPlaying();
|
||||
virtual double getTimeOffset();
|
||||
virtual double getLength();
|
||||
virtual void update();
|
||||
};
|
||||
|
||||
|
@ -545,16 +556,16 @@ class OpenAL_Sound3D : public OpenAL_Sound
|
|||
OpenAL_Sound3D& operator=(const OpenAL_Sound &rhs);
|
||||
|
||||
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_Sound(output, src, buf, pos, vol, basevol, pitch, mindist, maxdist, 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, pos, vol, basevol, pitch, mindist, maxdist, flags)
|
||||
{ }
|
||||
|
||||
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)
|
||||
, mOutput(output), mSource(src), mBuffer(buf)
|
||||
, mOutput(output), mSource(src)
|
||||
{
|
||||
mOutput.mActiveSounds.push_back(this);
|
||||
}
|
||||
|
@ -595,17 +606,6 @@ double OpenAL_Sound::getTimeOffset()
|
|||
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)
|
||||
{
|
||||
alSourcef(mSource, AL_REFERENCE_DISTANCE, mMinDistance);
|
||||
|
@ -815,11 +815,15 @@ void OpenAL_Output::unloadSound(Sound_Handle data)
|
|||
SoundVec::const_iterator iter = mActiveSounds.begin();
|
||||
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);
|
||||
alSourcei((*iter)->mSource, AL_BUFFER, 0);
|
||||
(*iter)->mBuffer = 0;
|
||||
}
|
||||
}
|
||||
alDeleteBuffers(1, &buffer);
|
||||
|
@ -847,9 +851,8 @@ MWBase::SoundPtr OpenAL_Output::playSound(Sound_Handle data, float vol, float ba
|
|||
src = mFreeSources.front();
|
||||
mFreeSources.pop_front();
|
||||
|
||||
ALuint buffer = GET_PTRID(data);
|
||||
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&)
|
||||
{
|
||||
|
@ -858,13 +861,14 @@ MWBase::SoundPtr OpenAL_Output::playSound(Sound_Handle data, float vol, float ba
|
|||
}
|
||||
|
||||
sound->updateAll(true);
|
||||
if(offset<0)
|
||||
offset=0;
|
||||
if(offset>1)
|
||||
offset=1;
|
||||
if(offset < 0.0f)
|
||||
offset = 0.0f;
|
||||
if(offset > 1.0f)
|
||||
offset = 1.0f;
|
||||
|
||||
ALuint buffer = GET_PTRID(data);
|
||||
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);
|
||||
throwALerror();
|
||||
|
||||
|
@ -882,9 +886,8 @@ MWBase::SoundPtr OpenAL_Output::playSound3D(Sound_Handle data, const osg::Vec3f
|
|||
src = mFreeSources.front();
|
||||
mFreeSources.pop_front();
|
||||
|
||||
ALuint buffer = GET_PTRID(data);
|
||||
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&)
|
||||
{
|
||||
|
@ -893,14 +896,14 @@ MWBase::SoundPtr OpenAL_Output::playSound3D(Sound_Handle data, const osg::Vec3f
|
|||
}
|
||||
|
||||
sound->updateAll(false);
|
||||
if(offset < 0.0f)
|
||||
offset = 0.0f;
|
||||
if(offset > 1.0f)
|
||||
offset = 1.0f;
|
||||
|
||||
if(offset<0)
|
||||
offset=0;
|
||||
if(offset>1)
|
||||
offset=1;
|
||||
|
||||
ALuint buffer = GET_PTRID(data);
|
||||
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);
|
||||
throwALerror();
|
||||
|
|
Loading…
Reference in a new issue