From c19ce9dfbd35308b7f35ed9060432c26507fa165 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Tue, 16 Apr 2019 19:49:46 +0900 Subject: [PATCH] Add change system volume feature Change-Id: I79ae89a3c5d46debdaf1f32b5856701c67c72762 --- inc/multi_assistant_main.h | 1 + inc/multi_assistant_service_plugin.h | 5 ++ .../wakeup-manager/inc/wakeup_audio_manager.h | 7 ++ plugins/wakeup-manager/inc/wakeup_manager.h | 1 + .../inc/wakeup_manager_wrapper.h | 7 ++ .../src/wakeup_audio_manager.cpp | 78 +++++++++++++++++++ plugins/wakeup-manager/src/wakeup_manager.cpp | 14 ++++ .../src/wakeup_manager_wrapper.cpp | 15 ++++ src/multi_assistant_dbus.c | 4 + src/multi_assistant_dbus_server.c | 31 ++++++++ src/multi_assistant_dbus_server.h | 2 + src/multi_assistant_service.c | 6 ++ src/multi_assistant_service_plugin.c | 22 ++++++ 13 files changed, 193 insertions(+) diff --git a/inc/multi_assistant_main.h b/inc/multi_assistant_main.h index a07013d..d4e572a 100644 --- a/inc/multi_assistant_main.h +++ b/inc/multi_assistant_main.h @@ -61,6 +61,7 @@ #define MA_METHOD_STOP_STREAMING_AUDIO_DATA "ma_method_stop_streaming_audio_data" #define MA_METHOD_UPDATE_VOICE_FEEDBACK_STATE "ma_method_update_voice_feedback_state" #define MA_METHOD_SEND_ASSISTANT_SPECIFIC_COMMAND "ma_method_send_assistant_specific_command" +#define MA_METHOD_CHANGE_SYSTEM_VOLUME "ma_method_change_system_volume" #define MA_METHOD_ERROR "ma_method_error" #define MA_UI_METHOD_INITIALIZE "ma_ui_method_initialize" diff --git a/inc/multi_assistant_service_plugin.h b/inc/multi_assistant_service_plugin.h index 796e5cc..83c3660 100644 --- a/inc/multi_assistant_service_plugin.h +++ b/inc/multi_assistant_service_plugin.h @@ -54,6 +54,8 @@ int multi_assistant_service_plugin_update_voice_feedback_state(const char* appid int multi_assistant_service_plugin_send_assistant_specific_command(const char *appid, const char* command); +int multi_assistant_service_plugin_change_system_volume(const char *appid, int event); + int multi_assistant_service_plugin_update_result_state(const char* appid, int state); int multi_assistant_service_plugin_process_event(int event, void* data, int len); @@ -113,6 +115,8 @@ typedef int (*wakeup_manager_deactivate)(void); typedef int (*wakeup_manager_update_voice_feedback_state)(const char* appid, int state); #define MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND "wakeup_manager_send_assistant_specific_command" typedef int (*wakeup_manager_send_assistant_specific_command)(const char* appid, const char* command); +#define MA_WAKEUP_MANAGER_FUNC_CHANGE_SYSTEM_VOLUME "wakeup_manager_change_system_volume" +typedef int (*wakeup_manager_change_system_volume)(const char* appid, int event); #define MA_WAKEUP_MANAGER_FUNC_UPDATE_RESULT_STATE "wakeup_manager_update_result_state" typedef int (*wakeup_manager_update_result_state)(const char* appid, int state); #define MA_WAKEUP_MANAGER_FUNC_PROCESS_EVENT "wakeup_manager_process_event" @@ -156,6 +160,7 @@ typedef struct { wakeup_manager_deactivate deactivate; wakeup_manager_update_voice_feedback_state update_voice_feedback_state; wakeup_manager_send_assistant_specific_command send_assistant_specific_command; + wakeup_manager_change_system_volume change_system_volume; wakeup_manager_update_result_state update_result_state; wakeup_manager_process_event process_event; wakeup_manager_start_streaming_utterance_data start_streaming_utterance_data; diff --git a/plugins/wakeup-manager/inc/wakeup_audio_manager.h b/plugins/wakeup-manager/inc/wakeup_audio_manager.h index f791b17..ba07975 100644 --- a/plugins/wakeup-manager/inc/wakeup_audio_manager.h +++ b/plugins/wakeup-manager/inc/wakeup_audio_manager.h @@ -28,6 +28,7 @@ #include #include +#include namespace multiassistant { @@ -83,6 +84,9 @@ public: void voice_key_pressed_set(bool pressed); bool voice_key_pressed_get(); + + void change_system_volume(); + void recover_system_volume(); private: void recorder_thread_func(void); void streaming_speech_data_thread_func(); @@ -93,6 +97,9 @@ private: audio_in_h mAudioIn{nullptr}; sound_stream_info_h mStreamInfo{nullptr}; + sound_stream_info_h mVolumeStream{nullptr}; + virtual_sound_stream_h mVirtualSoundStream{nullptr}; + thread mRecorderThread; atomic_bool mStopRecorderThread{false}; diff --git a/plugins/wakeup-manager/inc/wakeup_manager.h b/plugins/wakeup-manager/inc/wakeup_manager.h index 49d3af1..c6ca42c 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager.h +++ b/plugins/wakeup-manager/inc/wakeup_manager.h @@ -73,6 +73,7 @@ public: bool update_voice_feedback_state(string appid, bool state); bool send_assistant_specific_command(string appid, string command); + bool change_system_volume(string appid, int event); bool update_result_state(string appid, int state); bool process_event(ma_plugin_event_e event, void* data, int len); bool get_audio_format(int* rate, int* channel, int* audio_type); diff --git a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h index 8ecf262..ddb030c 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h +++ b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h @@ -84,6 +84,11 @@ typedef enum { MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, } ma_plugin_event_e; +typedef enum { + MA_SYSTEM_VOLUME_EVENT_CHANGE, + MA_SYSTEM_VOLUME_EVENT_RECOVER +} ma_system_volume_event_e; + EXPORT_API int wakeup_manager_initialize(void); EXPORT_API int wakeup_manager_deinitialize(void); @@ -106,6 +111,8 @@ EXPORT_API int wakeup_manager_update_voice_feedback_state(const char *appid, int EXPORT_API int wakeup_manager_send_assistant_specific_command(const char* appid, const char* command); +EXPORT_API int wakeup_manager_change_system_volume(const char *appid, int event); + EXPORT_API int wakeup_manager_update_result_state(const char *appid, int state); EXPORT_API int wakeup_manager_process_event(int event, void* data, int len); diff --git a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp index 7977c2e..cd6f69a 100644 --- a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp @@ -228,6 +228,22 @@ int CAudioManager::deinitialize(void) bt_hid_host_deinitialize(); bt_product_deinit(); #else + if (mVirtualSoundStream) { + sound_manager_stop_virtual_stream(mVirtualSoundStream); + ret = sound_manager_destroy_virtual_stream(mVirtualSoundStream); + if (0 != ret) { + MWR_LOGD("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret); + } + mVirtualSoundStream = NULL; + } + if (mVolumeStream) { + ret = sound_manager_destroy_stream_information(mVolumeStream); + if (0 != ret) { + MWR_LOGD("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret); + } + mVolumeStream = NULL; + } + int ret = 0; ret = audio_in_unprepare(mAudioIn); if (AUDIO_IO_ERROR_NONE != ret) { @@ -649,6 +665,13 @@ void CAudioManager::voice_key_pressed_set(bool pressed) if (true == mVoiceKeyPressed && false == pressed) { bt_hid_rc_stop_sending_voice(NULL); } + if (pressed != mVoiceKeyPressed) { + if (pressed) { + change_system_volume(); + } else { + recover_system_volume(); + } + } #endif mVoiceKeyPressed = pressed; } @@ -658,5 +681,60 @@ bool CAudioManager::voice_key_pressed_get() return mVoiceKeyPressed; } +void CAudioManager::change_system_volume() +{ + int ret; + + if (!mVolumeStream) { + ret = sound_manager_create_stream_information_internal(SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &mVolumeStream); + if (0 != ret) { + MWR_LOGD("[Audio] Fail to create stream information, ret(%d)", ret); + return; + } + } + + if (!mVirtualSoundStream) { + ret = sound_manager_create_virtual_stream(mVolumeStream, &mVirtualSoundStream); + if (0 != ret) { + MWR_LOGD("[Audio ERROR] Fail to create virtual stream, ret(%d)", ret); + return; + } + } + if (mVirtualSoundStream) { + ret = sound_manager_start_virtual_stream(mVirtualSoundStream); + if (0 != ret) { + MWR_LOGD("[Audio ERROR] Fail to start virtual stream, ret(%d)", ret); + return; + } + } +} + +void CAudioManager::recover_system_volume() +{ + int ret; + + if (mVirtualSoundStream) { + ret = sound_manager_stop_virtual_stream(mVirtualSoundStream); + if (0 != ret) { + MWR_LOGD("[Audio ERROR] Fail to stop virtual stream, ret(%d)", ret); + } + ret = sound_manager_destroy_virtual_stream(mVirtualSoundStream); + if (0 != ret) { + MWR_LOGD("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret); + return; + } + mVirtualSoundStream = NULL; + } + + if (mVolumeStream) { + ret = sound_manager_destroy_stream_information(mVolumeStream); + if (0 != ret) { + MWR_LOGD("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret); + return; + } + mVolumeStream = NULL; + } +} + } // wakeup } // multiassistant diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp index 10d052f..72968a2 100644 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager.cpp @@ -384,6 +384,20 @@ bool CWakeupManager::send_assistant_specific_command(string appid, string comman return true; } +bool CWakeupManager::change_system_volume(string appid, int event) +{ + MWR_LOGD("[DEBUG] change system volume, system volume event(%d)", event); + + int ret = 0; + if (MA_SYSTEM_VOLUME_EVENT_CHANGE == event) { + mAudioManager.change_system_volume(); + } else if (MA_SYSTEM_VOLUME_EVENT_RECOVER == event) { + mAudioManager.recover_system_volume(); + } + + return ret; +} + bool CWakeupManager::update_result_state(string appid, int state) { MWR_LOGD("[ENTER]"); diff --git a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp index 29d3844..e15e73b 100644 --- a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp @@ -217,6 +217,21 @@ int wakeup_manager_send_assistant_specific_command(const char* appid, const char return 0; } +int wakeup_manager_change_system_volume(const char* appid, int event) +{ + MWR_LOGD("[ENTER]"); + + if (NULL == appid) { + MWR_LOGD("[ERROR] Parameter is invalid, appid(%s)", appid); + return -1; + } + + g_wakeup_manager.change_system_volume(string{appid}, event); + + MWR_LOGD("[END]"); + return 0; +} + int wakeup_manager_update_result_state(const char* appid, int state) { MWR_LOGD("[ENTER]"); diff --git a/src/multi_assistant_dbus.c b/src/multi_assistant_dbus.c index a104acf..c17d21b 100644 --- a/src/multi_assistant_dbus.c +++ b/src/multi_assistant_dbus.c @@ -688,6 +688,10 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_SEND_ASSISTANT_SPECIFIC_COMMAND)) { ma_service_dbus_send_assistant_specific_command(g_conn_listener, msg); + + } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_METHOD_CHANGE_SYSTEM_VOLUME)) { + ma_service_dbus_change_system_volume(g_conn_listener, msg); + } else if (dbus_message_is_method_call(msg, MA_SERVER_SERVICE_INTERFACE, MA_UI_METHOD_INITIALIZE)) { ma_service_ui_dbus_initialize(g_conn_listener, msg); diff --git a/src/multi_assistant_dbus_server.c b/src/multi_assistant_dbus_server.c index 0d0712c..a1daa33 100644 --- a/src/multi_assistant_dbus_server.c +++ b/src/multi_assistant_dbus_server.c @@ -469,6 +469,37 @@ int ma_service_dbus_send_assistant_specific_command(DBusConnection* conn, DBusMe return 0; } +int ma_service_dbus_change_system_volume(DBusConnection* conn, DBusMessage* msg) +{ + DBusError err; + dbus_error_init(&err); + + int pid; + int ret = 0; + int event; + + dbus_message_get_args(msg, &err, + DBUS_TYPE_INT32, &pid, + DBUS_TYPE_INT32, &event, + DBUS_TYPE_INVALID); + + MAS_LOGD("[DEBUG] MAS CHANGE SYSTEM VOLUME"); + + if (dbus_error_is_set(&err)) { + MAS_LOGE("[IN ERROR] mas change system volume : Get arguments error (%s)", err.message); + dbus_error_free(&err); + ret = -1; //MAS_ERROR_OPERATION_FAILED; + } else { + MAS_LOGD("[IN] mas change system volume : pid(%d), event(%d)", pid, event); + ret = mas_client_change_system_volume(pid, event); + } + + MAS_LOGD("<<<<<"); + MAS_LOGD(" "); + + return 0; +} + int ma_service_ui_dbus_initialize(DBusConnection* conn, DBusMessage* msg) { DBusError err; diff --git a/src/multi_assistant_dbus_server.h b/src/multi_assistant_dbus_server.h index 83703d0..a626d11 100644 --- a/src/multi_assistant_dbus_server.h +++ b/src/multi_assistant_dbus_server.h @@ -45,6 +45,8 @@ int ma_service_dbus_update_voice_feedback_state(DBusConnection* conn, DBusMessag int ma_service_dbus_send_assistant_specific_command(DBusConnection* conn, DBusMessage* msg); +int ma_service_dbus_change_system_volume(DBusConnection* conn, DBusMessage* msg); + int ma_service_ui_dbus_initialize(DBusConnection* conn, DBusMessage* msg); int ma_service_ui_dbus_deinitialize(DBusConnection* conn, DBusMessage* msg); diff --git a/src/multi_assistant_service.c b/src/multi_assistant_service.c index 4dc0376..84ac806 100644 --- a/src/multi_assistant_service.c +++ b/src/multi_assistant_service.c @@ -348,6 +348,12 @@ int mas_client_send_assistant_specific_command(int pid, const char *command) return 0; } +int mas_client_change_system_volume(int pid, int event) +{ + multi_assistant_service_plugin_change_system_volume(NULL, event); + return 0; +} + int mas_client_update_result_state(int pid, int state) { multi_assistant_service_plugin_update_result_state(NULL, state); diff --git a/src/multi_assistant_service_plugin.c b/src/multi_assistant_service_plugin.c index a78135a..43b5fdb 100644 --- a/src/multi_assistant_service_plugin.c +++ b/src/multi_assistant_service_plugin.c @@ -300,6 +300,9 @@ int multi_assistant_service_plugin_initialize(void) _wakeup_manager_interface.send_assistant_specific_command = (wakeup_manager_send_assistant_specific_command)dlsym(g_handle, MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND); + _wakeup_manager_interface.change_system_volume = + (wakeup_manager_change_system_volume)dlsym(g_handle, + MA_WAKEUP_MANAGER_FUNC_CHANGE_SYSTEM_VOLUME); _wakeup_manager_interface.update_result_state = (wakeup_manager_update_result_state)dlsym(g_handle, MA_WAKEUP_MANAGER_FUNC_UPDATE_RESULT_STATE); @@ -566,6 +569,25 @@ int multi_assistant_service_plugin_send_assistant_specific_command(const char* a return ret; } +int multi_assistant_service_plugin_change_system_volume(const char* appid, int event) +{ + int ret = -1; + if (NULL != g_handle) { + wakeup_manager_change_system_volume func = _wakeup_manager_interface.change_system_volume; + if (NULL == func) { + MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_CHANGE_SYSTEM_VOLUME); + } else { + ret = func(appid, event); + if (0 != ret) { + MAS_LOGE("[ERROR] Fail to change system volume, ret(%d)", ret); + } + } + } else { + MAS_LOGE("[ERROR] g_handle is not valid"); + } + return ret; +} + int multi_assistant_service_plugin_update_result_state(const char* appid, int state) { int ret = -1; -- 2.34.1