Add reload feature for updating pluings on-the-fly 04/217204/1
authorJi-hoon Lee <dalton.lee@samsung.com>
Mon, 4 Nov 2019 02:32:56 +0000 (11:32 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Thu, 7 Nov 2019 10:03:04 +0000 (19:03 +0900)
Change-Id: Ibf873b8861b22807f9b51f5f8e92efb82f8520ba

plugins/wakeup-manager/dependency-default/src/dependency_default_audio.cpp
plugins/wakeup-manager/src/wakeup_audio_manager.cpp
plugins/wakeup-manager/src/wakeup_engine_manager.cpp
plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp
src/multi_assistant_service.c
src/multi_assistant_service_plugin.c

index e803739..d1662c8 100644 (file)
@@ -17,6 +17,7 @@ static mas_proxy_interface g_proxy_interface;
 using namespace std;
 
 static audio_in_h g_audio_in = NULL;
+static audio_io_state_e g_audio_io_state = AUDIO_IO_STATE_IDLE;
 
 static sound_stream_info_h g_volume_stream = NULL;
 static virtual_sound_stream_h g_virtual_sound_stream = NULL;
@@ -111,6 +112,13 @@ static void _device_connection_changed_cb(sound_device_h device, bool isConnecte
        return;
 }
 
+static void _audio_in_state_changed_cb(audio_in_h handle, audio_io_state_e previous, audio_io_state_e current, bool by_policy, void *user_data)
+{
+       if (handle == g_audio_in) {
+               g_audio_io_state = current;
+       }
+}
+
 void dependency_default_audio_initialize(mas_proxy_interface interfaces)
 {
        const int rate = 16000;
@@ -155,12 +163,24 @@ void dependency_default_audio_initialize(mas_proxy_interface interfaces)
                return;
        }
 
+       ret = audio_in_set_state_changed_cb(g_audio_in, _audio_in_state_changed_cb, NULL);
+       if (AUDIO_IO_ERROR_NONE != ret) {
+               LOGE("[Recorder ERROR] Fail to set state changed callback : %d", ret);
+               sound_manager_remove_device_connection_changed_cb(g_device_id);
+               sound_manager_destroy_stream_information(g_stream_info);
+               g_stream_info = NULL;
+               audio_in_destroy(g_audio_in);
+               g_audio_in = NULL;
+               return;
+       }
+
        ret = audio_in_set_sound_stream_info(g_audio_in, g_stream_info);
        if (AUDIO_IO_ERROR_NONE != ret) {
                LOGE("[Recorder ERROR] Fail to set stream info : %d", ret);
                sound_manager_remove_device_connection_changed_cb(g_device_id);
                sound_manager_destroy_stream_information(g_stream_info);
                g_stream_info = NULL;
+               audio_in_unset_state_changed_cb(g_audio_in);
                audio_in_destroy(g_audio_in);
                g_audio_in = NULL;
                return;
@@ -177,6 +197,7 @@ void dependency_default_audio_initialize(mas_proxy_interface interfaces)
                sound_manager_remove_device_connection_changed_cb(g_device_id);
                sound_manager_destroy_stream_information(g_stream_info);
                g_stream_info = NULL;
+               audio_in_unset_state_changed_cb(g_audio_in);
                audio_in_destroy(g_audio_in);
                g_audio_in = NULL;
                return;
@@ -231,6 +252,11 @@ void dependency_default_audio_deinitialize()
        }
 
        if (g_audio_in) {
+               ret = audio_in_unset_state_changed_cb(g_audio_in);
+               if (AUDIO_IO_ERROR_NONE != ret) {
+                       LOGD("[Recorder ERROR] Fail to unset state changed callback : %d", ret);
+               }
+
                ret = audio_in_destroy(g_audio_in);
                if (AUDIO_IO_ERROR_NONE != ret) {
                        LOGD("[Recorder ERROR] Fail to destroy audio : %d", ret);
@@ -271,7 +297,10 @@ static void recorder_thread_func()
 void dependency_default_audio_start_recording()
 {
        if (g_audio_in) {
-               int ret = audio_in_resume(g_audio_in);
+               int ret = AUDIO_IO_ERROR_NONE;
+               if (AUDIO_IO_STATE_RUNNING != g_audio_io_state) {
+                       ret = audio_in_resume(g_audio_in);
+               }
                if (AUDIO_IO_ERROR_NONE != ret) {
                        LOGD("[Recorder ERROR] Fail to resume audio in : %d", ret);
                }
@@ -289,7 +318,10 @@ void dependency_default_audio_stop_recording()
                g_recorder_thread.join();
        }
        if (g_audio_in) {
-               int ret = audio_in_pause(g_audio_in);
+               int ret = AUDIO_IO_ERROR_NONE;
+               if (AUDIO_IO_STATE_RUNNING == g_audio_io_state) {
+                       ret = audio_in_pause(g_audio_in);
+               }
                if (AUDIO_IO_ERROR_NONE != ret) {
                        LOGD("[Recorder ERROR] Fail to pause audio in : %d", ret);
                }
index 8b68362..94ce56e 100644 (file)
@@ -68,6 +68,18 @@ int CAudioManager::initialize(void)
 
 int CAudioManager::deinitialize(void)
 {
+       clear_audio_data();
+       if (mStreamingThread.joinable()) {
+               MWR_LOGD("mStreamingThread is joinable, trying join()");
+               mStopStreamingThread.store(true);
+               try {
+                       mStreamingThread.join();
+               } catch (std::exception &e) {
+                       MWR_LOGE("Exception thrown : %s", e.what());
+               }
+       }
+       mStopStreamingThread.store(false);
+
        sound_manager_remove_focus_state_watch_cb(mSoundFocusWatchId);
 
        return 0;
index 5e1163c..ebc50a9 100644 (file)
@@ -76,6 +76,13 @@ void CWakeupEngineManager::initialize()
 
 void CWakeupEngineManager::deinitialize()
 {
+       if (mStreamingThread.joinable()) {
+               MWR_LOGD("mStreamingThread is joinable, trying join()");
+               mStopStreamingThread.store(true);
+               mStreamingThread.join();
+       }
+       mStopStreamingThread.store(false);
+
        for (auto& info : mEngineInfo) {
                try {
                        if (info.interface.set_wakeup_event_callback) {
index 1c72602..77549bb 100644 (file)
@@ -17,6 +17,8 @@
 #include "wakeup_manager_main.h"
 #include "wakeup_manager.h"
 
+#include <memory>
+
 using namespace multiassistant::wakeup;
 
 static wakeup_service_wakeup_event_cb g_wakeup_event_cb;
@@ -56,14 +58,29 @@ class CSettingValueObserver : public ISettingValueObserver
        void on_value_changed() override;
 };
 
-static CWakeupEventObserver g_wakeup_event_observer;
-static CSettingValueObserver g_setting_value_observer;
-static CWakeupManager g_wakeup_manager(&g_wakeup_event_observer, &g_setting_value_observer);
+static std::unique_ptr<CWakeupEventObserver> g_wakeup_event_observer;
+static std::unique_ptr<CSettingValueObserver> g_setting_value_observer;
+static std::unique_ptr<CWakeupManager> g_wakeup_manager;
 
 int wakeup_manager_initialize(void)
 {
        MWR_LOGD("[ENTER]");
 
+       try {
+               g_wakeup_event_observer.reset(new CWakeupEventObserver);
+               g_setting_value_observer.reset(new CSettingValueObserver);
+               if (NULL == g_wakeup_event_observer || NULL == g_setting_value_observer) {
+                       return -1;
+               }
+               g_wakeup_manager.reset(new CWakeupManager(g_wakeup_event_observer.get(), g_setting_value_observer.get()));
+               if (NULL == g_wakeup_manager) {
+                       return -1;
+               }
+       } catch (const std::exception& e) {
+               MWR_LOGE("Exception caught : %s", e.what());
+               return -1;
+       }
+
        g_wakeup_event_cb = NULL;
        g_wakeup_event_user_data = NULL;
 
@@ -82,7 +99,7 @@ int wakeup_manager_initialize(void)
        g_error_cb = NULL;
        g_error_user_data = NULL;
 
-       g_wakeup_manager.initialize();
+       g_wakeup_manager->initialize();
 
        MWR_LOGD("[END]");
        return 0;
@@ -92,7 +109,18 @@ int wakeup_manager_deinitialize(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.deinitialize();
+       if (nullptr == g_wakeup_manager) return -1;
+
+       try {
+               g_wakeup_manager->deinitialize();
+               g_wakeup_manager.reset();
+
+               g_wakeup_event_observer.reset();
+               g_setting_value_observer.reset();
+       } catch (const std::exception& e) {
+               MWR_LOGE("Exception caught : %s", e.what());
+               return -1;
+       }
 
        MWR_LOGD("[END]");
        return 0;
@@ -104,7 +132,9 @@ int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_si
                MWR_LOGD("[ERROR] Parameter is invalid, settings(%p), struct_size(%p)", settings, struct_size);
                return -1;
        }
-       CWakeupSettings* wakeup_settings = g_wakeup_manager.get_wakeup_settings();
+
+       if (nullptr == g_wakeup_manager) return -1;
+       CWakeupSettings* wakeup_settings = g_wakeup_manager->get_wakeup_settings();
        if (wakeup_settings) {
                const int PLUGIN_VERSION = 1;
                static ma_plugin_settings current_settings;
@@ -125,7 +155,9 @@ int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wake
                MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language);
                return -1;
        }
-       g_wakeup_manager.add_assistant_wakeup_word(
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->add_assistant_wakeup_word(
                string{appid}, string{wakeup_word}, (language ? string{language} : string{}));
 
        MWR_LOGD("[END]");
@@ -141,7 +173,8 @@ int wakeup_manager_add_assistant_language(const char* appid, const char* languag
                return -1;
        }
 
-       g_wakeup_manager.add_assistant_language(string{appid}, string{language});
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->add_assistant_language(string{appid}, string{language});
 
        MWR_LOGD("[DEBUG] language(%s)", language);
 
@@ -158,8 +191,9 @@ int wakeup_manager_set_assistant_wakeup_engine(const char* appid, const char* en
                return -1;
        }
 
+       if (nullptr == g_wakeup_manager) return -1;
        MWR_LOGD("[DEBUG] appid(%s), wakeup engine(%s)", appid, engine);
-       g_wakeup_manager.set_assistant_wakeup_engine(string{appid}, string{engine});
+       g_wakeup_manager->set_assistant_wakeup_engine(string{appid}, string{engine});
 
        MWR_LOGD("[END]");
        return 0;
@@ -174,8 +208,9 @@ int wakeup_manager_set_default_assistant(const char* appid)
                return -1;
        }
 
+       if (nullptr == g_wakeup_manager) return -1;
        MWR_LOGD("[DEBUG] default_assistant appid(%s)", appid);
-       g_wakeup_manager.set_default_assistant(string{appid});
+       g_wakeup_manager->set_default_assistant(string{appid});
 
        MWR_LOGD("[END]");
        return 0;
@@ -184,7 +219,9 @@ int wakeup_manager_set_default_assistant(const char* appid)
 int wakeup_manager_get_default_assistant(const char** appid)
 {
        static string default_assistant;
-       default_assistant = g_wakeup_manager.get_default_assistant();
+
+       if (nullptr == g_wakeup_manager) return -1;
+       default_assistant = g_wakeup_manager->get_default_assistant();
 
        if (default_assistant.empty()) {
                *appid = nullptr;
@@ -203,7 +240,8 @@ int wakeup_manager_set_language(const char* language)
                return -1;
        }
 
-       g_wakeup_manager.set_language(string{language});
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_language(string{language});
 
        MWR_LOGD("[END]");
        return 0;
@@ -211,7 +249,8 @@ int wakeup_manager_set_language(const char* language)
 
 int wakeup_manager_change_state(wakeup_manager_state_e state)
 {
-       g_wakeup_manager.change_manager_state(state);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->change_manager_state(state);
        return 0;
 }
 
@@ -219,7 +258,8 @@ int wakeup_manager_activate(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.activate();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->activate();
 
        MWR_LOGD("[END]");
        return 0;
@@ -229,7 +269,8 @@ int wakeup_manager_deactivate(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.deactivate();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->deactivate();
 
        MWR_LOGD("[END]");
        return 0;
@@ -246,7 +287,8 @@ int wakeup_manager_update_voice_feedback_state(const char* appid, int state)
                appid_string = appid;
        }
 
-       g_wakeup_manager.update_voice_feedback_state(appid_string, state);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->update_voice_feedback_state(appid_string, state);
 
        MWR_LOGD("[END]");
        return 0;
@@ -264,7 +306,8 @@ int wakeup_manager_send_assistant_specific_command(const char* appid, const char
        if (appid) appid_string = appid;
        if (command) command_string = command;
 
-       g_wakeup_manager.send_assistant_specific_command(appid_string, command_string);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->send_assistant_specific_command(appid_string, command_string);
 
        MWR_LOGD("[END]");
        return 0;
@@ -281,7 +324,8 @@ int wakeup_manager_set_background_volume(const char* appid, double ratio)
                appid_string = appid;
        }
 
-       g_wakeup_manager.set_background_volume(appid_string, ratio);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_background_volume(appid_string, ratio);
 
        MWR_LOGD("[END]");
        return 0;
@@ -297,7 +341,9 @@ int wakeup_manager_update_recognition_result(const char* appid, int result)
        } else {
                appid_string = appid;
        }
-       g_wakeup_manager.update_recognition_result(appid_string, result);
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->update_recognition_result(appid_string, result);
 
        MWR_LOGD("[END]");
        return 0;
@@ -307,7 +353,8 @@ int wakeup_manager_process_event(int event, void* data, int len)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.process_event(static_cast<ma_plugin_event_e>(event), data, len);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->process_event(static_cast<ma_plugin_event_e>(event), data, len);
 
        MWR_LOGD("[END]");
        return 0;
@@ -317,7 +364,8 @@ int wakeup_manager_start_streaming_utterance_data(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.start_streaming_utterance_data();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->start_streaming_utterance_data();
 
        MWR_LOGD("[END]");
        return 0;
@@ -327,7 +375,8 @@ int wakeup_manager_stop_streaming_utterance_data(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.stop_streaming_utterance_data();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->stop_streaming_utterance_data();
 
        MWR_LOGD("[END]");
        return 0;
@@ -337,7 +386,8 @@ int wakeup_manager_start_streaming_follow_up_data(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.start_streaming_follow_up_data();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->start_streaming_follow_up_data();
 
        MWR_LOGD("[END]");
        return 0;
@@ -347,7 +397,8 @@ int wakeup_manager_stop_streaming_follow_up_data(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.stop_streaming_follow_up_data();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->stop_streaming_follow_up_data();
 
        MWR_LOGD("[END]");
        return 0;
@@ -357,7 +408,8 @@ int wakeup_manager_start_streaming_previous_utterance_data(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.start_streaming_previous_utterance_data();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->start_streaming_previous_utterance_data();
 
        MWR_LOGD("[END]");
        return 0;
@@ -367,7 +419,8 @@ int wakeup_manager_stop_streaming_previous_utterance_data(void)
 {
        MWR_LOGD("[ENTER]");
 
-       g_wakeup_manager.stop_streaming_previous_utterance_data();
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->stop_streaming_previous_utterance_data();
 
        MWR_LOGD("[END]");
        return 0;
@@ -382,7 +435,8 @@ int wakeup_manager_get_audio_format(int* rate, int* channel, int* audio_type)
                return -1;
        }
 
-       g_wakeup_manager.get_audio_format(rate, channel, audio_type);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->get_audio_format(rate, channel, audio_type);
 
        MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type);
        return 0;
@@ -397,7 +451,8 @@ int wakeup_manager_get_audio_source_type(char** type)
                return -1;
        }
 
-       g_wakeup_manager.get_audio_source_type(type);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->get_audio_source_type(type);
 
        MWR_LOGD("[END] type(%s)", *type);
        return 0;
@@ -407,7 +462,8 @@ int wakeup_manager_set_wake_word_audio_require_flag(bool require)
 {
        MWR_LOGD("[ENTER] : %d", require);
 
-       g_wakeup_manager.set_wake_word_audio_require_flag(require);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_wake_word_audio_require_flag(require);
 
        MWR_LOGD("[END]");
        return 0;
@@ -543,7 +599,8 @@ int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streami
 
 int wakeup_manager_feed_audio_data(wakeup_speech_streaming_event_e event, void* buffer, int len)
 {
-       g_wakeup_manager.feed_audio_data(event, buffer, len);
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->feed_audio_data(event, buffer, len);
        return 0;
 }
 
index 35cc1ed..137c7de 100644 (file)
@@ -677,15 +677,8 @@ static void mas_active_state_changed_cb(keynode_t* key, void* data)
        }
 }
 
-static int init_wakeup(void)
+static int init_plugin(void)
 {
-       MAS_LOGD("[Enter] init_wakeup");
-
-       int ret = mas_dbus_open_connection();
-       if (0 != ret) {
-               MAS_LOGE("[ERROR] Fail to open connection");
-       }
-
        if (0 != multi_assistant_service_plugin_initialize()) {
                MAS_LOGE("Fail to ws intialize");
                return -1;
@@ -740,6 +733,18 @@ static int init_wakeup(void)
                return -1;
        }
 
+       return 0;
+}
+
+static int deinit_plugin(void)
+{
+       if (0 != multi_assistant_service_plugin_deinitialize()) {
+               MAS_LOGE("Fail to deinitialize");
+       }
+}
+
+static int process_multi_assistant_activated_setting()
+{
        if (0 == vconf_notify_key_changed(MULTI_ASSISTANT_SETTINGS_ACTIVATED, mas_active_state_changed_cb, NULL)) {
                /* Activate / deactivate according to the vconf key setting */
                mas_active_state_changed_cb(NULL, NULL);
@@ -761,6 +766,21 @@ static int init_wakeup(void)
                }
 #endif
        }
+       return 0;
+}
+
+static int init_wakeup(void)
+{
+       MAS_LOGD("[Enter] init_wakeup");
+
+       int ret = mas_dbus_open_connection();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to open connection");
+       }
+
+       init_plugin();
+
+       process_multi_assistant_activated_setting();
 
        mas_prelaunch_default_assistant();
 
@@ -786,6 +806,7 @@ static void deinit_wakeup(void)
                g_current_lang = NULL;
        }
 */
+       deinit_plugin();
 
        vconf_ignore_key_changed(MULTI_ASSISTANT_SETTINGS_ACTIVATED, mas_active_state_changed_cb);
 
@@ -793,10 +814,6 @@ static void deinit_wakeup(void)
        if (0 != ret) {
                MAS_LOGE("[ERROR] Fail to close connection");
        }
-
-       if (0 != multi_assistant_service_plugin_deinitialize()) {
-               MAS_LOGE("Fail to ws deinitialize");
-       }
 }
 
 int mas_get_current_client_pid()
@@ -1246,6 +1263,19 @@ void service_app_terminate(void *data)
 void service_app_control(app_control_h app_control, void *data)
 {
        // Todo: add your code here.
+       char *operation = NULL;
+       int ret = app_control_get_operation(app_control, &operation);
+       if (ret == APP_CONTROL_ERROR_NONE && operation) {
+               //strncmp(operation, APP_CONTROL_OPERATION_LAUNCH_ON_EVENT, strlen(operation)) == 0){
+               char* value = NULL;
+               app_control_get_extra_data(app_control, "event", &value);
+               LOGD("operation : %s , %s", operation, value);
+               if (value && 0 == strcmp(value, "reload")) {
+                       deinit_plugin();
+                       init_plugin();
+                       process_multi_assistant_activated_setting();
+               }
+       }
        return;
 }
 
index 8307104..b9f5f7a 100644 (file)
@@ -511,6 +511,8 @@ int multi_assistant_service_plugin_deinitialize(void)
                MAS_LOGD("[Recorder ERROR] File not found!");
        }
 #endif
+       multi_assistant_service_plugin_deactivate();
+
        int ret = -1;
        if (NULL != g_handle) {
                wakeup_manager_deinitialize func = _wakeup_manager_interface.deinitialize;