[Scummvm-git-logs] scummvm master -> 3e5515cc21d8e898fd69464643255d135c5b942d

dreammaster dreammaster at scummvm.org
Sat Sep 16 21:23:52 CEST 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3e5515cc21 TITANIC: Improve audio buffer critial section handling


Commit: 3e5515cc21d8e898fd69464643255d135c5b942d
    https://github.com/scummvm/scummvm/commit/3e5515cc21d8e898fd69464643255d135c5b942d
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-09-16T15:23:43-04:00

Commit Message:
TITANIC: Improve audio buffer critial section handling

Changed paths:
    engines/titanic/sound/audio_buffer.cpp
    engines/titanic/sound/audio_buffer.h
    engines/titanic/sound/music_room_handler.cpp
    engines/titanic/sound/wave_file.cpp


diff --git a/engines/titanic/sound/audio_buffer.cpp b/engines/titanic/sound/audio_buffer.cpp
index 0b0b6a5..0e1abc4 100644
--- a/engines/titanic/sound/audio_buffer.cpp
+++ b/engines/titanic/sound/audio_buffer.cpp
@@ -34,16 +34,37 @@ void CAudioBuffer::reset() {
 }
 
 void CAudioBuffer::push(int16 value) {
+	enterCriticalSection();
 	_data.push(value);
+	leaveCriticalSection();
 }
 
 void CAudioBuffer::push(const int16 *values, int count) {
+	enterCriticalSection();
+
 	for (; count > 0; --count, ++values)
 		_data.push(*values);
+
+	leaveCriticalSection();
 }
 
 int16 CAudioBuffer::pop() {
-	return _data.pop();
+	enterCriticalSection();
+	int16 value = _data.pop();
+	leaveCriticalSection();
+
+	return value;
+}
+
+int CAudioBuffer::read(int16 *values, int count) {
+	enterCriticalSection();
+
+	int bytesRead = 0;
+	for (; count > 0 && !_data.empty(); --count, ++bytesRead)
+		*values++ = _data.pop();
+
+	leaveCriticalSection();
+	return bytesRead;
 }
 
 void CAudioBuffer::enterCriticalSection() {
diff --git a/engines/titanic/sound/audio_buffer.h b/engines/titanic/sound/audio_buffer.h
index ad8c3e4..c775c5b 100644
--- a/engines/titanic/sound/audio_buffer.h
+++ b/engines/titanic/sound/audio_buffer.h
@@ -34,6 +34,16 @@ class CAudioBuffer {
 private:
 	Common::Mutex _mutex;
 	FixedQueue<int16, AUDIO_SAMPLING_RATE * 4> _data;
+private:
+	/**
+	 * Enters a critical section
+	 */
+	void enterCriticalSection();
+
+	/**
+	 * Leave a critical section
+	 */
+	void leaveCriticalSection();
 public:
 	bool _finished;
 public:
@@ -80,14 +90,9 @@ public:
 	int16 pop();
 
 	/**
-	 * Enters a critical section
-	 */
-	void enterCriticalSection();
-
-	/**
-	 * Leave a critical section
+	 * Reads out a specified number of samples
 	 */
-	void leaveCriticalSection();
+	int read(int16 *values, int count);
 };
 
 } // End of namespace Titanic
diff --git a/engines/titanic/sound/music_room_handler.cpp b/engines/titanic/sound/music_room_handler.cpp
index dbbe4e4..ffc90ff 100644
--- a/engines/titanic/sound/music_room_handler.cpp
+++ b/engines/titanic/sound/music_room_handler.cpp
@@ -202,8 +202,6 @@ bool CMusicRoomHandler::update() {
 }
 
 void CMusicRoomHandler::updateAudio() {
-	_audioBuffer->enterCriticalSection();
-
 	int size = _audioBuffer->freeSize();
 	int count;
 	int16 *ptr;
@@ -234,8 +232,6 @@ void CMusicRoomHandler::updateAudio() {
 		_audioBuffer->push(audioData, size);
 		delete[] audioData;
 	}
-
-	_audioBuffer->leaveCriticalSection();
 }
 
 void CMusicRoomHandler::updateInstruments() {
diff --git a/engines/titanic/sound/wave_file.cpp b/engines/titanic/sound/wave_file.cpp
index e57e9f0..ba89508 100644
--- a/engines/titanic/sound/wave_file.cpp
+++ b/engines/titanic/sound/wave_file.cpp
@@ -48,14 +48,7 @@ public:
 };
 
 int AudioBufferStream::readBuffer(int16 *buffer, const int numSamples) {
-	_audioBuffer->enterCriticalSection();
-	int samplesToRead = MIN((const int)numSamples, (const int)_audioBuffer->size());
-
-	for (int idx = 0; idx < samplesToRead; ++idx)
-		*buffer++ = _audioBuffer->pop();
-
-	_audioBuffer->leaveCriticalSection();
-	return samplesToRead;
+	return _audioBuffer->read(buffer, numSamples);
 }
 
 bool AudioBufferStream::endOfData() const {





More information about the Scummvm-git-logs mailing list