Add Acoustic Echo Cancellation internal api 38/257138/7 accepted/tizen/unified/20210426.002339 submit/tizen/20210423.055047 submit/tizen/20210423.064540
authorJaechul Lee <jcsing.lee@samsung.com>
Wed, 17 Mar 2021 05:46:34 +0000 (14:46 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Fri, 23 Apr 2021 03:45:02 +0000 (12:45 +0900)
[Version] 0.6.33
[Issue Type] New feature

Change-Id: I7525a88b8253c2487d843d21d9fdcb428a93bec0
Signed-off-by: Jaechul Lee <jcsing.lee@samsung.com>
include/sound_manager_internal.h
include/sound_manager_private.h
packaging/capi-media-sound-manager.spec
src/sound_manager_internal.c
src/sound_manager_private.c
test/sound_manager_test.c

index 8f00a130a0168129a1c29d8a700b96712e15ed46..934e88121393e685c327d489d55fb25276200642 100644 (file)
@@ -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);
+
 /**
  * @}
  */
index 40af9849f55ea893d6de661c3e1a894376edc55c..79d3c62f914966653d8f7233c030ac83ea70d2a9 100644 (file)
@@ -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);
index 7efb8de1472426ddfc52786a497055c9ada36b37..c1e1e7bc1d9033f794122e1e707ae45d6bba7566 100644 (file)
@@ -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
index ea65f07e68b94910bc16b7b73a47c0da0a515ccc..5d19a0b28b3d10c56f7cacbce703d80e144af9ed 100644 (file)
@@ -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();
+}
+
index 9244eea00519a06d77d1ebbf00e80277e671796f..5fe9cbbc5930ff499156cddc89cb33076d6107d3 100644 (file)
 #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);
index f831237a0361c0544ad56bdf3b51eb130c794111..2a02610083beb3a746b95ea496b36a22fba171ac 100644 (file)
@@ -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);