/** * 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_prev: * * play the prev song. * * Returns: TRUE for success, others FALSE. */ gboolean ly_aud_prev() { LyMdhMetadata *md=ly_pqm_get_current_md(); if(!md) return FALSE; GstState state; state=ly_aud_get_state(); ly_aud_stop(); gint random=0; gint repeat=1; gint single=0; ly_reg_get("aud_mode","%d:%d:%d", &random,&repeat,&single); if(random) { ly_pqm_set_rand(); } else { if(single) { if(!repeat) { state=GST_STATE_READY; } } else { ly_pqm_set_prev(); } } if(state==GST_STATE_PLAYING) { ly_aud_play(); } 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; }