Add support for internal volume API set 70/219870/5
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 11 Dec 2019 00:00:11 +0000 (09:00 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Mon, 16 Dec 2019 09:05:19 +0000 (18:05 +0900)
[Version] 0.6.1
[Issue Type] New feature

Change-Id: I030a5411bd828f20276e8002f8160412e1b0f1f4
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/sound_manager_internal.h
include/sound_manager_internal_tv.h
include/sound_manager_private.h
packaging/capi-media-sound-manager.spec
src/sound_manager.c
src/sound_manager_internal.c
src/sound_manager_private.c
test/sound_manager_test.c

index 87425c28361af7eaa7c21d01ee66f335b604ed0a..97034eeb11b678cf9455c083f1956bab6f5c51fb 100644 (file)
@@ -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.
index 8d266b7eeb771de99d88121ff8aef13d1fefade8..c11500970fed2072c2f0b9c145a2dd545365abf7 100644 (file)
@@ -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.
index 04871b5293fb5b10ba7dd7f775b08ce42c53ed46..5a38da54d6da9b1efd8ea28c5f68cf10b81f8da2 100644 (file)
@@ -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);
index 514d5a2f25053e9eadd3d5f1292bff182b5df7b7..a74ed5cc58ee51bb6c104f65d48738912d2bfe4a 100644 (file)
@@ -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
index c2cf377208e32736663f6a1fd89f4ea0cec730ea..aaac929b231a2baa8eed9dfcfea3275f8d3caca0 100644 (file)
@@ -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);
index c9aba4c6c4209a7ade1d8a247d58058732cbe8bd..d8c125e2743f94115fc55f4bb03bba3c88560b08 100644 (file)
@@ -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;
index 7c70e2fd02709b3c3098073f20f675806eba5707..6a0334d168f7ef57c0fd38cad6b92a7a7d6c51dc 100644 (file)
 #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);
index b01e71b230ef93b6e5e00ab85add78344134af0c..44bf196d9294fef221e81edb6c5956437cb52151 100644 (file)
@@ -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) {