aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Bouclet2019-11-15 21:24:22 +0100
committerBastien Bouclet2019-11-15 21:24:22 +0100
commit34bf3f2de0e2722f8a6e951e8fb5be069ba7299f (patch)
tree3d59490a3dcb2c2d467d0f7ccf24b25dee6503db
parentc87ca97b2252999f3edb326cfd7a22fc639fbb64 (diff)
downloadscummvm-rg350-34bf3f2de0e2722f8a6e951e8fb5be069ba7299f.tar.gz
scummvm-rg350-34bf3f2de0e2722f8a6e951e8fb5be069ba7299f.tar.bz2
scummvm-rg350-34bf3f2de0e2722f8a6e951e8fb5be069ba7299f.zip
TTS: Fix use of virtual function in TTSMan destructor
TextToSpeechManager::freeVoiceData was called while the virtual function table pointer was already reset by the parent class destructor.
-rw-r--r--backends/text-to-speech/linux/linux-text-to-speech.cpp3
-rw-r--r--backends/text-to-speech/macosx/macosx-text-to-speech.mm2
-rw-r--r--backends/text-to-speech/windows/windows-text-to-speech.cpp3
-rw-r--r--common/text-to-speech.cpp18
-rw-r--r--common/text-to-speech.h3
5 files changed, 19 insertions, 10 deletions
diff --git a/backends/text-to-speech/linux/linux-text-to-speech.cpp b/backends/text-to-speech/linux/linux-text-to-speech.cpp
index 5943b69f49..b4a0d8c393 100644
--- a/backends/text-to-speech/linux/linux-text-to-speech.cpp
+++ b/backends/text-to-speech/linux/linux-text-to-speech.cpp
@@ -127,6 +127,9 @@ void SpeechDispatcherManager::init() {
SpeechDispatcherManager::~SpeechDispatcherManager() {
stop();
+
+ clearState();
+
if (_connection != 0)
spd_close(_connection);
if (_threadCreated)
diff --git a/backends/text-to-speech/macosx/macosx-text-to-speech.mm b/backends/text-to-speech/macosx/macosx-text-to-speech.mm
index 72f56f91be..4d232f3b95 100644
--- a/backends/text-to-speech/macosx/macosx-text-to-speech.mm
+++ b/backends/text-to-speech/macosx/macosx-text-to-speech.mm
@@ -66,6 +66,8 @@ MacOSXTextToSpeechManager::MacOSXTextToSpeechManager() : Common::TextToSpeechMan
}
MacOSXTextToSpeechManager::~MacOSXTextToSpeechManager() {
+ clearState();
+
[synthesizer release];
[synthesizerDelegate release];
}
diff --git a/backends/text-to-speech/windows/windows-text-to-speech.cpp b/backends/text-to-speech/windows/windows-text-to-speech.cpp
index 9f4ecf742a..a398200bad 100644
--- a/backends/text-to-speech/windows/windows-text-to-speech.cpp
+++ b/backends/text-to-speech/windows/windows-text-to-speech.cpp
@@ -120,6 +120,9 @@ void WindowsTextToSpeechManager::init() {
WindowsTextToSpeechManager::~WindowsTextToSpeechManager() {
stop();
+
+ clearState();
+
if (_thread != NULL) {
WaitForSingleObject(_thread, INFINITE);
CloseHandle(_thread);
diff --git a/common/text-to-speech.cpp b/common/text-to-speech.cpp
index fa74e53c36..8e4742b3e9 100644
--- a/common/text-to-speech.cpp
+++ b/common/text-to-speech.cpp
@@ -88,15 +88,6 @@ TextToSpeechManager::TextToSpeechManager() {
_ttsState->_next = nullptr;
}
-TextToSpeechManager::~TextToSpeechManager() {
- TTSState *tmp = _ttsState;
- while (tmp != nullptr) {
- tmp = _ttsState->_next;
- delete _ttsState;
- _ttsState = tmp;
- }
-}
-
void TextToSpeechManager::pushState() {
stop();
TTSState *newState = new TTSState;
@@ -130,6 +121,15 @@ bool TextToSpeechManager::popState() {
return false;
}
+void TextToSpeechManager::clearState() {
+ TTSState *tmp = _ttsState;
+ while (tmp != nullptr) {
+ tmp = _ttsState->_next;
+ delete _ttsState;
+ _ttsState = tmp;
+ }
+}
+
TTSVoice TextToSpeechManager::getVoice() {
if (!_ttsState->_availableVoices.empty())
return _ttsState->_availableVoices[_ttsState->_activeVoice];
diff --git a/common/text-to-speech.h b/common/text-to-speech.h
index 14cbab17a5..cd34c28747 100644
--- a/common/text-to-speech.h
+++ b/common/text-to-speech.h
@@ -149,7 +149,7 @@ public:
* pitch and volume to their middle values.
*/
TextToSpeechManager();
- virtual ~TextToSpeechManager();
+ virtual ~TextToSpeechManager() {}
/**
* Interrupts what's being said and says the given string
@@ -311,6 +311,7 @@ public:
protected:
TTSState *_ttsState;
+ void clearState();
virtual void updateVoices() {};
};