gst_gnomevfssrc_close_file () -> gnome_vfs_handle_destroy () -> gnome_vfs_uri_unref () -> SIGSEGV



I've attached the source for my test program. It compiles with Gtk2. I'm
using gstreamer, gstreamer-plugins, and monkey-media from CVS. Gstreamer
says it's version 0.4.0.1. GnomeVFS is 2.0.

When I call 

monkey_media_mixer_set_state (mixer, MONKEY_MEDIA_MIXER_STATE_STOPPED);

it releases the gnomevfssrc, which crashes in gnome_vfs_uri_unref ().


In the learned opinions of the list denizens, is this a gstreamer
problem, or a gnomevfs problem?



Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1026 (LWP 8248)]
0x40308820 in gnome_vfs_uri_unref () from /usr/lib/libgnomevfs-2.so.0
(gdb) bt
#0  0x40308820 in gnome_vfs_uri_unref () from
/usr/lib/libgnomevfs-2.so.0
#1  0x402f4378 in gnome_vfs_handle_destroy () from
/usr/lib/libgnomevfs-2.so.0
#2  0x40aa1b1c in gst_gnomevfssrc_close_file (src=0x80fc940) at
gstgnomevfssrc.c:543
#3  0x40aa1c9f in gst_gnomevfssrc_change_state (element=0x80a5468) at
gstgnomevfssrc.c:574
#4  0x402ad864 in gst_element_set_state (element=0x80a5468,
state=GST_STATE_READY)
    at gstelement.c:1931
#5  0x402a44c6 in gst_bin_change_state (element=0x80a4510) at
gstbin.c:533
#6  0x402ad864 in gst_element_set_state (element=0x80a4510,
state=GST_STATE_READY)
    at gstelement.c:1931
#7  0x402a44c6 in gst_bin_change_state (element=0x809e888) at
gstbin.c:533
#8  0x402c0ddb in gst_thread_update_state (thread=0x809e888) at
gstthread.c:286
#9  0x402c2c6a in gst_thread_main_loop (arg=0x809e888) at
gstthread.c:619
#10 0x405bb7e1 in pthread_start_thread () from /lib/i686/libpthread.so.0
#11 0x405bb8e5 in pthread_start_thread_event () from
/lib/i686/libpthread.so.0


-- 
Michael Rothwell
e: rothwell at holly-springs.nc.us
k: http://www.flyingbuttmonkeys.com/rothwell-public-key.txt

#include <gtk/gtk.h> 
#include <stdlib.h> 
#include <monkey-media.h>

/********************************************************
 * globals
 ********************************************************/
GtkWidget *window, *label, *label2, *hbox;
guint iterator_id;
MonkeyMediaMixer *mixer;
MonkeyMediaAudioStream *stream;
GError *error = NULL;

/********************************************************
 * prototypes
 ********************************************************/
void
init_monkeymedia(void);

static gint 
key_callback( GtkWidget *widget,  GdkEventButton *event, gpointer data );

gboolean
timer_callback(gpointer *data);

static void
monkey_media_mixer_end_of_queue_cb (MonkeyMediaMixer *mixer,
                                    gpointer unused);

/********************************************************
 * main
 ********************************************************/
int main (int argc, char **argv) 
{
  iterator_id = 0;

  monkey_media_init (&argc, &argv);
  gtk_init (&argc, &argv);

  init_monkeymedia();

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(window,640,480);

  g_signal_connect(window,"key_press_event", key_callback, NULL);

  hbox = gtk_hbox_new(TRUE,0);
  gtk_container_add(window,hbox);

  label = gtk_label_new("label");
  gtk_container_add(hbox,label);

  label2 = gtk_label_new("label2");
  gtk_container_add(hbox,label2);

  gtk_widget_show_all(window);

  gtk_timeout_add(100,timer_callback,NULL);


  gtk_main();
  exit(0);

};

/********************************************************
 * key_callback
 ********************************************************/
static gint 
key_callback( GtkWidget *widget,  GdkEventButton *event, gpointer data )
{
  printf("\nkey pressed\n");
  if (iterator_id == 0 )
  {
    iterator_id = 1;
    printf("starting\n");
    monkey_media_mixer_set_state (mixer, MONKEY_MEDIA_MIXER_STATE_PLAYING);
  }
  else
  {
    iterator_id = 0;
    printf("stopping\n");
    monkey_media_mixer_set_state (mixer, MONKEY_MEDIA_MIXER_STATE_STOPPED);
  };
};

/********************************************************
 * init_monkeymedia
 ********************************************************/
void
init_monkeymedia(void)
{
  mixer = monkey_media_mixer_new (&error);
  g_signal_connect (G_OBJECT (mixer), "end_of_queue",
                    G_CALLBACK (monkey_media_mixer_end_of_queue_cb),
                    NULL);
  stream = monkey_media_audio_stream_new ("http://kronk/mp3/dukes.mp3";, &error);
  monkey_media_mixer_append_audio_stream (mixer, stream);
  
};

/********************************************************
 * timer_callback
 ********************************************************/
gboolean
timer_callback(gpointer *data)
{
  gchar stime[512];
  GTimeVal t;

  g_get_current_time(&t);

  sprintf(stime,"%d.%d",t.tv_sec,t.tv_usec);

  gtk_label_set_text(label2,stime);
  return TRUE;
};


/********************************************************
 * monkey_media_mixer_end_of_queue_cb
 ********************************************************/
static void
monkey_media_mixer_end_of_queue_cb (MonkeyMediaMixer *mixer,
                                    gpointer unused)
{
        printf ("Audio finished.");

        monkey_media_main_quit ();
}

#PREFIX   = /usr
PKG_CONFIG_PATH = $(PREFIX)lib/pkgconfig/
INCLUDES = `pkg-config monkey-media --cflags` `pkg-config gtk+-2.0 --cflags`
LIBS     = `pkg-config monkey-media --libs` `pkg-config gtk+-2.0 --libs`
#ENV	 = env PKG_CONFIG_PATH=$(PKGCONFIGPATH)

all: gst-test guiapp

clean:
	rm -f core *.o gst-test guiapp

guiapp: guiapp.c
	$(ENV) gcc -o guiapp guiapp.c $(INCLUDES) $(LIBS)

gst-test: gst-test.c
	$(ENV) gcc -o gst-test gst-test.c $(INCLUDES) $(LIBS)
	

Attachment: signature.asc
Description: This is a digitally signed message part



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]