From: Eunhye Choi Date: Thu, 18 Apr 2019 09:27:02 +0000 (+0900) Subject: [0.6.184] add offload volume control X-Git-Tag: submit/tizen/20190419.043449~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b985487642ef5eac00bb5b6c64a91af135e19609;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git [0.6.184] add offload volume control - in case of offload, set volume and mute to sink - change set/get volume function interface by using united volume parameter instead of left and right volume which is not used anymore. Change-Id: Ib3a9c895ade67438fd491e81da07d61e868dd617 --- diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 855c6ae..5341028 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -1,6 +1,6 @@ Name: libmm-player Summary: Multimedia Framework Player Library -Version: 0.6.183 +Version: 0.6.184 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_player.h b/src/include/mm_player.h index e4fbacd..aaf39bf 100644 --- a/src/include/mm_player.h +++ b/src/include/mm_player.h @@ -439,15 +439,6 @@ typedef struct { }; } mmplayer_attrs_info_t; -/** - * Volume type. - * - * @see mm_player_set_volume, mm_player_get_volume - */ -typedef struct { - float level[MM_VOLUME_CHANNEL_NUM]; /**< Relative volume factor for each channels */ -} mmplayer_volume_type_t; - /** * Video stream info in external demux case * @@ -675,57 +666,14 @@ if (mm_player_get_state(g_player, &state) != MM_ERROR_NONE) { int mm_player_get_state(MMHandleType player, mmplayer_state_e *state); /** - * This function is to set relative volume of player. \n - * So, It controls logical volume value. \n - * But, if developer want to change system volume, mm sound api should be used. - * - * @param player [in] Handle of player - * @param volume [in] Volume factor of each channel - * - * @return This function returns zero on success, or negative value with error code. - * @see mmplayer_volume_type_t, mm_player_get_volume - * @remark The range of factor range is from 0 to 1.0. (1.0 = 100%) And, default value is 1.0. - * @par Example - * @code -mmplayer_volume_type_t volume; -int i = 0; - -for (i = 0; i < MM_VOLUME_CHANNEL_NUM; i++) - volume.level[i] = MM_VOLUME_LEVEL_MAX; - -if (mm_player_set_volume(g_player, &volume) != MM_ERROR_NONE) -{ - LOGE("failed to set volume\n"); -} - * @endcode + * This function is to control logical volume. */ -int mm_player_set_volume(MMHandleType player, mmplayer_volume_type_t *volume); +int mm_player_set_volume(MMHandleType player, float volume); /** * This function is to get current volume factor of player. - * - * @param player [in] Handle of player. - * @param volume [out] Volume factor of each channel. - * - * @return This function returns zero on success, or negative value with error code. - * - * @see mmplayer_volume_type_t, mm_player_set_volume - * @remark None - * @par Example - * @code -mmplayer_volume_type_t volume; -int i; - -if (mm_player_get_volume(g_player, &volume) != MM_ERROR_NONE) -{ - LOGW("failed to get volume\n"); -} - -for (i = 0; i < MM_VOLUME_CHANNEL_NUM; i++) - LOGD("channel[%d] = %d \n", i, volume.level[i]); - * @endcode */ -int mm_player_get_volume(MMHandleType player, mmplayer_volume_type_t *volume); +int mm_player_get_volume(MMHandleType player, float *volume); /** * This function is to start playing media contents. Demux(parser), codec and related plugins are decided \n @@ -917,20 +865,13 @@ int mm_player_set_message_callback(MMHandleType player, MMMessageCallback callba * This function is to mute volume of player * * @param player [in] Handle of player - * @param mute [in] Mute(1) or not mute(0) + * @param mute [in] mute value * * @return This function returns zero on success, or negative value with error code * @see mm_player_get_mute * @remark None - * @par Example - * @code -if (mm_player_set_mute(g_player, TRUE) != MM_ERROR_NONE) -{ - LOGW("failed to set mute\n"); -} - * @endcode */ -int mm_player_set_mute(MMHandleType player, int mute); +int mm_player_set_mute(MMHandleType player, bool mute); /** * This function is to get mute value of player @@ -941,19 +882,8 @@ int mm_player_set_mute(MMHandleType player, int mute); * @return This function returns zero on success, or negative value with error code * @see mm_player_set_mute * @remark None - * @par Example - * @code -int mute; - -if (mm_player_get_mute(g_player, &mute) != MM_ERROR_NONE) -{ - LOGW("failed to get mute\n"); -} - -LOGD("mute status:%d\n", mute); - * @endcode */ -int mm_player_get_mute(MMHandleType player, int *mute); +int mm_player_get_mute(MMHandleType player, bool *mute); /** * This function is to adjust subtitle postion. So, subtitle can show at the adjusted position. \n diff --git a/src/include/mm_player_priv.h b/src/include/mm_player_priv.h index d1d4e37..47dec0b 100644 --- a/src/include/mm_player_priv.h +++ b/src/include/mm_player_priv.h @@ -830,11 +830,11 @@ int _mmplayer_create_player(MMHandleType hplayer); int _mmplayer_destroy(MMHandleType hplayer); int _mmplayer_realize(MMHandleType hplayer); int _mmplayer_unrealize(MMHandleType hplayer); -int _mmplayer_get_state(MMHandleType hplayer, int *pstate); -int _mmplayer_set_volume(MMHandleType hplayer, mmplayer_volume_type_t volume); -int _mmplayer_get_volume(MMHandleType hplayer, mmplayer_volume_type_t *volume); -int _mmplayer_set_mute(MMHandleType hplayer, int mute); -int _mmplayer_get_mute(MMHandleType hplayer, int *pmute); +int _mmplayer_get_state(MMHandleType hplayer, int *state); +int _mmplayer_set_volume(MMHandleType hplayer, float volume); +int _mmplayer_get_volume(MMHandleType hplayer, float *volume); +int _mmplayer_set_mute(MMHandleType hplayer, bool mute); +int _mmplayer_get_mute(MMHandleType hplayer, bool *mute); int _mmplayer_start(MMHandleType hplayer); int _mmplayer_stop(MMHandleType hplayer); int _mmplayer_pause(MMHandleType hplayer); diff --git a/src/mm_player.c b/src/mm_player.c index bc9ac85..683dddb 100644 --- a/src/mm_player.c +++ b/src/mm_player.c @@ -228,23 +228,22 @@ int mm_player_do_video_capture(MMHandleType player) return result; } -int mm_player_set_volume(MMHandleType player, mmplayer_volume_type_t *volume) +int mm_player_set_volume(MMHandleType player, float volume) { int result = MM_ERROR_NONE; MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); - MMPLAYER_RETURN_VAL_IF_FAIL(volume, MM_ERROR_INVALID_ARGUMENT); MMPLAYER_CMD_LOCK(player); - result = _mmplayer_set_volume(player, *volume); + result = _mmplayer_set_volume(player, volume); MMPLAYER_CMD_UNLOCK(player); return result; } -int mm_player_get_volume(MMHandleType player, mmplayer_volume_type_t *volume) +int mm_player_get_volume(MMHandleType player, float *volume) { int result = MM_ERROR_NONE; @@ -260,7 +259,7 @@ int mm_player_get_volume(MMHandleType player, mmplayer_volume_type_t *volume) return result; } -int mm_player_set_mute(MMHandleType player, int mute) +int mm_player_set_mute(MMHandleType player, bool mute) { int result = MM_ERROR_NONE; @@ -275,7 +274,7 @@ int mm_player_set_mute(MMHandleType player, int mute) return result; } -int mm_player_get_mute(MMHandleType player, int *mute) +int mm_player_get_mute(MMHandleType player, bool *mute) { int result = MM_ERROR_NONE; diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index e13f96a..eac4eaf 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -1423,7 +1423,7 @@ __mmplayer_gst_handle_eos_message(mmplayer_t *player, GstMessage *msg) if (count == -1 || player->playback_rate < 0.0) /* default value is 1 */ { if (player->playback_rate < 0.0) { player->resumed_by_rewind = TRUE; - _mmplayer_set_mute((MMHandleType)player, 0); + _mmplayer_set_mute((MMHandleType)player, false); MMPLAYER_POST_MSG(player, MM_MESSAGE_RESUMED_BY_REW, NULL); } diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 3e4f41e..79f4026 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -2899,8 +2899,11 @@ __mmplayer_gst_make_audio_bin_element(mmplayer_t *player, GList **bucket) if (player->build_audio_offload) { /* skip all the audio filters */ LOGD("create audio offload sink : %s", player->ini.audio_offload_sink_element); + MMPLAYER_CREATE_ELEMENT(audiobin, MMPLAYER_A_SINK, player->ini.audio_offload_sink_element, "audiosink", element_bucket, player); - g_object_set(G_OBJECT(audiobin[MMPLAYER_A_SINK].gst), "sync", TRUE, NULL); + g_object_set(G_OBJECT(audiobin[MMPLAYER_A_SINK].gst), "sync", TRUE, + "volume", player->sound.volume, "mute", player->sound.mute, NULL); + __mmplayer_add_sink(player, audiobin[MMPLAYER_A_SINK].gst); goto DONE; } @@ -5113,139 +5116,132 @@ _mmplayer_get_state(MMHandleType hplayer, int *state) return MM_ERROR_NONE; } - -int -_mmplayer_set_volume(MMHandleType hplayer, mmplayer_volume_type_t volume) +static int +__mmplayer_gst_set_volume_property(mmplayer_t *player, const char *prop_name) { - mmplayer_t *player = (mmplayer_t *)hplayer; GstElement *vol_element = NULL; - int i = 0; + enum audio_element_id volume_elem_id = MMPLAYER_A_VOL; MMPLAYER_FENTER(); - MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); - - LOGD("volume [L]=%f:[R]=%f", - volume.level[MM_VOLUME_CHANNEL_LEFT], volume.level[MM_VOLUME_CHANNEL_RIGHT]); - - /* invalid factor range or not */ - for (i = 0; i < MM_VOLUME_CHANNEL_NUM; i++) { - if (volume.level[i] < MM_VOLUME_FACTOR_MIN || volume.level[i] > MM_VOLUME_FACTOR_MAX) { - LOGE("Invalid factor!(valid factor:0~1.0)"); - return MM_ERROR_INVALID_ARGUMENT; - } - } - - /* not support to set other value into each channel */ - if ((volume.level[MM_VOLUME_CHANNEL_LEFT] != volume.level[MM_VOLUME_CHANNEL_RIGHT])) - return MM_ERROR_INVALID_ARGUMENT; - - /* Save volume to handle. Currently the first array element will be saved. */ - player->sound.volume = volume.level[MM_VOLUME_CHANNEL_LEFT]; + MMPLAYER_RETURN_VAL_IF_FAIL(prop_name, MM_ERROR_INVALID_ARGUMENT); /* check pipeline handle */ if (!player->pipeline || !player->pipeline->audiobin) { - LOGD("audiobin is not created yet"); - LOGD("but, current stored volume will be set when it's created."); + LOGD("'%s' will be applied when audiobin is created", prop_name); - /* NOTE : stored volume will be used in create_audiobin + /* NOTE : stored value will be used in create_audiobin * returning MM_ERROR_NONE here makes application to able to - * set volume at anytime. + * set audio volume or mute at anytime. */ return MM_ERROR_NONE; } - /* setting volume to volume element */ - vol_element = player->pipeline->audiobin[MMPLAYER_A_VOL].gst; + if (player->build_audio_offload) { + LOGD("offload pipeline"); + volume_elem_id = MMPLAYER_A_SINK; + } + + vol_element = player->pipeline->audiobin[volume_elem_id].gst; + if (!vol_element) { + LOGE("failed to get vol element %d", volume_elem_id); + return MM_ERROR_PLAYER_INTERNAL; + } - if (vol_element) { - LOGD("volume is set [%f]", player->sound.volume); - g_object_set(vol_element, "volume", player->sound.volume, NULL); + LOGD("set '%s' property to element[%s]", prop_name, GST_ELEMENT_NAME(vol_element)); + + if (!g_object_class_find_property(G_OBJECT_GET_CLASS(vol_element), prop_name)) { + LOGE("there is no '%s' property", prop_name); + return MM_ERROR_PLAYER_INTERNAL; } - MMPLAYER_FLEAVE(); + if (!strcmp(prop_name, "volume")) { + g_object_set(vol_element, "volume", player->sound.volume, NULL); + } else if (!strcmp(prop_name, "mute")) { + g_object_set(vol_element, "mute", player->sound.mute, NULL); + } else { + LOGE("invalid property %s", prop_name); + return MM_ERROR_PLAYER_INTERNAL; + } return MM_ERROR_NONE; } int -_mmplayer_get_volume(MMHandleType hplayer, mmplayer_volume_type_t *volume) +_mmplayer_set_volume(MMHandleType hplayer, float volume) { + int ret = MM_ERROR_NONE; mmplayer_t *player = (mmplayer_t *)hplayer; - int i = 0; MMPLAYER_FENTER(); - MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); - MMPLAYER_RETURN_VAL_IF_FAIL(volume, MM_ERROR_INVALID_ARGUMENT); - /* returning stored volume */ - for (i = 0; i < MM_VOLUME_CHANNEL_NUM; i++) - volume->level[i] = player->sound.volume; + LOGD("volume = %f", volume); - MMPLAYER_FLEAVE(); + /* invalid factor range or not */ + if (volume < MM_VOLUME_FACTOR_MIN || volume > MM_VOLUME_FACTOR_MAX) { + LOGE("Invalid volume value"); + return MM_ERROR_INVALID_ARGUMENT; + } - return MM_ERROR_NONE; + player->sound.volume = volume; + + ret = __mmplayer_gst_set_volume_property(player, "volume"); + + MMPLAYER_FLEAVE(); + return ret; } int -_mmplayer_set_mute(MMHandleType hplayer, int mute) +_mmplayer_get_volume(MMHandleType hplayer, float *volume) { mmplayer_t *player = (mmplayer_t *)hplayer; - GstElement *vol_element = NULL; MMPLAYER_FENTER(); MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); + MMPLAYER_RETURN_VAL_IF_FAIL(volume, MM_ERROR_INVALID_ARGUMENT); - /* mute value shoud 0 or 1 */ - if (mute != 0 && mute != 1) { - LOGE("bad mute value"); + *volume = player->sound.volume; - /* FIXIT : definitly, we need _BAD_PARAM error code */ - return MM_ERROR_INVALID_ARGUMENT; - } + LOGD("current vol = %f", *volume); - player->sound.mute = mute; + MMPLAYER_FLEAVE(); + return MM_ERROR_NONE; +} - /* just hold mute value if pipeline is not ready */ - if (!player->pipeline || !player->pipeline->audiobin) { - LOGD("pipeline is not ready. holding mute value"); - return MM_ERROR_NONE; - } +int +_mmplayer_set_mute(MMHandleType hplayer, bool mute) +{ + int ret = MM_ERROR_NONE; + mmplayer_t *player = (mmplayer_t *)hplayer; - vol_element = player->pipeline->audiobin[MMPLAYER_A_VOL].gst; + MMPLAYER_FENTER(); + MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); - /* NOTE : volume will only created when the bt is enabled */ - if (vol_element) { - LOGD("mute : %d", mute); - g_object_set(vol_element, "mute", mute, NULL); - } else - LOGD("volume elemnet is not created. using volume in audiosink"); + LOGD("mute = %d", mute); - MMPLAYER_FLEAVE(); + player->sound.mute = mute; - return MM_ERROR_NONE; + ret = __mmplayer_gst_set_volume_property(player, "mute"); + + MMPLAYER_FLEAVE(); + return ret; } int -_mmplayer_get_mute(MMHandleType hplayer, int *pmute) +_mmplayer_get_mute(MMHandleType hplayer, bool *mute) { mmplayer_t *player = (mmplayer_t *)hplayer; MMPLAYER_FENTER(); MMPLAYER_RETURN_VAL_IF_FAIL(player, MM_ERROR_PLAYER_NOT_INITIALIZED); - MMPLAYER_RETURN_VAL_IF_FAIL(pmute, MM_ERROR_INVALID_ARGUMENT); + MMPLAYER_RETURN_VAL_IF_FAIL(mute, MM_ERROR_INVALID_ARGUMENT); - /* just hold mute value if pipeline is not ready */ - if (!player->pipeline || !player->pipeline->audiobin) { - LOGD("pipeline is not ready. returning stored value"); - *pmute = player->sound.mute; - return MM_ERROR_NONE; - } + *mute = player->sound.mute; - *pmute = player->sound.mute; + LOGD("current mute = %d", *mute); MMPLAYER_FLEAVE(); @@ -5652,7 +5648,7 @@ _mmplayer_set_playspeed(MMHandleType hplayer, float rate, bool streaming) mmplayer_t *player = (mmplayer_t *)hplayer; gint64 pos_nsec = 0; int ret = MM_ERROR_NONE; - int mute = FALSE; + bool mute = false; signed long long start = 0, stop = 0; mmplayer_state_e current_state = MM_PLAYER_STATE_NONE; MMPLAYER_FENTER(); @@ -5663,7 +5659,7 @@ _mmplayer_set_playspeed(MMHandleType hplayer, float rate, bool streaming) /* The sound of video is not supported under 0.0 and over 2.0. */ if (rate >= TRICK_PLAY_MUTE_THRESHOLD_MAX || rate < TRICK_PLAY_MUTE_THRESHOLD_MIN) { if (player->can_support_codec & FOUND_PLUGIN_VIDEO) - mute = TRUE; + mute = true; } _mmplayer_set_mute(hplayer, mute);