Add change system volume feature
authorJi-hoon Lee <dalton.lee@samsung.com>
Tue, 16 Apr 2019 10:49:46 +0000 (19:49 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Thu, 2 May 2019 11:16:47 +0000 (20:16 +0900)
Change-Id: I79ae89a3c5d46debdaf1f32b5856701c67c72762

13 files changed:
inc/multi_assistant_main.h
inc/multi_assistant_service_plugin.h
plugins/wakeup-manager/inc/wakeup_audio_manager.h
plugins/wakeup-manager/inc/wakeup_manager.h
plugins/wakeup-manager/inc/wakeup_manager_wrapper.h
plugins/wakeup-manager/src/wakeup_audio_manager.cpp
plugins/wakeup-manager/src/wakeup_manager.cpp
plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp
src/multi_assistant_dbus.c
src/multi_assistant_dbus_server.c
src/multi_assistant_dbus_server.h
src/multi_assistant_service.c
src/multi_assistant_service_plugin.c

index a07013d..d4e572a 100644 (file)
@@ -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"
index 796e5cc..83c3660 100644 (file)
@@ -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;
index f791b17..ba07975 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <audio_io.h>
 #include <sound_manager.h>
+#include <sound_manager_internal.h>
 
 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};
 
index 49d3af1..c6ca42c 100644 (file)
@@ -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);
index 8ecf262..ddb030c 100644 (file)
@@ -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);
index 7977c2e..cd6f69a 100644 (file)
@@ -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
index 10d052f..72968a2 100644 (file)
@@ -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]");
index 29d3844..e15e73b 100644 (file)
@@ -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]");
index a104acf..c17d21b 100644 (file)
@@ -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);
 
index 0d0712c..a1daa33 100644 (file)
@@ -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;
index 83703d0..a626d11 100644 (file)
@@ -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);
index 4dc0376..84ac806 100644 (file)
@@ -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);
index a78135a..43b5fdb 100644 (file)
@@ -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;