Exemple #1
0
/**
 * 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;
}
Exemple #2
0
/**
 * 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;
}
Exemple #3
0
/**
 * 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;
}
Exemple #4
0
/**
 * 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;
}