From: Jaechul Lee Date: Wed, 17 Mar 2021 05:46:34 +0000 (+0900) Subject: Add Acoustic Echo Cancellation internal api X-Git-Tag: submit/tizen/20210423.055047^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=684c7638943606e2c4709fbbde6c47416ab63388;p=platform%2Fcore%2Fapi%2Fsound-manager.git Add Acoustic Echo Cancellation internal api [Version] 0.6.33 [Issue Type] New feature Change-Id: I7525a88b8253c2487d843d21d9fdcb428a93bec0 Signed-off-by: Jaechul Lee --- diff --git a/include/sound_manager_internal.h b/include/sound_manager_internal.h index 8f00a13..934e881 100644 --- a/include/sound_manager_internal.h +++ b/include/sound_manager_internal.h @@ -1197,6 +1197,33 @@ int sound_manager_start_discover_remote_device(void); */ int sound_manager_stop_discover_remote_device(void); +/** + * @internal + * @brief Starts AEC(Acoustic Echo Cancellation) and launch AEC service + * @since_tizen 6.5 + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SOUND_MANAGER_ERROR_NONE Success + * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system + * @retval #SOUND_MANAGER_ERROR_INVALID_OPERATION Invalid operation + * @see sound_manager_stop_aec() + */ +int sound_manager_start_aec(void); + +/** + * @internal + * @brief Stops acoustic echo cancellation + * @since_tizen 6.5 + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SOUND_MANAGER_ERROR_NONE Success + * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system + * @retval #SOUND_MANAGER_ERROR_INVALID_OPERATION Invalid operation + * @pre You should start acoustic echo cancellation by sound_manager_start_aec(). + * @see sound_manager_start_aec() + */ +int sound_manager_stop_aec(void); + /** * @} */ diff --git a/include/sound_manager_private.h b/include/sound_manager_private.h index 40af984..79d3c62 100644 --- a/include/sound_manager_private.h +++ b/include/sound_manager_private.h @@ -364,6 +364,10 @@ int _unpublish_local_device(void); int _set_remote_permission(int index, bool allowed); +int _start_aec(void); + +int _stop_aec(void); + int _start_virtual_stream(virtual_sound_stream_info_s *virtual_stream); int _stop_virtual_stream(virtual_sound_stream_info_s *virtual_stream); diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index 7efb8de..c1e1e7b 100644 --- a/packaging/capi-media-sound-manager.spec +++ b/packaging/capi-media-sound-manager.spec @@ -1,6 +1,6 @@ Name: capi-media-sound-manager Summary: Sound Manager library -Version: 0.6.32 +Version: 0.6.33 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager_internal.c b/src/sound_manager_internal.c index ea65f07..5d19a0b 100644 --- a/src/sound_manager_internal.c +++ b/src/sound_manager_internal.c @@ -894,3 +894,13 @@ int sound_manager_set_remote_permission(int id, bool allowed) return _set_remote_permission(id, allowed); } +int sound_manager_start_aec(void) +{ + return _start_aec(); +} + +int sound_manager_stop_aec(void) +{ + return _stop_aec(); +} + diff --git a/src/sound_manager_private.c b/src/sound_manager_private.c index 9244eea..5fe9cbb 100644 --- a/src/sound_manager_private.c +++ b/src/sound_manager_private.c @@ -86,6 +86,12 @@ #define PA_DEVICE_MANAGER_METHOD_NAME_GET_SPECIFIED_STREAM "GetSpecifiedStream" #define PA_DEVICE_MANAGER_METHOD_NAME_SET_ACM_MODE "SetAcmMode" +#define AEC_BUS_NAME "org.tizen.AudioAec" +#define AEC_OBJECT "/org/tizen/AudioAec" +#define AEC_INTERFACE "org.tizen.AudioAec" +#define AEC_METHOD_LAUNCH "Launch" +#define AEC_METHOD_QUIT "Quit" + #define VCONF_PATH_PREFIX_VOLUME "file/private/sound/volume/" #define VCONF_PATH_MAX 64 @@ -2483,6 +2489,65 @@ int _set_remote_permission(int id, bool allowed) return ret; } +int _start_aec(void) +{ + GDBusConnection *conn = NULL; + GVariant *reply = NULL; + GError *err = NULL; + int ret; + + if ((ret = __get_dbus_connection(&conn)) != SOUND_MANAGER_ERROR_NONE) + return SOUND_MANAGER_ERROR_INVALID_OPERATION; + + LOGI("start acoustic echo cancellation"); + + reply = g_dbus_connection_call_sync(conn, AEC_BUS_NAME, AEC_OBJECT, AEC_INTERFACE, + AEC_METHOD_LAUNCH, NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err); + + g_object_unref(conn); + + if (!reply) { + ret = _convert_dbus_error(err->message); + LOGE("g_dbus_connection_call_sync() err-msg(%s)", err->message); + g_error_free(err); + return ret; + } + + g_variant_unref(reply); + + return SOUND_MANAGER_ERROR_NONE; +} + +int _stop_aec(void) +{ + + GDBusConnection *conn = NULL; + GVariant *reply = NULL; + GError *err = NULL; + int ret; + + if ((ret = __get_dbus_connection(&conn)) != SOUND_MANAGER_ERROR_NONE) + return SOUND_MANAGER_ERROR_INVALID_OPERATION; + + LOGI("stop acoustic echo cancellation"); + + reply = g_dbus_connection_call_sync(conn, AEC_BUS_NAME, AEC_OBJECT, AEC_INTERFACE, + AEC_METHOD_QUIT, NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err); + + g_object_unref(conn); + + if (!reply) { + ret = _convert_dbus_error(err->message); + LOGE("g_dbus_connection_call_sync() err-msg(%s)", err->message); + g_error_free(err); + return ret; + } + + g_variant_unref(reply); + + return SOUND_MANAGER_ERROR_NONE; +} + static int __check_manual_route_type(sound_stream_info_s *stream_info) { SM_ARG_CHECK(stream_info); diff --git a/test/sound_manager_test.c b/test/sound_manager_test.c index f831237..2a02610 100644 --- a/test/sound_manager_test.c +++ b/test/sound_manager_test.c @@ -118,6 +118,8 @@ enum { CURRENT_STATUS_DISCOVER_REMOTE_DEVICE, CURRENT_STATUS_PUBLISH_REMOTE_DEVICE, CURRENT_STATUS_SET_REMOTE_PERMISSION, + CURRENT_STATUS_LAUNCH_ECHO_CANCEL, + CURRENT_STATUS_QUIT_ECHO_CANCEL, }; @@ -389,6 +391,10 @@ void _interpret_main_menu(char *cmd) g_menu_state = CURRENT_STATUS_PUBLISH_REMOTE_DEVICE; else if (strncmp(cmd, "alw", MAX_CMD_LEN) == 0) g_menu_state = CURRENT_STATUS_SET_REMOTE_PERMISSION; + else if (strncmp(cmd, "lec", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_LAUNCH_ECHO_CANCEL; + else if (strncmp(cmd, "qec", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_QUIT_ECHO_CANCEL; else if (strncmp(cmd, "q", MAX_CMD_LEN) == 0) { g_print("closing the test suite\n"); quit_program(); @@ -498,6 +504,8 @@ void display_sub_basic() g_print("dis. *Discover remote devices\n"); g_print("pub. *Publish remote devices\n"); g_print("alw. *Allow remote device\n"); + g_print("lec. *Launch EC\n"); + g_print("qec. *Quit EC\n"); g_print(" * is for internal usage.\n"); g_print("=========================================================================================\n"); } @@ -696,6 +704,10 @@ static void displaymenu() g_print("*** press enter 0:disable, 1:enable\n"); else if (g_menu_state == CURRENT_STATUS_SET_REMOTE_PERMISSION) g_print("*** press enter number num, allow(0,1)\n"); + else if (g_menu_state == CURRENT_STATUS_LAUNCH_ECHO_CANCEL) + g_print("*** press enter to launch acoustic echo cancellation service\n"); + else if (g_menu_state == CURRENT_STATUS_QUIT_ECHO_CANCEL) + g_print("*** press enter to quit acoustic echo cancellation service\n"); else { g_print("*** unknown status.\n"); quit_program(); @@ -2808,6 +2820,30 @@ static void interpret(char *cmd) reset_menu_state(); break; } + case CURRENT_STATUS_LAUNCH_ECHO_CANCEL: { + int ret; + + ret = sound_manager_start_aec(); + if (!ret) + g_print("ec run\n"); + else + g_print("ec fail ret(0x%x)\n", ret); + + reset_menu_state(); + break; + + } + case CURRENT_STATUS_QUIT_ECHO_CANCEL: { + int ret; + ret = sound_manager_stop_aec(); + if (!ret) + g_print("ec stop\n"); + else + g_print("ec stop fail ret(0x%x)\n", ret); + + reset_menu_state(); + break; + } } end: g_timeout_add(100, timeout_menu_display, 0);