typedef void (*wakeup_service_voice_key_status_changed_cb)(ma_voice_key_status_e status, void* user_data);
+typedef void (*wakeup_service_loaded_engine_changed_cb)(void *user_data);
+
#define MAX_WAKEUP_WORDS_NUM 255
#define MAX_WAKEUP_WORD_LEN 32
#define MAX_SUPPORTED_LANGUAGES_NUM 255
bool app_create(void *data);
void app_terminate(void *data);
+ void app_restart();
int initialize_service_plugin(void);
int deinitialize_service_plugin(void);
int set_wakeup_engine_command_callback(wakeup_service_wakeup_engine_command_cb callback, void* user_data);
int set_wakeup_service_state_changed_callback(wakeup_service_wakeup_service_state_changed_cb callback, void* user_data);
int set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data);
+ int set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data);
bool is_ui_panel_enabled();
typedef int (*wakeup_manager_set_wakeup_service_state_changed_callback)(wakeup_service_wakeup_service_state_changed_cb callback, void* user_data);
#define MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_STATUS_CHANGED_CALLBACK "wakeup_manager_set_voice_key_status_changed_callback"
typedef int (*wakeup_manager_set_voice_key_status_changed_callback)(wakeup_service_voice_key_status_changed_cb callback, void* user_data);
+#define MA_WAKEUP_MANAGER_FUNC_SET_LOADED_ENGINE_CHANGED_CALLBACK "wakeup_manager_set_loaded_engine_changed_callback"
+typedef int (*wakeup_manager_set_loaded_engine_changed_callback)(wakeup_service_loaded_engine_changed_cb callback, void* user_data);
typedef struct {
wakeup_manager_initialize initialize;
wakeup_manager_set_wakeup_engine_command_callback set_wakeup_engine_command_callback;
wakeup_manager_set_wakeup_service_state_changed_callback set_wakeup_service_state_changed_callback;
wakeup_manager_set_voice_key_status_changed_callback set_voice_key_status_changed_callback;
+ wakeup_manager_set_loaded_engine_changed_callback set_loaded_engine_changed_callback;
} wakeup_manager_interface;
#endif /* __SERVICE_PLUGIN_INTERFACE_H__ */
public:
virtual ~ISettingValueObserver() = default;
virtual void on_value_changed() = 0;
+ virtual void on_loaded_wakeup_engine_changed() = 0;
};
/* If a wakeup event is raised by pressing a voice key,
bool on_voice_input_language_changed(const char* language) override;
bool on_assistant_enabled_info_changed(const char* appid, bool enabled) override;
bool on_default_assistant_appid_changed(const char* appid) override;
+ bool on_multiple_mode_changed() override;
void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
private:
typedef void (*wakeup_service_voice_key_status_changed_cb)(ma_voice_key_status_e state, void* user_data);
+typedef void (*wakeup_service_loaded_engine_changed_cb)(void* user_data);
+
typedef struct {
int plugin_version;
bool ui_panel_enabled;
EXPORT_API int wakeup_manager_set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data);
+EXPORT_API int wakeup_manager_set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data);
+
/* Internal API declarations for dependency modules */
int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
virtual bool on_voice_input_language_changed(const char* language) = 0;
virtual bool on_assistant_enabled_info_changed(const char* appid, bool enabled) = 0;
virtual bool on_default_assistant_appid_changed(const char* appid) = 0;
+ virtual bool on_multiple_mode_changed() = 0;
};
class CWakeupSettings
{
MWR_LOGI("[ENTER] %s %s", appid.c_str(), engine.c_str());
- mWakeupEngineManager.engine_add_target_assistant(engine, appid);
+ bool found = false;
+ if (mWakeupSettings.get_multiple_mode()) {
+ vector<string> assistants = mWakeupSettings.get_enabled_assistants();
+ auto iter = find(assistants.begin(), assistants.end(), appid);
+ if (iter != assistants.end())
+ found = true;
+ } else {
+ if (0 == appid.compare(mWakeupSettings.get_default_assistant_appid()))
+ found = true;
+ }
+
+ if (found)
+ mWakeupEngineManager.engine_add_target_assistant(engine, appid);
MWR_LOGD("[END]");
return true;
mWakeupManager->set_assistant_enabled(std::string(appid), enabled);
vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
for (const auto& observer : observers) {
- observer->on_value_changed();
+ if (mWakeupManager->get_wakeup_settings()->get_multiple_mode())
+ observer->on_loaded_wakeup_engine_changed();
+ else
+ observer->on_value_changed();
}
return true;
}
mWakeupManager->process_default_assistant_changed(std::string(appid), false);
vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
for (const auto& observer : observers) {
- observer->on_value_changed();
+ if (mWakeupManager->get_wakeup_settings()->get_multiple_mode())
+ observer->on_value_changed();
+ else
+ observer->on_loaded_wakeup_engine_changed();
+ }
+ return true;
+}
+
+bool CWakeupManager::CSettingsEventObserver::on_multiple_mode_changed()
+{
+ if (nullptr == mWakeupManager) return false;
+ vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+ for (const auto& observer : observers) {
+ observer->on_loaded_wakeup_engine_changed();
}
return true;
}
static wakeup_service_voice_key_status_changed_cb g_wakeup_service_voice_key_status_changed_cb;
static void *g_wakeup_service_voice_key_status_changed_user_data;
+static wakeup_service_loaded_engine_changed_cb g_loaded_engine_changed_cb;
+static void *g_loaded_engine_changed_user_data;
+
class CWakeupEventObserver : public IWakeupEventObserver
{
void on_wakeup(mas_wakeup_event_info wakeup_info) override;
class CSettingValueObserver : public ISettingValueObserver
{
void on_value_changed() override;
+ void on_loaded_wakeup_engine_changed() override;
};
static std::unique_ptr<CWakeupEventObserver> g_wakeup_event_observer;
g_wakeup_service_voice_key_status_changed_cb = NULL;
g_wakeup_service_voice_key_status_changed_user_data = NULL;
+ g_loaded_engine_changed_cb = NULL;
+ g_loaded_engine_changed_user_data = NULL;
+
g_wakeup_manager->initialize();
MWR_LOGD("[END]");
return 0;
}
+int wakeup_manager_set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data)
+{
+ MWR_LOGI("[ENTER]");
+
+ if (NULL == callback) {
+ MWR_LOGE("[ERROR] Input parameter is NULL");
+ return -1;
+ }
+
+ g_loaded_engine_changed_cb = callback;
+ g_loaded_engine_changed_user_data = user_data;
+
+ MWR_LOGD("[END]");
+ return 0;
+}
+
int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len)
{
if (nullptr == g_wakeup_manager) return -1;
g_setting_changed_cb(g_setting_changed_user_data);
}
}
+
+void CSettingValueObserver::on_loaded_wakeup_engine_changed()
+{
+ if (g_loaded_engine_changed_cb) {
+ g_loaded_engine_changed_cb(g_loaded_engine_changed_user_data);
+ }
+}
}
}
+static void wakeup_setting_multiple_mode_changed_cb(keynode_t* node, void* data)
+{
+ MWR_LOGD("[ENTER]");
+
+ CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
+ if (nullptr == settings) return;
+
+ const auto& observers = settings->get_observers();
+ for (const auto& observer : observers) {
+ if (observer) {
+ if (!observer->on_multiple_mode_changed()) {
+ LOGW("[Settings WARNING] One of the observer returned false");
+ }
+ }
+ }
+}
+
void CWakeupSettings::initialize()
{
int vconf_ret;
vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS,
wakeup_setting_enabled_assistants_changed_cb, this);
}
+ vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE,
+ wakeup_setting_multiple_mode_changed_cb, this);
}
void CWakeupSettings::deinitialize()
vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS,
wakeup_setting_enabled_assistants_changed_cb);
}
+ vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE,
+ wakeup_setting_multiple_mode_changed_cb);
}
void CWakeupSettings::subscribe(ISettingsEventObserver *observer)
return;
}
+void CServiceMain::app_restart()
+{
+ service_app_exit();
+}
+
int CServiceMain::on_initialize(pid_t pid, std::string sender_info) {
MAS_LOGD("[Enter] pid(%d)", pid);
}
}
+static void __loaded_engine_changed_cb(void* user_data)
+{
+ MAS_LOGD("[SUCCESS] __loaded_engine_changed_cb is called");
+
+ CServicePlugin *plugin = static_cast<CServicePlugin*>(user_data);
+ if (nullptr == plugin) return;
+
+ CServiceMain* service_main = plugin->get_service_main();
+ if (service_main) {
+ service_main->app_restart();
+ }
+}
+
int CServicePlugin::initialize(void)
{
MAS_LOGD("[Enter]");
mWakeupManagerInterface.set_voice_key_status_changed_callback =
(wakeup_manager_set_voice_key_status_changed_callback)dlsym(mPluginHandle,
MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_STATUS_CHANGED_CALLBACK);
+ mWakeupManagerInterface.set_loaded_engine_changed_callback =
+ (wakeup_manager_set_loaded_engine_changed_callback)dlsym(mPluginHandle,
+ MA_WAKEUP_MANAGER_FUNC_SET_LOADED_ENGINE_CHANGED_CALLBACK);
int ret = -1;
if (NULL != mPluginHandle) {
return ret;
}
+ ret = set_loaded_engine_changed_callback(__loaded_engine_changed_cb, this);
+ if (0 != ret) {
+ MAS_LOGE("Fail to set loaded engine changed cb");
+ return ret;
+ }
+
return 0;
}
return ret;
}
+int CServicePlugin::set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data)
+{
+ int ret = -1;
+ if (NULL != mPluginHandle) {
+ wakeup_manager_set_loaded_engine_changed_callback func = mWakeupManagerInterface.set_loaded_engine_changed_callback;
+ if (NULL == func) {
+ MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_LOADED_ENGINE_CHANGED_CALLBACK);
+ } else {
+ ret = func(callback, user_data);
+ if (0 != ret) {
+ MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
+ }
+ }
+ }
+ return ret;
+}