Use proper mutex mechanisms and don't check al errors in the stream thread

This commit is contained in:
Chris Robinson 2015-11-24 02:57:43 -08:00
parent f9e18cd966
commit f7218f5a25

View file

@ -232,7 +232,7 @@ struct OpenAL_Output::StreamThread {
{ {
while(1) while(1)
{ {
mMutex.lock(); boost::unique_lock<boost::recursive_mutex> lock(mMutex);
StreamVec::iterator iter = mStreams.begin(); StreamVec::iterator iter = mStreams.begin();
while(iter != mStreams.end()) while(iter != mStreams.end())
{ {
@ -241,33 +241,29 @@ struct OpenAL_Output::StreamThread {
else else
++iter; ++iter;
} }
mMutex.unlock(); lock.unlock();
boost::this_thread::sleep(boost::posix_time::milliseconds(50)); boost::this_thread::sleep(boost::posix_time::milliseconds(50));
} }
} }
void add(OpenAL_SoundStream *stream) void add(OpenAL_SoundStream *stream)
{ {
mMutex.lock(); boost::lock_guard<boost::recursive_mutex> lock(mMutex);
if(std::find(mStreams.begin(), mStreams.end(), stream) == mStreams.end()) if(std::find(mStreams.begin(), mStreams.end(), stream) == mStreams.end())
mStreams.push_back(stream); mStreams.push_back(stream);
mMutex.unlock();
} }
void remove(OpenAL_SoundStream *stream) void remove(OpenAL_SoundStream *stream)
{ {
mMutex.lock(); boost::lock_guard<boost::recursive_mutex> lock(mMutex);
StreamVec::iterator iter = std::find(mStreams.begin(), mStreams.end(), stream); StreamVec::iterator iter = std::find(mStreams.begin(), mStreams.end(), stream);
if(iter != mStreams.end()) if(iter != mStreams.end()) mStreams.erase(iter);
mStreams.erase(iter);
mMutex.unlock();
} }
void removeAll() void removeAll()
{ {
mMutex.lock(); boost::lock_guard<boost::recursive_mutex> lock(mMutex);
mStreams.clear(); mStreams.clear();
mMutex.unlock();
} }
private: private:
@ -373,7 +369,7 @@ double OpenAL_SoundStream::getTimeOffset()
ALint offset; ALint offset;
double t; double t;
boost::unique_lock<boost::recursive_mutex> lock(mOutput.mStreamThread->mMutex); boost::lock_guard<boost::recursive_mutex> lock(mOutput.mStreamThread->mMutex);
alGetSourcei(mSource, AL_SAMPLE_OFFSET, &offset); alGetSourcei(mSource, AL_SAMPLE_OFFSET, &offset);
alGetSourcei(mSource, AL_SOURCE_STATE, &state); alGetSourcei(mSource, AL_SOURCE_STATE, &state);
if(state == AL_PLAYING || state == AL_PAUSED) if(state == AL_PLAYING || state == AL_PAUSED)
@ -389,7 +385,6 @@ double OpenAL_SoundStream::getTimeOffset()
* next. */ * next. */
t = (double)mDecoder->getSampleOffset() / (double)mSampleRate; t = (double)mDecoder->getSampleOffset() / (double)mSampleRate;
} }
lock.unlock();
throwALerror(); throwALerror();
return t; return t;
@ -443,7 +438,6 @@ bool OpenAL_SoundStream::process()
{ {
if(refillQueue() > 0) if(refillQueue() > 0)
alSourcePlay(mSource); alSourcePlay(mSource);
throwALerror();
} }
} }
} }
@ -464,7 +458,6 @@ ALint OpenAL_SoundStream::refillQueue()
alSourceUnqueueBuffers(mSource, 1, &buf); alSourceUnqueueBuffers(mSource, 1, &buf);
--processed; --processed;
} }
throwALerror();
ALint queued; ALint queued;
alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queued); alGetSourcei(mSource, AL_BUFFERS_QUEUED, &queued);
@ -484,7 +477,6 @@ ALint OpenAL_SoundStream::refillQueue()
ALuint bufid = mBuffers[mCurrentBufIdx]; ALuint bufid = mBuffers[mCurrentBufIdx];
alBufferData(bufid, mFormat, &data[0], data.size(), mSampleRate); alBufferData(bufid, mFormat, &data[0], data.size(), mSampleRate);
alSourceQueueBuffers(mSource, 1, &bufid); alSourceQueueBuffers(mSource, 1, &bufid);
throwALerror();
mCurrentBufIdx = (mCurrentBufIdx+1) % sNumBuffers; mCurrentBufIdx = (mCurrentBufIdx+1) % sNumBuffers;
} }
} }