# HG changeset patch # User Mark Doliner # Date 1166333928 0 # Node ID e261feef1ce712d63a87f7c438018943fc28868c # Parent 26357b7f117ec0e4fbb537903b9692d65e29f155 [gaim-migrate @ 18013] sf patch #1613563, from Ari Pollak, the spunkiest Debian packager this side of Soleil Moon Frye "This patch should fix at least one gstreamer crash, and it also fixes a potential memory leak." committer: Tailor Script diff -r 26357b7f117e -r e261feef1ce7 gtk/gtksound.c --- a/gtk/gtksound.c Sun Dec 17 05:04:23 2006 +0000 +++ b/gtk/gtksound.c Sun Dec 17 05:38:48 2006 +0000 @@ -394,6 +394,7 @@ char *uri; GstElement *sink = NULL; GstElement *play = NULL; + GstBus *bus = NULL; #endif if (gaim_prefs_get_bool("/gaim/gtk/sound/mute")) @@ -434,9 +435,8 @@ command = g_strdup_printf("%s %s", sound_cmd, filename); if(!g_spawn_command_line_async(command, &error)) { - char *tmp = g_strdup_printf("sound command could not be launched: %s\n", error->message); - gaim_debug_error("gtksound", tmp); - g_free(tmp); + gaim_debug_error("gtksound", "sound command could not be launched: %s\n", error->message); + g_free(command); g_error_free(error); } @@ -453,21 +453,35 @@ } if (!sink) sink = gst_element_factory_make("autoaudiosink", "sink"); + if (!sink) { + gaim_debug_error("sound", "Unable to create GStreamer audiosink.\n"); + return; + } } else if (!strcmp(method, "esd")) { sink = gst_element_factory_make("esdsink", "sink"); + if (!sink) { + gaim_debug_error("sound", "Unable to create GStreamer audiosink.\n"); + return; + } + } else { + gaim_debug_error("sound", "Unknown sound method '%s'\n", method); + return; } + play = gst_element_factory_make("playbin", "play"); + uri = g_strdup_printf("file://%s", filename); - play = gst_element_factory_make("playbin", "play"); g_object_set(G_OBJECT(play), "uri", uri, "volume", volume, "audio-sink", sink, NULL); - gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play)), - bus_call, play); + bus = gst_pipeline_get_bus(GST_PIPELINE(play)); + gst_bus_add_watch(bus, bus_call, play); + gst_element_set_state(play, GST_STATE_PLAYING); + gst_object_unref(bus); g_free(uri); #else /* USE_GSTREAMER */