tge/engine/audio/oggMixedStreamSource.cc
2025-02-17 23:17:30 -06:00

134 lines
2.7 KiB
C++
Executable File

//--------------------------------------
//
// This class is basically a buffer that is filled from
// the ogg stream the theoraplayer has open
//
//--------------------------------------
#include "audio/oggMixedStreamSource.h"
OggMixedStreamSource::OggMixedStreamSource(const char *filename)
{
bIsValid = false;
bBuffersAllocated = false;
for(int i = 0; i < BUFFERCNT; i++)
{
mBufferList[i] = 0;
m_fBufferInUse[i] = false;
}
mHandle = NULL_AUDIOHANDLE;
mSource = NULL;
mFilename = filename;
mPosition = Point3F(0.f,0.f,0.f);
dMemset(&mDescription, 0, sizeof(Audio::Description));
mEnvironment = 0;
mPosition.set(0.f,0.f,0.f);
mDirection.set(0.f,1.f,0.f);
mPitch = 1.f;
mScore = 0.f;
mCullTime = 0;
bFinishedPlaying = false;
bIsValid = false;
bBuffersAllocated = false;
}
OggMixedStreamSource::~OggMixedStreamSource()
{
if(bIsValid)
freeStream();
}
bool OggMixedStreamSource::initStream()
{
alSourceStop(mSource);
alSourcei(mSource, AL_BUFFER, 0);
// Clear Error Code
alGetError();
alGenBuffers(BUFFERCNT, mBufferList);
if (alGetError() != AL_NO_ERROR)
return false;
bBuffersAllocated = true;
alSourcei(mSource, AL_LOOPING, AL_FALSE);
bIsValid = true;
return true;
}
bool OggMixedStreamSource::updateBuffers()
{
// buffers are updated from theora player
return true;
}
void OggMixedStreamSource::freeStream()
{
// free the al buffers
if(bBuffersAllocated)
{
alSourceStop(mSource);
alSourcei(mSource, AL_BUFFER, 0);
alDeleteBuffers(BUFFERCNT, mBufferList);
alGetError();
for(int i = 0; i < BUFFERCNT; i++)
{
mBufferList[i] = 0;
m_fBufferInUse[i] = false;
}
bBuffersAllocated = false;
}
}
ALuint OggMixedStreamSource::GetAvailableBuffer()
{
if(!bBuffersAllocated)
return 0;
// test for unused buffers
for(int i = 0; i < BUFFERCNT; i++)
{
if(!m_fBufferInUse[i])
{
m_fBufferInUse[i] = true;
return mBufferList[i];
}
}
alGetError();
// test for processed buffers
ALint processed;
alGetSourcei(mSource, AL_BUFFERS_PROCESSED, &processed);
if(!processed)
return 0; // no available buffers
ALuint BufferID;
alSourceUnqueueBuffers(mSource, 1, &BufferID);
if (alGetError() != AL_NO_ERROR)
return 0; // something went wrong..
return BufferID;
}
bool OggMixedStreamSource::QueueBuffer(ALuint BufferID)
{
alSourceQueueBuffers(mSource, 1, &BufferID);
if (alGetError() != AL_NO_ERROR)
return false;
return true;
}