rendered paste body#define _GNU_SOURCE#include <dlfcn.h>#include <stdio.h>#include <stdlib.h>#include <gst/gst.h>#include <stdarg.h>#include <time.h>#include "common.h"#include "storage.h"#include "xine_interface.h"char BUFFER_filename[BUFFER_SIZE];static session new;static item *list;//fprintf(stderr,"Gstreamer -> Xine Audio Plugin\t Vikram Ambrose 2008\n"); int get_stamp(){ return (int)rand()&0xff;// return time(NULL);}// file:///home/music/BVSC/Omara%20Portuondo/Buena%20Vista%20Social%20Club%20Presents%20Omara%20Portuondo/03%20-%20Donde%20Estabas%20T%C3%BA%3F.ogg// g_object_set (G_OBJECT (source), "location", argv[1], NULL);//void (*REAL_g_object_set) (gpointer object, const gchar *first_property_name, ...)=NULL;void g_object_set (gpointer object, const gchar *first_property_name, ...){ va_list ap; char *ptr; char *msg; fprintf(stderr,"libGst2XineAudio.so : wrapping g_object_set\n"); fprintf(stderr,"libGst2XineAudio.so : g_object_set : first_property_name = %s\n",first_property_name); va_start(ap, first_property_name); if( strstr(first_property_name,"location") || strstr(first_property_name,"uri") ){ ptr = va_arg(ap, char *); snprintf(BUFFER_filename,BUFFER_SIZE,"%s",ptr); new.p_url = BUFFER_filename; fprintf(stderr,"libGst2XineAudio.so : g_object_set : filename = %s\n",BUFFER_filename); va_end(ap); va_start(ap, first_property_name); } REAL_g_object_set = dlsym(RTLD_NEXT,"g_object_set_valist"); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : g_object_set : dlopen failed : %s\n", msg); exit(1); } else { fprintf(stderr,"libGst2XineAudio.so : REAL_%s = %p\n","g_object_set_valist", REAL_g_object_set); } REAL_g_object_set(object,first_property_name,ap); va_end(ap); return;}void my_main(){ if (new.main != 1){ fprintf(stderr,"libGst2XineAudio.so : Main : 1st time\n"); new.main = 1; }else { fprintf(stderr,"libGst2XineAudio.so : Main : Re-exec\n"); } if(new.state == PLAY){ fprintf(stderr,"libGst2XineAudio.so : Main : new.state = PLAY\n"); SESSION_init(&new); XINE_play(&new,10000,XINE_SPEED_NORMAL); }else if (new.state == PLAYING){ fprintf(stderr,"libGst2XineAudio.so : Main : new.state = PLAYING\n"); }else { fprintf(stderr,"libGst2XineAudio.so : Main : new.state = OTHER\n"); //SESSION_init(&new); }}//g_main_loop_run (loop);void (*REAL_g_main_loop_run)(GMainLoop *loop) = NULL;void g_main_loop_run(GMainLoop *loop){ char *msg; fprintf(stderr,"libGst2XineAudio.so : wrapping g_main_loop_run\n"); fprintf(stderr,"libGst2XineAudio.so : g_main_loop_run : filename = %s\n",new.p_url); REAL_g_main_loop_run = dlsym(RTLD_NEXT,"g_main_loop_run"); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : g_main_loop_run : dlopen failed : %s\n", msg); exit(1); } else { fprintf(stderr,"libGst2XineAudio.so : REAL_%s = %p\n","g_main_loop_run", REAL_g_main_loop_run); } my_main(); REAL_g_main_loop_run(loop);}GstStateChangeReturn (*REAL_gst_element_set_state) (GstElement *element, GstState state) = NULL;GstStateChangeReturn gst_element_set_state (GstElement *element, GstState state){ const char *name = "gst_element_set_state"; char *msg; GstStateChangeReturn rv; GstState old_state; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name);// gst_element_get_state(element,&old_state,NULL,GST_CLOCK_TIME_NONE);// fprintf(stderr,"%i libGst2XineAudio.so : %s : Cur State -> %s\n",stamp,name,gst_element_state_get_name(old_state)); fprintf(stderr,"%i libGst2XineAudio.so : %s : Set State -> %s %4.4x\n",stamp,name,gst_element_state_get_name(state),state); REAL_gst_element_set_state = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_element_set_state); } set(&list,element,state); if(state==GST_STATE_PLAYING){ if(!new.url){ fprintf(stderr,"asked to play without being set\n"); }else { //if(new.state == PLAY){ XINE_play(&new,10000,XINE_SPEED_NORMAL); rv = state; //}else { // new.state = PLAY; //} } }else if (state== GST_STATE_PAUSED){ XINE_play(&new,10000,XINE_SPEED_PAUSE); }else if (state == GST_STATE_READY){ // this is kinda like unpause, i think? XINE_play(&new,10000,XINE_SPEED_NORMAL); }else { fprintf(stderr,"libGst2XineAudio.so : gst_element_set_state : state = %4.4x\n",state); }// REAL_gst_element_set_state(element,state); rv= GST_STATE_CHANGE_SUCCESS; fprintf(stderr,"%i libGst2XineAudio.so : %s : Return State = %s %4.4x\n",stamp,name,gst_element_state_get_name(rv),rv); return rv;}GstStateChangeReturn (*REAL_gst_element_get_state)(GstElement *element, GstState *state, GstState *pending, GstClockTime timeout) = NULL;GstStateChangeReturn gst_element_get_state(GstElement *element, GstState *state, GstState *pending, GstClockTime timeout){ const char *name = "gst_element_get_state"; char *msg; GstStateChangeReturn rv; GstState old_state; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name);// fprintf(stderr,"%i libGst2XineAudio.so : %s : Get State -> %s %4.4x\n",stamp,name,gst_element_state_get_name(state),state); REAL_gst_element_set_state = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_element_get_state); } *state = get(&list,element);// rv = REAL_gst_element_get_state(element,state,pending,timeout); rv = GST_STATE_CHANGE_SUCCESS; return rv;}gboolean (*REAL_gst_element_query_duration) (GstElement *element, GstFormat *format, gint64 *duration)= NULL;gboolean gst_element_query_duration (GstElement *element, GstFormat *format, gint64 *duration){ const char *name = "gst_element_query_duration"; char *msg; int stamp = get_stamp(); int rv; unsigned int answer; fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name); fprintf(stderr,"%i libGst2XineAudio.so : %s : format = %4.4x\n",stamp,name,*format); /* REAL_gst_element_query_duration = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_element_set_state); }*/ // GST has inverse logic, ie 1 = good, 0 = bad rv = !XINE_get_duration(&new,(int*)duration); switch(*format){ case GST_FORMAT_TIME: // in nano secs answer = (*duration * 1000); fprintf(stderr,"%i libGst2XineAudio.so : %s : time (ns) = %i\n",stamp,name,answer); break; case GST_FORMAT_BYTES: answer = get_file_size(new.p_url); fprintf(stderr,"%i libGst2XineAudio.so : %s : size (bytes) = %u\n",stamp,name,answer); break; default: fprintf(stderr,"%i libGst2XineAudio.so : %s : Unknown Implemented Format\n",stamp,name); break; } *duration=answer; return rv;}//gst_element_make_from_uriGstElement* (*REAL_gst_element_make_from_uri)(const GstURIType type,const gchar *uri, const gchar *elementname)=NULL;GstElement* gst_element_make_from_uri(const GstURIType type,const gchar *uri, const gchar *elementname){ const char *name = "gst_element_make_from_uri"; char *msg; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name); fprintf(stderr,"%i libGst2XineAudio.so : %s : uri = %s\n",stamp,name,uri); snprintf(BUFFER_filename,BUFFER_SIZE,"%s",uri); new.p_url = BUFFER_filename; REAL_gst_element_make_from_uri = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_element_make_from_uri); } return REAL_gst_element_make_from_uri(type,uri,elementname); }const gchar* (*REAL_gst_structure_get_name)(const GstStructure *structure)= NULL;const gchar* gst_structure_get_name (const GstStructure *structure){ const char *name = "gst_structure_get_name"; char *msg; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name); fprintf(stderr,"%i libGst2XineAudio.so : %s : structure->type = %4.4x\n",stamp,name,(int)structure->type); REAL_gst_structure_get_name = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_structure_get_name); } return REAL_gst_structure_get_name(structure); }GstStructure* (*REAL_gst_caps_get_structure)(const GstCaps *caps, guint index) = NULL;GstStructure* gst_caps_get_structure(const GstCaps *caps, guint index){ const char *name = "gst_caps_get_structure"; char *msg; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name); fprintf(stderr,"%i libGst2XineAudio.so : %s : index = %4.4x\n",stamp,name,index); REAL_gst_caps_get_structure = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_caps_get_structure); } return REAL_gst_caps_get_structure(caps,index); }GstElement* (*REAL_gst_bin_get_by_name)(GstBin *bin, const gchar *name) = NULL;GstElement* gst_bin_get_by_name(GstBin *bin, const gchar *name){ const char *_name = "gst_bin_get_by_name"; char *msg; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,_name); fprintf(stderr,"%i libGst2XineAudio.so : %s : name = %s\n",stamp,_name,name); REAL_gst_bin_get_by_name = dlsym(RTLD_NEXT,_name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",_name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,_name, REAL_gst_bin_get_by_name); } return REAL_gst_bin_get_by_name(bin,name); }gboolean (*REAL_gst_caps_is_any)(const GstCaps *caps) =NULL;gboolean gst_caps_is_any (const GstCaps *caps){ const char *name = "gst_caps_is_any"; char *msg; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name); //fprintf(stderr,"%i libGst2XineAudio.so : %s : caps = %s\n",stamp,name,gst_caps_to_string (caps)); REAL_gst_caps_is_any = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_caps_is_any); } return REAL_gst_caps_is_any(caps); }gboolean (*REAL_gst_caps_is_empty)(const GstCaps *caps) = NULL;gboolean gst_caps_is_empty (const GstCaps *caps){ const char *name = "gst_caps_is_empty"; char *msg; int stamp = get_stamp(); fprintf(stderr,"%i libGst2XineAudio.so : wrapping %s\n",stamp,name);// fprintf(stderr,"%i libGst2XineAudio.so : %s : caps = %s\n",stamp,name,gst_caps_to_string (caps)); REAL_gst_caps_is_empty = dlsym(RTLD_NEXT,name); if ((msg = dlerror()) != NULL) { fprintf(stderr,"libGst2XineAudio.so : %s : dlopen failed : %s\n",name, msg); exit(1); } else { fprintf(stderr,"%i libGst2XineAudio.so : REAL_%s = %p\n",stamp,name, REAL_gst_caps_is_empty); } return REAL_gst_caps_is_empty(caps); }