From 427941e8c388b3ee7dd5b860ea081b82dd5d8788 Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Sun, 11 Sep 2011 20:28:26 +0100 Subject: [PATCH] Fix for BufferingAudioSource. --- .../sources/juce_BufferingAudioSource.cpp | 5 ++--- modules/juce_core/threads/juce_TimeSliceThread.cpp | 11 +++++++++++ modules/juce_core/threads/juce_TimeSliceThread.h | 6 ++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp b/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp index 19d840b45e..82ce2db4d8 100644 --- a/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp +++ b/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp @@ -80,7 +80,7 @@ void BufferingAudioSource::prepareToPlay (int samplesPerBlockExpected, double sa while (bufferValidEnd - bufferValidStart < jmin (((int) sampleRate_) / 4, buffer.getNumSamples() / 2)) { - backgroundThread.addTimeSliceClient (this); + backgroundThread.moveToFrontOfQueue (this); Thread::sleep (5); } } @@ -168,8 +168,7 @@ void BufferingAudioSource::setNextReadPosition (int64 newPosition) const ScopedLock sl (bufferStartPosLock); nextPlayPos = newPosition; - - backgroundThread.addTimeSliceClient (this); + backgroundThread.moveToFrontOfQueue (this); } bool BufferingAudioSource::readNextBufferChunk() diff --git a/modules/juce_core/threads/juce_TimeSliceThread.cpp b/modules/juce_core/threads/juce_TimeSliceThread.cpp index 5df7ce29b0..d4e0827b15 100644 --- a/modules/juce_core/threads/juce_TimeSliceThread.cpp +++ b/modules/juce_core/threads/juce_TimeSliceThread.cpp @@ -70,6 +70,17 @@ void TimeSliceThread::removeTimeSliceClient (TimeSliceClient* const client) } } +void TimeSliceThread::moveToFrontOfQueue (TimeSliceClient* client) +{ + const ScopedLock sl (listLock); + + if (clients.contains (client)) + { + client->nextCallTime = Time::getCurrentTime(); + notify(); + } +} + int TimeSliceThread::getNumClients() const { return clients.size(); diff --git a/modules/juce_core/threads/juce_TimeSliceThread.h b/modules/juce_core/threads/juce_TimeSliceThread.h index 9b6054c5cd..ef99d0abd8 100644 --- a/modules/juce_core/threads/juce_TimeSliceThread.h +++ b/modules/juce_core/threads/juce_TimeSliceThread.h @@ -117,6 +117,12 @@ public: */ void removeTimeSliceClient (TimeSliceClient* client); + /** If the given client is waiting in the queue, it will be moved to the front + and given a time-slice as soon as possible. + If the specified client has not been added, nothing will happen. + */ + void moveToFrontOfQueue (TimeSliceClient* client); + /** Returns the number of registered clients. */ int getNumClients() const;