From: Jaechul Lee Date: Mon, 21 Mar 2022 08:31:42 +0000 (+0900) Subject: Add echo-cancellation APIs X-Git-Tag: submit/tizen/20220405.045611^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ab877742a854e83472fdca6daf7039e0741193b3;p=platform%2Fcore%2Fapi%2Fsound-manager.git Add echo-cancellation APIs 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 --- diff --git a/include/sound_manager_internal.h b/include/sound_manager_internal.h index 54c10e5..2e45dfb 100644 --- a/include/sound_manager_internal.h +++ b/include/sound_manager_internal.h @@ -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 diff --git a/include/sound_manager_private.h b/include/sound_manager_private.h index 3574471..fc9611d 100644 --- a/include/sound_manager_private.h +++ b/include/sound_manager_private.h @@ -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); diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index bae330e..bc42b57 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.42 +Version: 0.6.43 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager_internal.c b/src/sound_manager_internal.c index f1ec893..42402c5 100644 --- a/src/sound_manager_internal.c +++ b/src/sound_manager_internal.c @@ -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); diff --git a/src/sound_manager_private.c b/src/sound_manager_private.c index 7edd624..ba1479e 100644 --- a/src/sound_manager_private.c +++ b/src/sound_manager_private.c @@ -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;