From: Sangchul Lee Date: Wed, 11 Dec 2019 00:00:11 +0000 (+0900) Subject: Add support for internal volume API set X-Git-Tag: submit/tizen_5.5/20191218.063834^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8156f69d8562e10773d91ea91a93cf4d3c750204;p=platform%2Fcore%2Fapi%2Fsound-manager.git Add support for internal volume API set [Version] 0.6.1 [Issue Type] New feature Change-Id: I030a5411bd828f20276e8002f8160412e1b0f1f4 Signed-off-by: Sangchul Lee --- diff --git a/include/sound_manager_internal.h b/include/sound_manager_internal.h index 87425c2..97034ee 100644 --- a/include/sound_manager_internal.h +++ b/include/sound_manager_internal.h @@ -33,6 +33,7 @@ extern "C" */ #define SOUND_TYPE_NUM SOUND_TYPE_VOICE + 1 +#define SOUND_TYPE_INTERNAL_NUM SOUND_TYPE_BIXBY + 1 /** * @internal @@ -74,6 +75,14 @@ typedef enum { SOUND_STREAM_TYPE_MEDIA_NETWORK_SOURCE, /**< Sound stream type for network source media (Since 5.5) */ } sound_stream_type_internal_e; +/** + * @brief Enumeration for sound type for internal. + * @since_tizen 6.0 + */ +typedef enum { + SOUND_TYPE_BIXBY, /**< Sound type for Bixby */ +} sound_type_internal_e; + /** * @internal * @brief Enumeration for sound filters. @@ -187,6 +196,107 @@ int sound_manager_set_mute(sound_type_e type, bool mute); */ int sound_manager_get_mute(sound_type_e type, bool *muted); +/** + * @brief Called when the volume has changed. + * @since_tizen 6.0 + * @param[in] type The internal sound type + * @param[in] level The new volume level + * @param[in] user_data The user data passed from the callback registration function + * @pre sound_manager_set_volume_internal() will invoke this callback if you register it using sound_manager_add_volume_changed_cb_internal(). + * @see sound_manager_add_volume_changed_cb_internal() + * @see sound_manager_remove_volume_changed_cb_internal() + */ +typedef void (*sound_manager_volume_changed_cb_internal) (sound_type_internal_e type, unsigned int level, void *user_data); + +/** + * @brief Gets the maximum volume level supported for a particular sound type. + * @since_tizen 6.0 + * @param[in] type The internal sound type + * @param[out] max The maximum volume level + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SOUND_MANAGER_ERROR_NONE Success + * @retval #SOUND_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see sound_manager_set_volume_internal() + * @see sound_manager_get_volume_internal() + */ +int sound_manager_get_max_volume_internal(sound_type_internal_e type, int *max); + +/** + * @brief Sets the volume level specified for a particular sound type. + * @since_tizen 6.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/volume.set + * @param[in] type The internal sound type + * @param[in] level The volume level to be set + * @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_PERMISSION_DENIED Permission denied + * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system + * @see sound_manager_get_max_volume_internal() + * @see sound_manager_get_volume_internal() + */ +int sound_manager_set_volume_internal(sound_type_internal_e type, int level); + +/** + * @brief Gets the volume level specified for a particular sound type. + * @since_tizen 6.0 + * @param[in] type The internal sound type + * @param[out] level The current volume level + * @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_INTERNAL Internal error inside the sound system + * @see sound_manager_get_max_volume_internal() + * @see sound_manager_set_volume_internal() + */ +int sound_manager_get_volume_internal(sound_type_internal_e type, int *level); + +/** + * @brief Gets the type of the sound being currently played. + * @since_tizen 6.0 + * @param[out] type The internal sound type + * @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_NO_PLAYING_SOUND No playing sound + * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system + */ +int sound_manager_get_current_sound_type_internal(sound_type_internal_e *type); + +/** + * @brief Adds a callback function to be invoked when the volume level is changed. + * @since_tizen 6.0 + * @param[in] callback Callback function to indicate change in volume + * @param[in] user_data The user data to be passed to the callback function + * @param[out] id The callback id + * @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_INTERNAL Internal error inside the sound system + * @post sound_manager_volume_changed_cb_internal() will be invoked. + * @see sound_manager_remove_volume_changed_cb_internal() + * @see sound_manager_volume_changed_cb_internal() + */ +int sound_manager_add_volume_changed_cb_internal(sound_manager_volume_changed_cb_internal callback, void *user_data, int *id); + +/** + * @brief Removes the volume change callback. + * @since_tizen 6.0 + * @param[in] id The id of the callback to remove + * @return 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_INTERNAL Internal error inside the sound system + * @see sound_manager_add_volume_changed_cb_internal() + */ +int sound_manager_remove_volume_changed_cb_internal(int id); + /** * @internal * @brief Creates a handle for stream information. diff --git a/include/sound_manager_internal_tv.h b/include/sound_manager_internal_tv.h index 8d266b7..c115009 100644 --- a/include/sound_manager_internal_tv.h +++ b/include/sound_manager_internal_tv.h @@ -1,4 +1,3 @@ - /* * Copyright (c) 2015 - 2018 Samsung Electronics Co., Ltd All Rights Reserved * @@ -34,6 +33,7 @@ extern "C" */ #define SOUND_TYPE_NUM SOUND_TYPE_VOICE + 1 +#define SOUND_TYPE_INTERNAL_NUM SOUND_TYPE_BIXBY + 1 /** * @internal @@ -74,6 +74,14 @@ typedef enum { SOUND_STREAM_TYPE_MEDIA_COMPRESSED, /**< Sound stream type for compressed media (Since 4.0) */ } sound_stream_type_internal_e; +/** + * @brief Enumeration for sound type for internal. + * @since_tizen 6.0 + */ +typedef enum { + SOUND_TYPE_BIXBY, /**< Sound type for Bixby */ +} sound_type_internal_e; + /** * @internal * @brief Enumeration for sound filters. @@ -142,6 +150,107 @@ int sound_manager_set_mute(sound_type_e type, bool mute); */ int sound_manager_get_mute(sound_type_e type, bool *muted); +/** + * @brief Called when the volume has changed. + * @since_tizen 6.0 + * @param[in] type The internal sound type + * @param[in] level The new volume level + * @param[in] user_data The user data passed from the callback registration function + * @pre sound_manager_set_volume_internal() will invoke this callback if you register it using sound_manager_add_volume_changed_cb_internal(). + * @see sound_manager_add_volume_changed_cb_internal() + * @see sound_manager_remove_volume_changed_cb_internal() + */ +typedef void (*sound_manager_volume_changed_cb_internal) (sound_type_internal_e type, unsigned int level, void *user_data); + +/** + * @brief Gets the maximum volume level supported for a particular sound type. + * @since_tizen 6.0 + * @param[in] type The internal sound type + * @param[out] max The maximum volume level + * @return @c 0 on success, + * otherwise a negative error value + * @retval #SOUND_MANAGER_ERROR_NONE Success + * @retval #SOUND_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @see sound_manager_set_volume_internal() + * @see sound_manager_get_volume_internal() + */ +int sound_manager_get_max_volume_internal(sound_type_internal_e type, int *max); + +/** + * @brief Sets the volume level specified for a particular sound type. + * @since_tizen 6.0 + * @privlevel public + * @privilege %http://tizen.org/privilege/volume.set + * @param[in] type The internal sound type + * @param[in] level The volume level to be set + * @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_PERMISSION_DENIED Permission denied + * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system + * @see sound_manager_get_max_volume_internal() + * @see sound_manager_get_volume_internal() + */ +int sound_manager_set_volume_internal(sound_type_internal_e type, int level); + +/** + * @brief Gets the volume level specified for a particular sound type. + * @since_tizen 6.0 + * @param[in] type The internal sound type + * @param[out] level The current volume level + * @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_INTERNAL Internal error inside the sound system + * @see sound_manager_get_max_volume_internal() + * @see sound_manager_set_volume_internal() + */ +int sound_manager_get_volume_internal(sound_type_internal_e type, int *level); + +/** + * @brief Gets the type of the sound being currently played. + * @since_tizen 6.0 + * @param[out] type The internal sound type + * @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_NO_PLAYING_SOUND No playing sound + * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system + */ +int sound_manager_get_current_sound_type_internal(sound_type_internal_e *type); + +/** + * @brief Adds a callback function to be invoked when the volume level is changed. + * @since_tizen 6.0 + * @param[in] callback Callback function to indicate change in volume + * @param[in] user_data The user data to be passed to the callback function + * @param[out] id The callback id + * @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_INTERNAL Internal error inside the sound system + * @post sound_manager_volume_changed_cb_internal() will be invoked. + * @see sound_manager_remove_volume_changed_cb_internal() + * @see sound_manager_volume_changed_cb_internal() + */ +int sound_manager_add_volume_changed_cb_internal(sound_manager_volume_changed_cb_internal callback, void *user_data, int *id); + +/** + * @brief Removes the volume change callback. + * @since_tizen 6.0 + * @param[in] id The id of the callback to remove + * @return 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_INTERNAL Internal error inside the sound system + * @see sound_manager_add_volume_changed_cb_internal() + */ +int sound_manager_remove_volume_changed_cb_internal(int id); + /** * @internal * @brief Creates a handle for stream information. diff --git a/include/sound_manager_private.h b/include/sound_manager_private.h index 04871b5..5a38da5 100644 --- a/include/sound_manager_private.h +++ b/include/sound_manager_private.h @@ -295,8 +295,12 @@ int _set_route_option(unsigned int index, const char *key, int value); int _convert_sound_type(sound_type_e sound_type, const char **volume_type); +int _convert_sound_type_for_internal(sound_type_internal_e sound_type, const char **volume_type); + int _convert_sound_type_to_enum(const char *sound_type, sound_type_e *sound_type_enum); +int _convert_sound_type_to_enum_for_internal(const char *sound_type, sound_type_internal_e *sound_type_enum); + int _get_volume_max_level(const char *direction, const char *volume_type, unsigned int *max_level); int _get_volume_level(const char *direction, const char *volume_type, unsigned int *level); diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index 514d5a2..a74ed5c 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.0 +Version: 0.6.1 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager.c b/src/sound_manager.c index c2cf377..aaac929 100644 --- a/src/sound_manager.c +++ b/src/sound_manager.c @@ -117,7 +117,8 @@ int sound_manager_get_current_sound_type(sound_type_e *type) ret = _get_current_volume_type(DIRECTION_OUT_STR, &volume_type); if (ret == MM_ERROR_NONE) { ret = _convert_sound_type_to_enum((const char*)volume_type, type); - LOGI("type=%d", *type); + if (ret == MM_ERROR_NONE) + LOGI("type=%d", *type); } return _convert_sound_manager_error_code(__func__, ret); diff --git a/src/sound_manager_internal.c b/src/sound_manager_internal.c index c9aba4c..d8c125e 100644 --- a/src/sound_manager_internal.c +++ b/src/sound_manager_internal.c @@ -91,6 +91,103 @@ int sound_manager_get_mute(sound_type_e type, bool *muted) return _convert_sound_manager_error_code(__func__, ret); } +int sound_manager_get_max_volume_internal(sound_type_internal_e type, int *max) +{ + const char *volume_type = NULL; + unsigned int max_level = 0; + int ret = MM_ERROR_NONE; + + SM_NULL_ARG_CHECK(max); + if (type >= SOUND_TYPE_INTERNAL_NUM) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + + ret = _convert_sound_type_for_internal(type, &volume_type); + if (ret == MM_ERROR_NONE) { + ret = _get_volume_max_level(DIRECTION_OUT_STR, volume_type, &max_level); + if (ret == MM_ERROR_NONE) + *max = (int)max_level -1; /* actual volume step can be max step - 1 */ + } + + return _convert_sound_manager_error_code(__func__, ret); +} + +int sound_manager_set_volume_internal(sound_type_internal_e type, int level) +{ + int ret = MM_ERROR_NONE; + + if (type >= SOUND_TYPE_INTERNAL_NUM) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + if (level < 0) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + + ret = mm_sound_volume_set_value_internal(type, level); + LOGI("type=%d, level=%d", type, level); + + return _convert_sound_manager_error_code(__func__, ret); +} + +int sound_manager_get_volume_internal(sound_type_internal_e type, int *level) +{ + int ret = MM_ERROR_NONE; + unsigned int uvolume; + + if (type >= SOUND_TYPE_INTERNAL_NUM) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + if (level == NULL) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + + ret = mm_sound_volume_get_value_internal(type, &uvolume); + if (ret == MM_ERROR_NONE) + *level = uvolume; + + LOGI("type=%d, level=%d", type, *level); + + return _convert_sound_manager_error_code(__func__, ret); +} + +int sound_manager_get_current_sound_type_internal(sound_type_internal_e *type) +{ + int ret = MM_ERROR_NONE; + char *volume_type = NULL; + + if (type == NULL) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + + /* get the volume type of the current playing stream */ + ret = _get_current_volume_type(DIRECTION_OUT_STR, &volume_type); + if (ret == MM_ERROR_NONE) { + ret = _convert_sound_type_to_enum_for_internal((const char*)volume_type, type); + if (ret == MM_ERROR_NONE) + LOGI("type=%d", *type); + } + + return _convert_sound_manager_error_code(__func__, ret); +} + +int sound_manager_add_volume_changed_cb_internal(sound_manager_volume_changed_cb_internal callback, void *user_data, int *id) +{ + int ret = MM_ERROR_NONE; + + if (!callback || !id) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + + ret = mm_sound_add_volume_changed_callback_internal((mm_sound_volume_changed_cb_internal)callback, user_data, (unsigned int*)id); + + return _convert_sound_manager_error_code(__func__, ret); +} + +int sound_manager_remove_volume_changed_cb_internal(int id) +{ + int ret = MM_ERROR_NONE; + + if (id < 0) + return _convert_sound_manager_error_code(__func__, MM_ERROR_INVALID_ARGUMENT); + + ret = mm_sound_remove_volume_changed_callback_internal(id); + + return _convert_sound_manager_error_code(__func__, ret); +} + int sound_manager_create_stream_information_internal(sound_stream_type_internal_e stream_type, sound_stream_focus_state_changed_cb callback, void *user_data, sound_stream_info_h *stream_info) { int ret = MM_ERROR_NONE; diff --git a/src/sound_manager_private.c b/src/sound_manager_private.c index 7c70e2f..6a0334d 100644 --- a/src/sound_manager_private.c +++ b/src/sound_manager_private.c @@ -80,6 +80,21 @@ #define VCONF_PATH_PREFIX_VOLUME "file/private/sound/volume/" #define VCONF_PATH_MAX 64 +#define SM_SOUND_TYPE_CHECK(x_sound_type, x_error) \ +if (!strncmp(x_sound_type, "system", strlen(x_sound_type)) || \ + !strncmp(x_sound_type, "notification", strlen(x_sound_type)) || \ + !strncmp(x_sound_type, "alarm", strlen(x_sound_type)) || \ + !strncmp(x_sound_type, "ringtone", strlen(x_sound_type)) || \ + !strncmp(x_sound_type, "media", strlen(x_sound_type)) || \ + !strncmp(x_sound_type, "call", strlen(x_sound_type)) || \ + !strncmp(x_sound_type, "voip", strlen(x_sound_type)) || \ + !strncmp(x_sound_type, "voice", strlen(x_sound_type))) \ + return x_error; \ + +#define SM_INTERNAL_SOUND_TYPE_CHECK(x_sound_type, x_error) \ +if (!strncmp(x_sound_type, "bixby", strlen(x_sound_type))) \ + return x_error; \ + //LCOV_EXCL_START int _convert_dbus_error(const char *error_msg) { @@ -405,6 +420,22 @@ int _convert_sound_type(sound_type_e sound_type, const char **volume_type) return MM_ERROR_NONE; } +//LCOV_EXCL_START +int _convert_sound_type_for_internal(sound_type_internal_e sound_type, const char **volume_type) +{ + SM_NULL_ARG_CHECK_FOR_PRIV(volume_type); + + switch (sound_type) { + case SOUND_TYPE_BIXBY: + *volume_type = "bixby"; + break; + } + LOGI("volume_type[%s]", *volume_type); + + return MM_ERROR_NONE; +} +//LCOV_EXCL_STOP + int _convert_sound_type_to_enum(const char *sound_type, sound_type_e *sound_type_enum) { SM_NULL_ARG_CHECK_FOR_PRIV(sound_type); @@ -428,6 +459,7 @@ int _convert_sound_type_to_enum(const char *sound_type, sound_type_e *sound_type *sound_type_enum = SOUND_TYPE_VOICE; } else { //LCOV_EXCL_START + SM_INTERNAL_SOUND_TYPE_CHECK(sound_type, MM_ERROR_SOUND_VOLUME_NO_INSTANCE); LOGE("not supported sound_type(%s)", sound_type); return MM_ERROR_INVALID_ARGUMENT; //LCOV_EXCL_STOP @@ -436,6 +468,22 @@ int _convert_sound_type_to_enum(const char *sound_type, sound_type_e *sound_type return MM_ERROR_NONE; } //LCOV_EXCL_START +int _convert_sound_type_to_enum_for_internal(const char *sound_type, sound_type_internal_e *sound_type_enum) +{ + SM_NULL_ARG_CHECK_FOR_PRIV(sound_type); + SM_NULL_ARG_CHECK_FOR_PRIV(sound_type_enum); + + if (!strncmp(sound_type, "bixby", strlen(sound_type))) { + *sound_type_enum = SOUND_TYPE_BIXBY; + } else { + SM_SOUND_TYPE_CHECK(sound_type, MM_ERROR_SOUND_VOLUME_NO_INSTANCE); + LOGE("not supported internal sound_type(%s)", sound_type); + return MM_ERROR_INVALID_ARGUMENT; + } + + return MM_ERROR_NONE; +} + int _convert_device_type_enum_to_str(sound_device_type_e device_type, char **device_type_str) { SM_NULL_ARG_CHECK_FOR_PRIV(device_type_str); diff --git a/test/sound_manager_test.c b/test/sound_manager_test.c index b01e71b..44bf196 100644 --- a/test/sound_manager_test.c +++ b/test/sound_manager_test.c @@ -34,10 +34,16 @@ enum { CURRENT_STATUS_SET_VOLUME, CURRENT_STATUS_GET_VOLUME, CURRENT_STATUS_GET_CURRENT_SOUND_TYPE, + CURRENT_STATUS_GET_MAX_VOLUME_INTERNAL, + CURRENT_STATUS_SET_VOLUME_INTERNAL, + CURRENT_STATUS_GET_VOLUME_INTERNAL, + CURRENT_STATUS_GET_CURRENT_SOUND_TYPE_INTERNAL, CURRENT_STATUS_SET_MUTE, CURRENT_STATUS_GET_MUTE, CURRENT_STATUS_ADD_VOLUME_CHANGED_CB, CURRENT_STATUS_REMOVE_VOLUME_CHANGED_CB, + CURRENT_STATUS_ADD_VOLUME_CHANGED_CB_INTERNAL, + CURRENT_STATUS_REMOVE_VOLUME_CHANGED_CB_INTERNAL, CURRENT_STATUS_SET_DEVICE_MASK, CURRENT_STATUS_GET_DEVICE_MASK, CURRENT_STATUS_PRINT_DEVICE_LIST, @@ -122,6 +128,7 @@ sound_stream_info_h g_stream_info_h = NULL; virtual_sound_stream_h g_vstream_h = NULL; sound_stream_ducking_h g_stream_ducking_h = NULL; int g_volume_cb_id; +int g_internal_volume_cb_id; int g_device_conn_cb_id; int g_device_state_cb_id; int g_device_running_cb_id; @@ -214,10 +221,22 @@ void _interpret_main_menu(char *cmd) g_menu_state = CURRENT_STATUS_GET_VOLUME; else if (strncmp(cmd, "gt", MAX_CMD_LEN) == 0) g_menu_state = CURRENT_STATUS_GET_CURRENT_SOUND_TYPE; + else if (strncmp(cmd, "gxi", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_GET_MAX_VOLUME_INTERNAL; + else if (strncmp(cmd, "svi", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_SET_VOLUME_INTERNAL; + else if (strncmp(cmd, "gvi", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_GET_VOLUME_INTERNAL; + else if (strncmp(cmd, "gti", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_GET_CURRENT_SOUND_TYPE_INTERNAL; else if (strncmp(cmd, "av", MAX_CMD_LEN) == 0) g_menu_state = CURRENT_STATUS_ADD_VOLUME_CHANGED_CB; else if (strncmp(cmd, "rv", MAX_CMD_LEN) == 0) g_menu_state = CURRENT_STATUS_REMOVE_VOLUME_CHANGED_CB; + else if (strncmp(cmd, "avi", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_ADD_VOLUME_CHANGED_CB_INTERNAL; + else if (strncmp(cmd, "rvi", MAX_CMD_LEN) == 0) + g_menu_state = CURRENT_STATUS_REMOVE_VOLUME_CHANGED_CB_INTERNAL; else if (strncmp(cmd, "sm", MAX_CMD_LEN) == 0) g_menu_state = CURRENT_STATUS_SET_MUTE; else if (strncmp(cmd, "gm", MAX_CMD_LEN) == 0) @@ -379,10 +398,16 @@ void display_sub_basic() g_print("gv. Get Volume \t"); g_print("sv. Set Volume \n"); g_print("gt. Get Current Sound Type \t"); + g_print("gxi. *Get Max Volume \t"); + g_print("gvi. *Get Volume \t"); + g_print("svi. *Set Volume \n"); + g_print("gti. *Get Current Sound Type \t"); g_print("gm. *Get Mute \t"); g_print("sm. *Set Mute \n"); g_print("av. Add Volume Changed CB \t"); g_print("rv. Remove Volume Changed CB \n"); + g_print("avi. *Add Volume Changed CB \t"); + g_print("rvi. *Remove Volume Changed CB \n"); #ifndef TIZEN_FEATURE_TV_PROD g_print("mgx. *Get Max Master Volume \t"); g_print("mgv. *Get Master Volume \t"); @@ -476,12 +501,22 @@ static void displaymenu() g_print("*** input sound type(0:SYSTEM 1:NOTIFICATION 2:ALARM 3:RINGTONE 4:MEDIA 5:CALL 6:VOIP 7:VOICE)\n"); else if (g_menu_state == CURRENT_STATUS_SET_VOLUME) { if (flag == 0) - g_print("*** input sound type and desired volume level(0:SYSTEM 1:NOTIFICATION 2:ALARM 3:RINGTONE 4:MEDIA 5:CALL 6:VOIP 7:VOICE, (0~max volum))\n"); + g_print("*** input sound type and desired volume level(0:SYSTEM 1:NOTIFICATION 2:ALARM 3:RINGTONE 4:MEDIA 5:CALL 6:VOIP 7:VOICE, (0~max volume))\n"); flag = 1; } else if (g_menu_state == CURRENT_STATUS_GET_VOLUME) g_print("*** input sound type(0:SYSTEM 1:NOTIFICATION 2:ALARM 3:RINGTONE 4:MEDIA 5:CALL 6:VOIP 7:VOICE)\n"); else if (g_menu_state == CURRENT_STATUS_GET_CURRENT_SOUND_TYPE) g_print("*** press enter to get current sound type\n"); + else if (g_menu_state == CURRENT_STATUS_GET_MAX_VOLUME_INTERNAL) + g_print("*** input sound type(0:BIXBY)\n"); + else if (g_menu_state == CURRENT_STATUS_SET_VOLUME_INTERNAL) { + if (flag == 0) + g_print("*** input sound type and desired volume level(0:BIXBY (0~max volume))\n"); + flag = 1; + } else if (g_menu_state == CURRENT_STATUS_GET_VOLUME_INTERNAL) + g_print("*** input sound type(0:BIXBY)\n"); + else if (g_menu_state == CURRENT_STATUS_GET_CURRENT_SOUND_TYPE_INTERNAL) + g_print("*** press enter to get current sound type\n"); else if (g_menu_state == CURRENT_STATUS_SET_MUTE) { if (flag == 0) g_print("*** input sound type and desired mute state(0:SYSTEM 1:NOTIFICATION 2:ALARM 3:RINGTONE 4:MEDIA 5:CALL 6:VOIP 7:VOICE, (0:unmute, 1:mute))\n"); @@ -492,6 +527,10 @@ static void displaymenu() g_print("*** press enter to add volume changed cb\n"); else if (g_menu_state == CURRENT_STATUS_REMOVE_VOLUME_CHANGED_CB) g_print("*** press enter to remove volume changed cb\n"); + else if (g_menu_state == CURRENT_STATUS_ADD_VOLUME_CHANGED_CB_INTERNAL) + g_print("*** press enter to add volume changed cb for internal\n"); + else if (g_menu_state == CURRENT_STATUS_REMOVE_VOLUME_CHANGED_CB_INTERNAL) + g_print("*** press enter to remove volume changed cb for internal\n"); else if (g_menu_state == CURRENT_STATUS_SET_DEVICE_MASK) g_print("*** input device mask (0:ALL, 1:INTERNAL, 2:EXTERNAL, 3:INPUT, 4:OUTPUT, 5:BOTH, 6:ACTIVATED, 7:DEACTIVATED, b:back to the menu)\n"); else if (g_menu_state == CURRENT_STATUS_GET_DEVICE_MASK) @@ -684,11 +723,32 @@ int convert_sound_type(sound_type_e *type, char *cmd) return 1; } +int convert_sound_type_internal(sound_type_internal_e *type, char *cmd) +{ + int sound_type_n = atoi(cmd); + if (sound_type_n > SOUND_TYPE_BIXBY) { + g_print("not supported sound type(%d)\n", sound_type_n); + return 0; + } else { + switch (sound_type_n) { + case 0: + *type = SOUND_TYPE_BIXBY; + break; + } + } + return 1; +} + void _volume_changed_cb(sound_type_e type, unsigned int volume, void *user_data) { g_print("***the volume has changed. the volume of this sound type(%d) is : %d \n", type, volume); } +void _volume_changed_cb_internal(sound_type_internal_e type, unsigned int volume, void *user_data) +{ + g_print("***the internal volume has changed. the volume of this sound type(%d) is : %d \n", type, volume); +} + /* If failed to get some property, just give some default value */ void _get_device_props_simple(sound_device_h device, int *id, const char **type, char **name, const char **direc, const char **state, int *vendor_id, int *product_id, bool *is_running) @@ -858,6 +918,64 @@ static void interpret(char *cmd) reset_menu_state(); break; } + case CURRENT_STATUS_GET_MAX_VOLUME_INTERNAL: { + sound_type_internal_e type; + int max; + if (convert_sound_type_internal(&type, cmd) == 1) { + if (sound_manager_get_max_volume_internal(type, &max) != SOUND_MANAGER_ERROR_NONE) + g_print("failt to get max volume\n"); + else + g_print("the max volume of this type(%d) is %d\n", type, max); + } + reset_menu_state(); + break; + } + case CURRENT_STATUS_SET_VOLUME_INTERNAL: { + static int cnt = 0; + static sound_type_internal_e type; + int volume; + switch (cnt) { + case 0: + if (convert_sound_type_internal(&type, cmd) == 1) + cnt++; + else + reset_menu_state(); + break; + case 1: + volume = atoi(cmd); + if (sound_manager_set_volume_internal(type, volume) != SOUND_MANAGER_ERROR_NONE) + g_print("fail to set volume(%d) check sound type(%d)'s available volume level\n", volume, type); + else + g_print("set volume success : sound type(%d), volume(%d)\n", type, volume); + cnt = 0; + reset_menu_state(); + break; + default: + break; + } + break; + } + case CURRENT_STATUS_GET_VOLUME_INTERNAL: { + sound_type_internal_e type; + int volume; + if (convert_sound_type_internal(&type, cmd) == 1) { + if (sound_manager_get_volume_internal(type, &volume) != SOUND_MANAGER_ERROR_NONE) + g_print("fail to get volume\n"); + else + g_print("current volume of this type(%d) is : %d\n", type, volume); + } + reset_menu_state(); + break; + } + case CURRENT_STATUS_GET_CURRENT_SOUND_TYPE_INTERNAL: { + sound_type_internal_e type; + if (sound_manager_get_current_sound_type_internal(&type) != SOUND_MANAGER_ERROR_NONE) + g_print("fail to get current sound type\n"); + else + g_print("current sound type is (%d)\n", type); + reset_menu_state(); + break; + } case CURRENT_STATUS_SET_MUTE: { static int cnt = 0; static sound_type_e type; @@ -910,6 +1028,22 @@ static void interpret(char *cmd) g_print("success to remove volume changed cb, id[%d]\n", g_volume_cb_id); reset_menu_state(); break; + } + case CURRENT_STATUS_ADD_VOLUME_CHANGED_CB_INTERNAL: { + if (sound_manager_add_volume_changed_cb_internal(_volume_changed_cb_internal, NULL, &g_internal_volume_cb_id) != SOUND_MANAGER_ERROR_NONE) + g_print("fail to add volume changed cb\n"); + else + g_print("success to add volume changed cb, id[%d]\n", g_internal_volume_cb_id); + reset_menu_state(); + break; + } + case CURRENT_STATUS_REMOVE_VOLUME_CHANGED_CB_INTERNAL: { + if (sound_manager_remove_volume_changed_cb_internal(g_internal_volume_cb_id) != SOUND_MANAGER_ERROR_NONE) + g_print("fail to remove volume changed cb, id[%d]\n", g_internal_volume_cb_id); + else + g_print("success to remove volume changed cb, id[%d]\n", g_internal_volume_cb_id); + reset_menu_state(); + break; } case CURRENT_STATUS_SET_DEVICE_MASK: { if (strncmp(cmd, "0", 1) == 0) {