static int ksymp_prepare_async_l(KSYMediaPlayer *mp) { assert(mp); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_IDLE); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_INITIALIZED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ASYNC_PREPARING); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PREPARED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STARTED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PAUSED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_COMPLETED); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STOPPED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ERROR); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_END); assert(mp->data_source); // msg_queue_start(&mp->ffplayer->msg_queue); // // // released in msg_loop // ksymp_inc_ref(mp); // mp->msg_thread = SDL_CreateThreadEx(&mp->_msg_thread, mp->msg_loop, mp, "ff_msg_loop"); // TODO: 9 release weak_thiz if pthread_create() failed; ksymp_change_state_l(mp, MP_STATE_ASYNC_PREPARING); int retval = ffp_prepare_async_l(mp->ffplayer, mp->data_source); if (retval < 0) { ksymp_change_state_l(mp, MP_STATE_ERROR); return retval; } return 0; }
void ksymp_shutdown_l(KSYMediaPlayer *mp) { assert(mp); ksymp_change_state_l(mp, MP_STATE_RELEASING); MPTRACE("ksymp_shutdown_l()\n"); if (mp->ffplayer) { ffp_stop_l(mp->ffplayer); ffp_wait_stop_l(mp->ffplayer); } ksymp_change_state_l(mp, MP_STATE_END); MPTRACE("ksymp_shutdown_l()=void\n"); }
static int ksymp_stop_l(KSYMediaPlayer *mp) { assert(mp); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_IDLE); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_INITIALIZED); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ASYNC_PREPARING); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PREPARED); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STARTED); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PAUSED); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_COMPLETED); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STOPPED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ERROR); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_END); ffp_remove_msg(mp->ffplayer, FFP_REQ_START); ffp_remove_msg(mp->ffplayer, FFP_REQ_PAUSE); int retval = ffp_stop_l(mp->ffplayer); if (retval < 0) { return retval; } ksymp_change_state_l(mp, MP_STATE_STOPPED); return 0; }
static int ksymp_set_data_source_l(KSYMediaPlayer *mp, const char *url, const char *header) { assert(mp); assert(url); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_IDLE); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_INITIALIZED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ASYNC_PREPARING); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PREPARED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STARTED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PAUSED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_COMPLETED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STOPPED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ERROR); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_END); av_freep(&mp->data_source); mp->data_source = av_strdup(url); if (!mp->data_source) return EKSY_OUT_OF_MEMORY; if(header != NULL){ av_freep(&mp->header); mp->header = av_strdup(header); if (!mp->header) return EKSY_OUT_OF_MEMORY; } ksymp_change_state_l(mp, MP_STATE_INITIALIZED); return 0; }
int ksymp_get_msg(KSYMediaPlayer *mp, AVMessage *msg, int block) { assert(mp); while (1) { int continue_wait_next_msg = 0; int retval = msg_queue_get(&mp->ffplayer->msg_queue, msg, block); if (retval <= 0) return retval; switch (msg->what) { case FFP_MSG_PREPARED: MPTRACE("ksymp_get_msg: FFP_MSG_PREPARED\n"); pthread_mutex_lock(&mp->mutex); if (mp->mp_state == MP_STATE_ASYNC_PREPARING) { ksymp_change_state_l(mp, MP_STATE_PREPARED); } else { // FIXME: 1: onError() ? ALOGE("FFP_MSG_PREPARED: expecting mp_state==MP_STATE_ASYNC_PREPARING\n"); } pthread_mutex_unlock(&mp->mutex); break; case FFP_MSG_COMPLETED: MPTRACE("ksymp_get_msg: FFP_MSG_COMPLETED\n"); pthread_mutex_lock(&mp->mutex); mp->restart_from_beginning = 1; ksymp_change_state_l(mp, MP_STATE_COMPLETED); pthread_mutex_unlock(&mp->mutex); break; case FFP_MSG_SEEK_COMPLETE: MPTRACE("ksymp_get_msg: FFP_MSG_SEEK_COMPLETE\n"); pthread_mutex_lock(&mp->mutex); mp->seek_req = 0; mp->seek_msec = 0; pthread_mutex_unlock(&mp->mutex); break; case FFP_REQ_START: MPTRACE("ksymp_get_msg: FFP_REQ_START\n"); continue_wait_next_msg = 1; pthread_mutex_lock(&mp->mutex); if (0 == ksymp_chkst_start_l(mp->mp_state)) { // FIXME: 8 check seekable if (mp->mp_state == MP_STATE_COMPLETED) { if (mp->restart_from_beginning) { ALOGD("ksymp_get_msg: FFP_REQ_START: restart from beginning\n"); retval = ffp_start_from_l(mp->ffplayer, 0); if (retval == 0) ksymp_change_state_l(mp, MP_STATE_STARTED); } else { ALOGD("ksymp_get_msg: FFP_REQ_START: restart from seek pos\n"); retval = ffp_start_l(mp->ffplayer); if (retval == 0) ksymp_change_state_l(mp, MP_STATE_STARTED); } mp->restart_from_beginning = 0; } else { ALOGD("ksymp_get_msg: FFP_REQ_START: start on fly\n"); retval = ffp_start_l(mp->ffplayer); if (retval == 0) ksymp_change_state_l(mp, MP_STATE_STARTED); } } pthread_mutex_unlock(&mp->mutex); break; case FFP_REQ_PAUSE: MPTRACE("ksymp_get_msg: FFP_REQ_PAUSE\n"); continue_wait_next_msg = 1; pthread_mutex_lock(&mp->mutex); if (0 == ksymp_chkst_pause_l(mp->mp_state)) { int pause_ret = ffp_pause_l(mp->ffplayer); if (pause_ret == 0) ksymp_change_state_l(mp, MP_STATE_PAUSED); } pthread_mutex_unlock(&mp->mutex); break; case FFP_REQ_SEEK: MPTRACE("ksymp_get_msg: FFP_REQ_SEEK\n"); continue_wait_next_msg = 1; pthread_mutex_lock(&mp->mutex); if (0 == ksymp_chkst_seek_l(mp->mp_state)) { if (0 == ffp_seek_to_l(mp->ffplayer, msg->arg1)) { ALOGD("ksymp_get_msg: FFP_REQ_SEEK: seek to %d\n", (int)msg->arg1); mp->restart_from_beginning = 0; } } pthread_mutex_unlock(&mp->mutex); break; } if (continue_wait_next_msg) continue; return retval; } return -1; }