示例#1
0
文件: aud.c 项目: herenvarno/linnya
/**
 * 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;
}
示例#2
0
文件: aud.c 项目: lovesnow/linnya
/**
 * 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;
}
示例#3
0
文件: aud.c 项目: herenvarno/linnya
/**
 * 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;
}
示例#4
0
文件: aud.c 项目: lovesnow/linnya
/**
 * 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;
}
示例#5
0
文件: aud.c 项目: lovesnow/linnya
/**
 * 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;
}
示例#6
0
文件: aud.c 项目: lovesnow/linnya
/**
 * 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;
}
示例#7
0
文件: aud.c 项目: herenvarno/linnya
/**
 * 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;
}