Postpone voice key release event emission until streaming completes 74/285474/1
authorJi-hoon Lee <dalton.lee@samsung.com>
Fri, 9 Dec 2022 03:02:07 +0000 (12:02 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Fri, 9 Dec 2022 03:02:07 +0000 (12:02 +0900)
Change-Id: I5931b2502c06fc645188a20c71a6ea1776ce7e63

plugins/wakeup-manager/inc/wakeup_manager.h
plugins/wakeup-manager/src/dependency_resolver.cpp
plugins/wakeup-manager/src/wakeup_manager.cpp

index fda6b2a88431877084805318c3eeba53081f0835..77e843708ccd756f0493959eacc0b7998cd004f7 100644 (file)
@@ -155,6 +155,11 @@ public:
        void start_periodic_monitor_timer();
        void stop_periodic_monitor_timer();
 
+       void update_voice_key_status(ma_voice_key_status_e status);
+       void update_pending_voice_key_status();
+
+       void start_voice_key_status_update_timer();
+       void set_streaming_completed(bool completed);
 private:
        class CEngineEventObserver : public IEngineEventObserver
        {
@@ -256,6 +261,11 @@ private:
 
        mas_wakeup_event_info mLastWakeupEventInfo;
 
+       boost::optional<ma_voice_key_status_e> mPendingVoiceKeyStatus;
+       atomic_bool mStreamingCompleted{false};
+       Ecore_Timer *mVoiceKeyStatusUpdateTimer{nullptr};
+       mutex mVoiceKeyStatusUpdateMutex;
+
        mutex mMutex;
 };
 
index c8892cc67ca27c8e326bc4288802b0480de5fd10..abacd599aa89fd762839aef971fa19f36240b881 100644 (file)
@@ -488,4 +488,4 @@ int dependency_resolver_get_custom_vconf_key(const char* default_key, char** cus
        }
 
        return ret;
-}
\ No newline at end of file
+}
index ddbb8a20718446ae45cdfa9be966310694fe7270..79bd057436fc6b0df07e8e626fd47a7eb456f319 100644 (file)
@@ -681,15 +681,87 @@ bool CWakeupManager::process_plugin_event(mas_plugin_event_e event, void* data,
        }
 
        if (next_voice_key_status) {
-               for (const auto& observer : mWakeupObservers) {
-                       observer->on_voice_key_status_changed(*next_voice_key_status);
-               }
+               update_voice_key_status(*next_voice_key_status);
        }
 
        MWR_LOGD("[END]");
        return true;
 }
 
+void CWakeupManager::set_streaming_completed(bool completed)
+{
+       MWR_LOGI("[ENTER] : %d", completed);
+       mStreamingCompleted.store(completed);
+
+       /* When Streaming completes, update pending voice key status */
+       update_pending_voice_key_status();
+}
+
+void CWakeupManager::start_voice_key_status_update_timer()
+{
+       const float VOICE_KEY_STATUS_UPDATE_INTERVAL = 5.0f;
+
+       if (mVoiceKeyStatusUpdateTimer) {
+               ecore_timer_del(mVoiceKeyStatusUpdateTimer);
+       }
+
+       mVoiceKeyStatusUpdateTimer = ecore_timer_add(VOICE_KEY_STATUS_UPDATE_INTERVAL,
+               [](void *data) {
+                       MAS_LOGE("voice_key_status_update_timer expired");
+                       auto manager = static_cast<CWakeupManager*>(data);
+                       manager->update_pending_voice_key_status();
+                       return ECORE_CALLBACK_CANCEL;
+               }, static_cast<void*>(this));
+}
+
+void CWakeupManager::update_pending_voice_key_status()
+{
+       MAS_LOGI("[ENTER]");
+       if (mVoiceKeyStatusUpdateTimer) {
+               ecore_timer_del(mVoiceKeyStatusUpdateTimer);
+               mVoiceKeyStatusUpdateTimer = nullptr;
+       }
+       if (mPendingVoiceKeyStatus) {
+               for (const auto& observer : mWakeupObservers) {
+                       observer->on_voice_key_status_changed(*mPendingVoiceKeyStatus);
+               }
+               mPendingVoiceKeyStatus = boost::none;
+       }
+}
+
+void CWakeupManager::update_voice_key_status(ma_voice_key_status_e status)
+{
+       MWR_LOGI("status : %d", status);
+       if (mPendingVoiceKeyStatus) {
+               for (const auto& observer : mWakeupObservers) {
+                       observer->on_voice_key_status_changed(*mPendingVoiceKeyStatus);
+               }
+               mPendingVoiceKeyStatus = boost::none;
+       }
+
+       /* If streaming has not been completed yet after pressed event,
+        * postpone the status update until streaming is completed */
+       bool postpone = false;
+       if (status == MA_VOICE_KEY_STATUS_RELEASED_AFTER_PUSH) {
+               if (!mStreamingCompleted.load()) {
+                       postpone = true;
+               }
+       }
+
+       if (postpone) {
+               mPendingVoiceKeyStatus = status;
+               start_voice_key_status_update_timer();
+       } else {
+               for (const auto& observer : mWakeupObservers) {
+                       observer->on_voice_key_status_changed(status);
+               }
+       }
+
+       if (status == MA_VOICE_KEY_STATUS_PRESSED) {
+               mStreamingCompleted.store(false);
+       }
+}
+
 vector<IWakeupEventObserver*> CWakeupManager::get_wakeup_observers()
 {
        return mWakeupObservers;
@@ -1265,6 +1337,8 @@ bool CWakeupManager::CAudioEventObserver::on_streaming_audio_data(
        if (MAS_SPEECH_STREAMING_EVENT_FINISH == event) {
                mWakeupManager->set_streaming_mode(STREAMING_MODE::NONE);
                mWakeupManager->stop_streaming_duration_timer();
+
+               mWakeupManager->set_streaming_completed(true);
        }
 
        return true;