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;}