#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"
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);
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"
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;
#include <audio_io.h>
#include <sound_manager.h>
+#include <sound_manager_internal.h>
namespace multiassistant
{
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();
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};
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);
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);
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);
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) {
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;
}
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
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]");
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]");
} 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);
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;
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);
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);
_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);
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;