From 34bf3f2de0e2722f8a6e951e8fb5be069ba7299f Mon Sep 17 00:00:00 2001 From: Bastien Bouclet Date: Fri, 15 Nov 2019 21:24:22 +0100 Subject: 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. --- backends/text-to-speech/linux/linux-text-to-speech.cpp | 3 +++ .../text-to-speech/macosx/macosx-text-to-speech.mm | 2 ++ .../text-to-speech/windows/windows-text-to-speech.cpp | 3 +++ common/text-to-speech.cpp | 18 +++++++++--------- common/text-to-speech.h | 3 ++- 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() {}; }; -- cgit v1.2.3