return ret;
}
-static gboolean
-__mmplayer_can_do_interrupt(mmplayer_t *player)
-{
- if (!player || !player->pipeline || !player->attrs) {
- LOGW("not initialized");
- goto FAILED;
- }
-
- if (player->audio_decoded_cb) {
- LOGW("not support in pcm extraction mode");
- goto FAILED;
- }
-
- /* check if seeking */
- if (player->seek_state != MMPLAYER_SEEK_NONE) {
- MMMessageParamType msg_param;
- memset(&msg_param, 0, sizeof(MMMessageParamType));
- msg_param.code = MM_ERROR_PLAYER_SEEK;
- player->seek_state = MMPLAYER_SEEK_NONE;
- MMPLAYER_POST_MSG(player, MM_MESSAGE_ERROR, &msg_param);
- goto FAILED;
- }
-
- /* check other thread */
- if (!MMPLAYER_CMD_TRYLOCK(player)) {
- LOGW("locked already, cmd state : %d", player->cmd);
-
- /* check application command */
- if (player->cmd == MMPLAYER_COMMAND_START || player->cmd == MMPLAYER_COMMAND_RESUME) {
- LOGW("playing.. should wait cmd lock then, will be interrupted");
-
- /* lock will be released at mrp_resource_release_cb() */
- MMPLAYER_CMD_LOCK(player);
- goto INTERRUPT;
- }
- LOGW("nothing to do");
- goto FAILED;
- } else {
- LOGW("can interrupt immediately");
- goto INTERRUPT;
- }
-
-FAILED: /* with CMD UNLOCKED */
- return FALSE;
-
-INTERRUPT: /* with CMD LOCKED, will do UNLOCK at __resource_release_cb() */
- return TRUE;
-}
-
static int
__resource_release_cb(mm_resource_manager_h rm, mm_resource_manager_res_h res,
void *user_data)
if (!user_data) {
LOGE("user_data is null");
- return FALSE;
+ return TRUE;
}
+
player = (mmplayer_t *)user_data;
- if (!__mmplayer_can_do_interrupt(player)) {
- LOGW("no need to interrupt, so leave");
- /* FIXME: there is no way to avoid releasing resource. */
- return FALSE;
+ if (!player->pipeline || !player->attrs) {
+ LOGW("not initialized");
+ return TRUE;
+ }
+
+ LOGD("cmd lock player, cmd state : %d", player->cmd);
+ MMPLAYER_CMD_LOCK(player);
+ LOGD("cmd locked player");
+
+ if (MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_NULL
+ || MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_NONE) {
+ LOGW("player alreay destoryed");
+ MMPLAYER_CMD_UNLOCK(player);
+ return TRUE;
}
player->interrupted_by_resource = TRUE;
if (_mmplayer_unrealize((MMHandleType)player) != MM_ERROR_NONE)
LOGE("failed to unrealize");
- /* lock is called in __mmplayer_can_do_interrupt() */
MMPLAYER_CMD_UNLOCK(player);
for (res_idx = MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER; res_idx < MMPLAYER_RESOURCE_TYPE_MAX; res_idx++) {
{
mmplayer_t *player = (mmplayer_t *)hplayer;
int ret = MM_ERROR_NONE;
+ int rm_ret = MM_ERROR_NONE;
+ mmplayer_resource_type_e res_idx = MMPLAYER_RESOURCE_TYPE_MAX;
MMPLAYER_FENTER();
/* unrealize pipeline */
ret = __mmplayer_gst_unrealize(player);
- if (!player->interrupted_by_resource) {
- int rm_ret = MM_ERROR_NONE;
- mmplayer_resource_type_e res_idx = MMPLAYER_RESOURCE_TYPE_MAX;
-
- for (res_idx = MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER; res_idx < MMPLAYER_RESOURCE_TYPE_MAX; res_idx++) {
- rm_ret = __mmplayer_release_hw_resource(player, res_idx);
- if (rm_ret != MM_ERROR_NONE)
- LOGE("failed to release [%d] resources", res_idx);
- }
+ for (res_idx = MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER; res_idx < MMPLAYER_RESOURCE_TYPE_MAX; res_idx++) {
+ rm_ret = __mmplayer_release_hw_resource(player, res_idx);
+ if (rm_ret != MM_ERROR_NONE)
+ LOGE("failed to release [%d] resources", res_idx);
}
player->interrupted_by_resource = FALSE;
void _mmplayer_cmd_lock_init(mmplayer_t *player)
{
- MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(player);
player->cmd_lock = g_new0(mmplayer_ticket_lock_t, 1);
g_mutex_init(&player->cmd_lock->ticket_mutex);
g_cond_init(&player->cmd_lock->ticket_cond);
player->cmd_lock->ticket_queue_head = 0;
player->cmd_lock->ticket_queue_tail = 0;
- MMPLAYER_FLEAVE();
}
void _mmplayer_cmd_lock_deinit(mmplayer_t *player)
{
- MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(player && player->cmd_lock);
g_mutex_clear(&player->cmd_lock->ticket_mutex);
g_cond_clear(&player->cmd_lock->ticket_cond);
player->cmd_lock->ticket_queue_head = 0;
player->cmd_lock->ticket_queue_tail = 0;
g_free(player->cmd_lock);
- MMPLAYER_FLEAVE();
}
void _mmplayer_cmd_lock(mmplayer_t *player)
GCond *cond;
GMutex *mutex;
- MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(player && player->cmd_lock);
cond = &player->cmd_lock->ticket_cond;
while (queue_me != player->cmd_lock->ticket_queue_head)
g_cond_wait(cond, mutex);
g_mutex_unlock(mutex);
- MMPLAYER_FLEAVE();
}
gboolean _mmplayer_cmd_trylock(mmplayer_t *player)
{
GMutex *mutex;
- MMPLAYER_FENTER();
MMPLAYER_RETURN_VAL_IF_FAIL(player && player->cmd_lock, FALSE);
mutex = &player->cmd_lock->ticket_mutex;
- if (!g_mutex_trylock(mutex)) {
- MMPLAYER_FLEAVE();
+ if (!g_mutex_trylock(mutex))
return FALSE;
- }
if (player->cmd_lock->ticket_queue_tail != player->cmd_lock->ticket_queue_head) {
g_mutex_unlock(mutex);
- MMPLAYER_FLEAVE();
return FALSE;
}
g_mutex_unlock(mutex);
_mmplayer_cmd_lock(player);
- MMPLAYER_FLEAVE();
return TRUE;
}
GCond *cond;
GMutex *mutex;
- MMPLAYER_FENTER();
MMPLAYER_RETURN_IF_FAIL(player && player->cmd_lock);
cond = &player->cmd_lock->ticket_cond;
(player->cmd_lock->ticket_queue_head + 1) % CMD_LOCK_TICKET_MAX;
g_cond_broadcast(cond);
g_mutex_unlock(mutex);
- MMPLAYER_FLEAVE();
}