fix for unintented clearing of speech rate listeners 90/250090/2
authorLukasz Oleksak <l.oleksak@samsung.com>
Fri, 18 Dec 2020 17:10:41 +0000 (18:10 +0100)
committerLukasz Oleksak <l.oleksak@samsung.com>
Fri, 18 Dec 2020 17:56:50 +0000 (18:56 +0100)
Change-Id: I73adad3fae4fa1fd8dd02db4049ed3ffe9744967

src/model/ScreenReaderSettingsModel.cpp
src/model/TextToSpeechModel.cpp
src/service/TextToSpeech.cpp
src/service/TextToSpeech.hpp

index b8dfcd5bd590a444193e98b597389f7cfc12ca98..9adbd15ee631d3ddb3e3d825c0ef9ba34482338e 100644 (file)
@@ -22,9 +22,7 @@ ScreenReaderSettingsModel::ScreenReaderSettingsModel()
 {
        speechRate_ = Singleton<TextToSpeech>::instance().getSpeed();
 
-    Singleton<TextToSpeech>::instance().addSpeedChangedCb([this](auto val) {
-               this->speechRate_ = val;
-       });
+    Singleton<TextToSpeech>::instance().addSpeedChangedCb(this, [this](auto val) { this->speechRate_ = val; });
 
     speechRateMin_ = Singleton<TextToSpeech>::instance().getSpeedRange().min;
 
@@ -46,11 +44,6 @@ ScreenReaderSettingsModel::ScreenReaderSettingsModel()
                this->soundFeedback_ = value;
        });
 
-    speechRate_.attach([](auto val) {
-               Singleton<TextToSpeech>::instance().setSpeed(val);
-       });
-
-
        keyboardFeedback_.attach([](auto val) {
                Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, val);
        });
@@ -71,6 +64,6 @@ ScreenReaderSettingsModel::ScreenReaderSettingsModel()
 
 ScreenReaderSettingsModel::~ScreenReaderSettingsModel()
 {
-       Singleton<TextToSpeech>::instance().clearSpeedChangedCallbacks();
+       Singleton<TextToSpeech>::instance().removeSpeedChangedCb(this);
 }
 
index 4133a229e55a32fd7a56856c9f24e5569ca71a42..54d73bb8e2e5b15c7c8f9bec4535be2264e27bd6 100644 (file)
 TextToSpeechModel::TextToSpeechModel() {
 
        speechRate_ = Singleton<TextToSpeech>::instance().getSpeed();
-
-    Singleton<TextToSpeech>::instance().addSpeedChangedCb([this](auto val) {
-               this->speechRate_ = val;
-       });
+    Singleton<TextToSpeech>::instance().addSpeedChangedCb(this, [this](auto val) { this->speechRate_ = val; });
 
     speechRate_.attach([](auto val) {
                Singleton<TextToSpeech>::instance().setSpeed(val);
@@ -36,7 +33,6 @@ TextToSpeechModel::TextToSpeechModel() {
 
 TextToSpeechModel::~TextToSpeechModel() {
 
-       Singleton<TextToSpeech>::instance().clearSpeedChangedCallbacks();
-
+       Singleton<TextToSpeech>::instance().removeSpeedChangedCb(this);
 }
 
index d36044efa85ae97ff7e3c746c9275f705460187f..15a3775447fa435eaf41cdda7a23b0463fec39ec 100644 (file)
@@ -36,15 +36,23 @@ TextToSpeech::TextToSpeech()
 
        if (auto ret = tts_setting_initialize())
                ERROR("tts_setting_initialize: %s", ttsSettingErrorToString(ret).c_str());
+
+       if (auto ret = tts_setting_set_speed_changed_cb(onSpeedChange, this))
+               ERROR("tts_setting_set_speed_changed_cb: %s", ttsSettingErrorToString(ret).c_str());
 }
 
 TextToSpeech::~TextToSpeech()
 {
+       if (tts_setting_unset_speed_changed_cb())
+               WARNING("Fail to unset speed changed cb");
+
        if (tts_setting_finalize())
                WARNING("Fail to setting finalize");
 
        if (tts_destroy(handle_))
                WARNING("Fail to tts destroy");
+
+       clearSpeedChangedCallbacks();
 }
 
 void TextToSpeech::play(const std::string &text)
@@ -91,12 +99,14 @@ auto TextToSpeech::getSpeedRange() -> SpeedRange
        return {};
 }
 
-void TextToSpeech::addSpeedChangedCb(std::function<void(size_t)> onChange)
+void TextToSpeech::addSpeedChangedCb(void *key, std::function<void(size_t)> onChange)
 {
-       auto ret = tts_setting_set_speed_changed_cb(onSpeedChange, this);
-       if (ret)
-               ERROR("tts_setting_set_speed_changed_cb: %s", ttsSettingErrorToString(ret).c_str());
-       speedChangedCallbacks_.push_back(std::move(onChange));
+       speedChangedCallbacks_.insert({key, std::move(onChange)});
+}
+
+void TextToSpeech::removeSpeedChangedCb(void *key)
+{
+       speedChangedCallbacks_.erase(key);
 }
 
 void TextToSpeech::clearSpeedChangedCallbacks()
@@ -151,6 +161,6 @@ void TextToSpeech::onSpeedChange(int speed, void *user_data)
 {
        auto self = static_cast<TextToSpeech *>(user_data);
        for (auto it : self->speedChangedCallbacks_)
-               if (it)
-                       it(speed);
+               if (it.second)
+                       it.second(speed);
 }
index e5f30f4c313a856d6ce90ab2229315f15e0ed518..5befccfd9483bd98a704dfd1e0913275c047533f 100644 (file)
@@ -21,7 +21,7 @@
 #include <functional>
 #include <tts.h>
 #include <tts_setting.h>
-#include <vector>
+#include <unordered_map>
 
 class TextToSpeech
 {
@@ -40,16 +40,17 @@ class TextToSpeech
        size_t getSpeed();
        void setSpeed(size_t speed);
        SpeedRange getSpeedRange();
-       void addSpeedChangedCb(std::function<void(size_t)> onChange);
-       void clearSpeedChangedCallbacks();
+       void addSpeedChangedCb(void *key, std::function<void(size_t)> onChange);
+       void removeSpeedChangedCb(void *key);
 
        private:
        std::string ttsErrorToString(int error);
        std::string ttsSettingErrorToString(int error);
        static void onSpeedChange(int speed, void *user_data);
+       void clearSpeedChangedCallbacks();
 
        tts_h handle_ = nullptr;
-       std::vector<std::function<void(size_t)>> speedChangedCallbacks_;
+       std::unordered_map<void*, std::function<void(size_t)>> speedChangedCallbacks_;
 };
 
 #endif