All pastes #1979385 Raw Edit

vikky

public text v1 · immutable
#1979385 ·published 2010-11-02 07:21 UTC
rendered paste body
#include "audio.h"#include "gst_driver.h"#include <gst/pbutils/pbutils.h>GstElement	*pipeline;GstElement	*playbin;GstDiscoverer	*discoverer;int AUDIO_is_audio(AUDIO_SESSION *s,const char *url){	return 0;}int AUDIO_get_metadata(AUDIO_SESSION *s, const char *url, AUDIO_metadata *mdata){	GstDiscovererInfo *info;	GError *err;	const GstTagList *tags;	char *cptr;	/* Clear out the meta struct */	mdata->title [0]=0;	mdata->artist[0]=0;	mdata->album [0]=0;	mdata->year =0;	mdata->track=0;	mdata->disc =0;	if(!AUDIO_is_audio(s,url))return 0;		info = gst_discoverer_discover_uri(discoverer,url,&err);	if(gst_discoverer_info_get_result(info)!=GST_DISCOVERER_OK){		g_free(info);		return 1;	}	tags = gst_discoverer_info_get_tags(info);	gst_tag_list_get_string(tags,GST_TAG_TITLE,&cptr);	strcpy(mdata->title,cptr);	free(cptr);	gst_tag_list_get_string(tags,GST_TAG_ALBUM,&cptr);	strcpy(mdata->album,cptr);	free(cptr);	gst_tag_list_get_string(tags,GST_TAG_ARTIST,&cptr);	strcpy(mdata->artist,cptr);	free(cptr);	g_free(info);        mdata->title [LONG_FIELD-1]=0;        mdata->artist[LONG_FIELD-1]=0;        mdata->album [LONG_FIELD-1]=0;	return 0;}int AUDIO_driver_init(AUDIO_SESSION *s, const char *audiodriver){	GstBus *bus;	GstElement *audiosink;	printf("GSTREAMER_driver - init\n");	gst_init(NULL,NULL);	discoverer = gst_discoverer_new(GST_SECOND,NULL);	pipeline = NULL;	pipeline = gst_pipeline_new("Amatory-playpipe");	if(pipeline == NULL){		printf("ERROR: Could not create pipeline\n");		return 1;	}	playbin = NULL;	playbin = gst_element_factory_make("playbin2","bin");	if(playbin == NULL){		printf("ERROR: Could not create bin\n");		return 1;	}	gst_bin_add(GST_BIN(pipeline),playbin);		if(strcmp(audiodriver,"jack")==0){		audiosink = gst_element_factory_make("jackaudiosink",NULL);	}else if(strcmp(audiodriver,"alsa")==0){		audiosink = gst_element_factory_make("alsasink",NULL);	}else {		audiosink = gst_element_factory_make("gconfaudiosink",NULL);	}	g_object_set_property(G_OBJECT(playbin),"audio-sink",audiosink);	bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));	gst_bus_add_watch(bus,GST_DRIVER_bus_cb,s);	gst_object_unref(bus);	return 0;}int AUDIO_play(AUDIO_SESSION *s,char *url, int seek){	gint64 nanolength;	char *uri=NULL;	GstFormat format = GST_FORMAT_TIME;	if(url == NULL){		gst_element_seek_simple (pipeline, GST_FORMAT_TIME,			GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,			seek * GST_SECOND);		return 0;	}			if(gst_element_set_state(pipeline,GST_STATE_READY)==GST_STATE_CHANGE_FAILURE){		printf("AUDIO_play: STATE_READY failed\n");		return 1;	}	uri =  g_filename_to_uri (url, NULL, NULL);	g_object_set (G_OBJECT (playbin), "uri", uri, NULL);	free(uri);	if(gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE){		printf("AUDIO_play: STATE_PLAYING failed\n");		return 1;	}	// Get the stream length for our audio session 	gst_element_query_duration(pipeline, &format, &nanolength);	s->length = (nanolength+(GST_SECOND/2))/GST_SECOND; //GST returns in nanosecs 		time(&s->start_time);	printf("time=%zu,length=%i\n",s->start_time,s->length);	if(s->AUDIO_UI_caller){		s->AUDIO_UI_caller(AUDIO_START,s->cdata);	}	s->playing = 1;	return 0;}int AUDIO_pause(AUDIO_SESSION *s){	GstState state;	gst_element_get_state(pipeline,&state, NULL, 0);	if(state == GST_STATE_PAUSED){		gst_element_set_state (pipeline, GST_STATE_PLAYING);			return 0;	}else if (state == GST_STATE_PLAYING){		gst_element_set_state (pipeline, GST_STATE_PAUSED);			return 0;	}	return 1;}int AUDIO_stop(AUDIO_SESSION *s){	gst_element_set_state(pipeline,GST_STATE_READY);	return 0;}	int AUDIO_seek(AUDIO_SESSION *s, int time){	gst_element_seek (pipeline, 1.0,		GST_FORMAT_TIME,		GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,		GST_SEEK_TYPE_CUR, time * GST_SECOND,		GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);	return 0;}int AUDIO_driver_dinit(AUDIO_SESSION *s){	printf("audi dinit\n");	if(s==NULL)return 0;	gst_element_set_state (pipeline, GST_STATE_NULL);        gst_object_unref (GST_OBJECT (pipeline));        pipeline = NULL;	return 0;}int AUDIO_get_position(AUDIO_SESSION *s,int *pos_time){	gint64 nanolength;	GstFormat format = GST_FORMAT_TIME;	gst_element_query_position(pipeline, &format, &nanolength);	*pos_time = (nanolength+(GST_SECOND/2))/GST_SECOND; 	return 0;}static int GST_DRIVER_bus_cb(GstBus *bus, GstMessage *msg, void *data){	AUDIO_SESSION *s;	char *debug=NULL;        GError *err=NULL;	s = (AUDIO_SESSION*)data;	switch(GST_MESSAGE_TYPE(msg)) {	case GST_MESSAGE_EOS:		s->playing = 0;		if(s->AUDIO_UI_caller)			s->AUDIO_UI_caller(AUDIO_END,s->cdata);		break;	default:		printf("GST_DRIVER: Unhandled Message Type = %s\n",GST_MESSAGE_TYPE_NAME (msg));	}	return 0;}