/** * ly_aud_set_position: * @percent: The desire position you want to seek, it should be between 0 and 1. * * Seek. * * Returns: TRUE for success, others FALSE. */ gboolean ly_aud_set_position(gdouble percent) { LyMdhMetadata *md=ly_pqm_get_current_md(); if(!md) return FALSE; GstElement *play=ly_ppl_get_playbin(); if(!play) return FALSE; gint64 position=0; gint64 start=0; gint64 duration=0; duration=ly_mdh_time_str2int(md->duration); if(duration<10) { return FALSE; } start=ly_mdh_time_str2int(md->start); position=(duration*percent)+start; if(!gst_element_seek(play,1.0,GST_FORMAT_TIME,GST_SEEK_FLAG_FLUSH,GST_SEEK_TYPE_SET,position,GST_SEEK_TYPE_SET,start+duration)) { g_critical(_("Cannot seek to desired position!")); return FALSE; } return TRUE; }
/** * ly_aud_get_state: * * Get the state of playbin. * * Returns: The GStreamer state of playbin. */ GstState ly_aud_get_state() { GstState state; GstClockTime timeout=0; GstElement *play=ly_ppl_get_playbin(); if(!play) return 0; gst_element_get_state(play,&state,NULL,timeout); return state; }
/** * ly_aud_get_position_abs: * * Get the current position by GStreamer inner clock which is in a format of gint64. * * Returns: The abusolute position time. */ gint64 ly_aud_get_position_abs() { GstState state; state=ly_aud_get_state(); if((state!=GST_STATE_PLAYING)&&(state!=GST_STATE_PAUSED)) return 0; LyMdhMetadata *md=ly_pqm_get_current_md(); if(!md) return 0; GstElement *play=ly_ppl_get_playbin(); if(!play) return 0; GstFormat fmt=GST_FORMAT_TIME; gint64 start=0; gint64 dura=0; gint64 pos=0; start=ly_mdh_time_str2int(md->start); dura=ly_mdh_time_str2int(md->duration); if(dura<=0) { gst_element_query_duration(play, &fmt, &dura); dura-=start; gchar *str=ly_mdh_time_int2str(dura); gchar sql[128]=""; g_snprintf(sql, sizeof(sql), "UPDATE metadatas SET duration='%s' WHERE id=%d", str, md->id); g_free(str); ly_dbm_exec(sql, NULL, NULL); ly_pqm_set_current_md(md->id); } if(!gst_element_query_position(play, &fmt, &pos)) { ly_log_put_with_flag(G_LOG_LEVEL_DEBUG, _("Position wrong!")); return 0; } if(pos-start<-60000000000) { ly_log_put_with_flag(G_LOG_LEVEL_DEBUG, _("Position wrong!")); return 0; } pos=pos-start; if(pos<0) pos=0; else if(pos>dura) pos=dura; return pos; }
/** * ly_aud_get_position: * * Get the current postion in gdouble format. * * Returns: The current position of pipeline. */ gdouble ly_aud_get_position() { gint64 pos=0; pos=ly_aud_get_position_abs(); LyMdhMetadata *md=ly_pqm_get_current_md(); if(!md) return 0; GstElement *play=ly_ppl_get_playbin(); if(!play) return 0; gint64 dura=0; gdouble position; dura=ly_mdh_time_str2int(md->duration); if(dura<=0) return 0; position=pos/(double)dura; return position; }
/** * ly_aud_stop: * * Set pipeline to be STOPED. * * Returns: TRUE for success, others FALSE. */ gboolean ly_aud_stop() { LyMdhMetadata *md=ly_pqm_get_current_md(); if(!md) return FALSE; GstElement *play=ly_ppl_get_playbin(); if(!play) return FALSE; if(!gst_element_set_state(play,GST_STATE_NULL)) { ly_log_put_with_flag(G_LOG_LEVEL_WARNING, _("Gstreamer state wrong!")); return FALSE; } if(!gst_element_set_state(play,GST_STATE_READY)) { ly_log_put_with_flag(G_LOG_LEVEL_WARNING, _("Gstreamer state wrong!")); return FALSE; } return TRUE; }
/** * ly_aud_pause: * * Set pipeline to be PAUSED. * * Returns: TRUE for success, others FALSE. */ gboolean ly_aud_pause() { LyMdhMetadata *md=ly_pqm_get_current_md(); if(!md) return FALSE; GstElement *play=ly_ppl_get_playbin(); if(!play) return FALSE; GstState state; state=ly_aud_get_state(); if((state!=GST_STATE_PAUSED)) { if(!gst_element_set_state(play,GST_STATE_PAUSED)) { ly_log_put_with_flag(G_LOG_LEVEL_WARNING, _("Gstreamer state wrong!")); return FALSE; } } ly_mbs_put("pause","core:aud",NULL); return TRUE; }
/** * ly_aud_play: * * Set pipeline to be PLAYING. * * Returns: TRUE for success, others FALSE. */ gboolean ly_aud_play() { LyMdhMetadata *md=ly_pqm_get_current_md(); if(!md) return FALSE; GstElement *play=ly_ppl_get_playbin(); if(!play) return FALSE; GstState state; state=ly_aud_get_state(); if(state!=GST_STATE_PAUSED) { g_object_set(G_OBJECT(play),"uri",md->uri,NULL); if(!gst_element_set_state(play,GST_STATE_PLAYING)) { ly_mbs_put("file_missed", "core:aud", NULL); return FALSE; } if(md->flag==1) //cue play { g_usleep(0.1*G_USEC_PER_SEC); ly_aud_set_position(0); } } else { if(!gst_element_set_state(play,GST_STATE_PLAYING)) { ly_mbs_put("file_missed", "core:aud", NULL); return FALSE; } } ly_mbs_put("play", "core:aud", NULL); return TRUE; }