From: Lukasz Oleksak Date: Fri, 18 Dec 2020 17:10:41 +0000 (+0100) Subject: fix for unintented clearing of speech rate listeners X-Git-Tag: submit/tizen/20201228.021803~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=96ccafa1eb286c50faeebec283c180fc30013e60;p=profile%2Fcommon%2Fapps%2Fnative%2Faccessibility-setting.git fix for unintented clearing of speech rate listeners Change-Id: I73adad3fae4fa1fd8dd02db4049ed3ffe9744967 --- diff --git a/src/model/ScreenReaderSettingsModel.cpp b/src/model/ScreenReaderSettingsModel.cpp index b8dfcd5..9adbd15 100644 --- a/src/model/ScreenReaderSettingsModel.cpp +++ b/src/model/ScreenReaderSettingsModel.cpp @@ -22,9 +22,7 @@ ScreenReaderSettingsModel::ScreenReaderSettingsModel() { speechRate_ = Singleton::instance().getSpeed(); - Singleton::instance().addSpeedChangedCb([this](auto val) { - this->speechRate_ = val; - }); + Singleton::instance().addSpeedChangedCb(this, [this](auto val) { this->speechRate_ = val; }); speechRateMin_ = Singleton::instance().getSpeedRange().min; @@ -46,11 +44,6 @@ ScreenReaderSettingsModel::ScreenReaderSettingsModel() this->soundFeedback_ = value; }); - speechRate_.attach([](auto val) { - Singleton::instance().setSpeed(val); - }); - - keyboardFeedback_.attach([](auto val) { Singleton::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, val); }); @@ -71,6 +64,6 @@ ScreenReaderSettingsModel::ScreenReaderSettingsModel() ScreenReaderSettingsModel::~ScreenReaderSettingsModel() { - Singleton::instance().clearSpeedChangedCallbacks(); + Singleton::instance().removeSpeedChangedCb(this); } diff --git a/src/model/TextToSpeechModel.cpp b/src/model/TextToSpeechModel.cpp index 4133a22..54d73bb 100644 --- a/src/model/TextToSpeechModel.cpp +++ b/src/model/TextToSpeechModel.cpp @@ -20,10 +20,7 @@ TextToSpeechModel::TextToSpeechModel() { speechRate_ = Singleton::instance().getSpeed(); - - Singleton::instance().addSpeedChangedCb([this](auto val) { - this->speechRate_ = val; - }); + Singleton::instance().addSpeedChangedCb(this, [this](auto val) { this->speechRate_ = val; }); speechRate_.attach([](auto val) { Singleton::instance().setSpeed(val); @@ -36,7 +33,6 @@ TextToSpeechModel::TextToSpeechModel() { TextToSpeechModel::~TextToSpeechModel() { - Singleton::instance().clearSpeedChangedCallbacks(); - + Singleton::instance().removeSpeedChangedCb(this); } diff --git a/src/service/TextToSpeech.cpp b/src/service/TextToSpeech.cpp index d36044e..15a3775 100644 --- a/src/service/TextToSpeech.cpp +++ b/src/service/TextToSpeech.cpp @@ -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 onChange) +void TextToSpeech::addSpeedChangedCb(void *key, std::function 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(user_data); for (auto it : self->speedChangedCallbacks_) - if (it) - it(speed); + if (it.second) + it.second(speed); } diff --git a/src/service/TextToSpeech.hpp b/src/service/TextToSpeech.hpp index e5f30f4..5befccf 100644 --- a/src/service/TextToSpeech.hpp +++ b/src/service/TextToSpeech.hpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include class TextToSpeech { @@ -40,16 +40,17 @@ class TextToSpeech size_t getSpeed(); void setSpeed(size_t speed); SpeedRange getSpeedRange(); - void addSpeedChangedCb(std::function onChange); - void clearSpeedChangedCallbacks(); + void addSpeedChangedCb(void *key, std::function 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> speedChangedCallbacks_; + std::unordered_map> speedChangedCallbacks_; }; #endif