Add echo-cancellation APIs 95/272595/5 submit/tizen/20220405.045611
authorJaechul Lee <jcsing.lee@samsung.com>
Mon, 21 Mar 2022 08:31:42 +0000 (17:31 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Thu, 31 Mar 2022 04:16:53 +0000 (13:16 +0900)
Echo-cancellation is enabled by setting a reference device.

[Version] 0.6.43
[Issue Type] New Feature

Change-Id: I32e6592e426c83c772ca4fd7e40f69febc6228f7
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

index 54c10e508946e6248cf70afbbc93e2004e9dee88..2e45dfb02c4f930e3efc1cdcb43cf9d9d26a1721 100644 (file)
@@ -1210,6 +1210,42 @@ int sound_manager_start_discover_remote_device(void);
  */
 int sound_manager_stop_discover_remote_device(void);
 
+/**
+ * @internal
+ * @brief Sets acoustic echo cancellation with a reference device
+ * @since_tizen 7.0
+ * @remark You can get a device handle by using sound_manager_get_device_list() and sound_manager_get_next_device()
+ * @param[in]  The handle of stream information
+ * @param[in]  The reference device of echo-cancellation
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #SOUND_MANAGER_ERROR_NONE Success
+ * @retval #SOUND_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #SOUND_MANAGER_ERROR_INVALID_OPERATION Invalid operation
+ * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system
+ * @see sound_manager_create_stream_information()
+ * @see sound_manager_get_device_list()
+ * @see sound_manager_get_next_device()
+ * @see sound_manager_free_device_list()
+ */
+int sound_manager_set_echo_cancel_reference_device(sound_stream_info_h stream_info, sound_device_h device);
+
+/**
+ * @internal
+ * @brief Gets acoustic echo cancellation reference device
+ * @since_tizen 7.0
+ * @remark
+ * @param[in]  The handle of stream information
+ * @param[out] The reference device of echo-cancellation
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #SOUND_MANAGER_ERROR_NONE Success
+ * @retval #SOUND_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #SOUND_MANAGER_ERROR_INVALID_OPERATION Invalid operation
+ * @see sound_manager_create_stream_information()
+ */
+int sound_manager_get_echo_cancel_reference_device(sound_stream_info_h stream_info, sound_device_h *device);
+
 /**
  * @internal
  * @brief Set force hdmi route
index 35744715b4acd33f1129b9dfa73b53b5ac8763cb..fc9611d4165b3ee2dffe22c58eb11af4557eb8ce 100644 (file)
@@ -211,6 +211,7 @@ typedef struct _sound_stream_info_s {
        void *user_data;
        manual_route_info_s manual_route_info;
        preferred_device_info_s preferred_device_info;
+       sound_device_h reference_device;
        pthread_mutex_t focus_state_mutex;
        pthread_mutex_t focus_cb_mutex;
        pthread_mutex_t vstream_mutex;
@@ -390,6 +391,10 @@ int _get_preemptive_device(sound_stream_type_e stream_type, int *in_device_id, i
 
 int _get_latest_stream_pid(int stream_type, unsigned int *pid);
 
+int _set_echo_cancel_reference_device(sound_stream_info_s *stream_info, sound_device_h device);
+
+int _get_echo_cancel_reference_device(sound_stream_info_s *stream_info, sound_device_h *device);
+
 int _set_rpi_playback_route(sound_rpi_playback_route_type type);
 
 int _get_rpi_playback_route(sound_rpi_playback_route_type *type);
index bae330e25712d2387c933bfa0b9c59daacaadc1c..bc42b57d3519009bf895cf8f9cfdcd5ff934ca3e 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-sound-manager
 Summary:    Sound Manager library
-Version:    0.6.42
+Version:    0.6.43
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index f1ec893f1ccf7e46bc3be9ae7c6a64c8ebea9250..42402c530b9d2d2cc64f74f1a6604acaf9626d66 100644 (file)
@@ -894,6 +894,20 @@ int sound_manager_set_remote_permission(int id, bool allowed)
        return _set_remote_permission(id, allowed);
 }
 
+int sound_manager_set_echo_cancel_reference_device(sound_stream_info_h stream_info, sound_device_h device)
+{
+       sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
+
+       return _set_echo_cancel_reference_device(stream_h, device);
+}
+
+int sound_manager_get_echo_cancel_reference_device(sound_stream_info_h stream_info, sound_device_h *device)
+{
+       sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
+
+       return _get_echo_cancel_reference_device(stream_h, device);
+}
+
 int sound_manager_set_rpi_playback_route(sound_rpi_playback_route_type type)
 {
        return _set_rpi_playback_route(type);
index 7edd6241832aeb46da467a0d42bef38a1bfd55c8..ba1479e1a8e7e60760251bfb4e30136a1c074a29 100644 (file)
@@ -2481,6 +2481,57 @@ int _set_remote_permission(int id, bool allowed)
        return ret;
 }
 
+int _set_echo_cancel_reference_device(sound_stream_info_s *stream_info, sound_device_h device)
+{
+       mm_sound_device_type_e mm_sound_device_type;
+       sound_device_type_e device_type;
+       char *device_type_str = NULL;
+       char *avail_device_item = NULL;
+       bool found = false;
+       int ret, i;
+
+       SM_ARG_CHECK(stream_info);
+
+       if ((ret = mm_sound_get_device_type(device, &mm_sound_device_type)) != MM_ERROR_NONE)
+               return _convert_sound_manager_error_code(__func__, ret);
+
+       if ((ret = _convert_device_type(mm_sound_device_type, &device_type)) != SOUND_MANAGER_ERROR_NONE)
+               return ret;
+
+       if ((ret = _convert_device_type_enum_to_str(device_type, &device_type_str)) != SOUND_MANAGER_ERROR_NONE)
+               return ret;
+
+       for (i = 0; i < AVAIL_DEVICES_MAX; i++) {
+               if (!(avail_device_item = stream_info->stream_conf_info.avail_out_devices[i]))
+                       break;
+
+               if (!strncmp(avail_device_item, device_type_str, strlen(device_type_str)))
+                       found = true;
+       }
+
+       if (!found) {
+               LOGE("Can't find available reference device");
+               return SOUND_MANAGER_ERROR_INVALID_OPERATION;
+       }
+
+       stream_info->reference_device = device;
+
+       return SOUND_MANAGER_ERROR_NONE;
+}
+
+int _get_echo_cancel_reference_device(sound_stream_info_s *stream_info, sound_device_h *device)
+{
+       SM_ARG_CHECK(stream_info);
+       SM_ARG_CHECK(device);
+
+       if (!stream_info->reference_device)
+               return SOUND_MANAGER_ERROR_INVALID_OPERATION;
+
+       *device = stream_info->reference_device;
+
+       return SOUND_MANAGER_ERROR_NONE;
+}
+
 int _set_rpi_playback_route(sound_rpi_playback_route_type type)
 {
        int ret;