diff pidgin/gtkmedia.c @ 25647:e1c8ec1259de

Updates voice and video to use Farsight 2, gets XMPP voice conferences closer to XEP-0167, and fixes a lot of bugs.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Fri, 23 May 2008 02:42:32 +0000
parents befeece4dd48
children 43b3b9ff6028
line wrap: on
line diff
--- a/pidgin/gtkmedia.c	Sun Apr 13 17:53:46 2008 +0000
+++ b/pidgin/gtkmedia.c	Fri May 23 02:42:32 2008 +0000
@@ -32,8 +32,6 @@
 
 #ifdef USE_FARSIGHT
 
-#include <farsight/farsight.h>
-
 typedef enum
 {
 	/* Waiting for response */
@@ -181,37 +179,18 @@
 	gtk_widget_show_all(media->priv->reject);
 }
 
-static void
-pidgin_media_finalize (GObject *media)
-{
-	PidginMedia *gtkmedia = PIDGIN_MEDIA(media);
-	if (gtkmedia->priv->media)
-		g_object_unref(gtkmedia->priv->media);
-	if (gtkmedia->priv->send_level)
-		gst_object_unref(gtkmedia->priv->send_level);
-	if (gtkmedia->priv->recv_level)
-		gst_object_unref(gtkmedia->priv->recv_level);
-}
-
-static void
-pidgin_media_emit_message(PidginMedia *gtkmedia, const char *msg)
-{
-	g_signal_emit(gtkmedia, pidgin_media_signals[MESSAGE], 0, msg);
-}
-
 static gboolean
 level_message_cb(GstBus *bus, GstMessage *message, PidginMedia *gtkmedia)
 {
 	const GstStructure *s;
 	const gchar *name;
 
-	int channels;
-	gdouble rms_db, peak_db, decay_db;
-	gdouble rms;
+	gdouble rms_db;
+	gdouble percent;
 	const GValue *list;
 	const GValue *value;
 
-	GstElement *src = GST_ELEMENT(message);
+	GstElement *src = GST_ELEMENT(GST_MESSAGE_SRC(message));
 
 	if (message->type != GST_MESSAGE_ELEMENT)
 		return TRUE;
@@ -228,14 +207,50 @@
 	value = gst_value_list_get_value(list, 0);
 	rms_db = g_value_get_double(value);
 
+	percent = pow(10, rms_db / 20) * 5;
+
+	if(percent > 1.0)
+		percent = 1.0;
+
 	if (!strcmp(gst_element_get_name(src), "sendlevel"))	
-		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtkmedia->priv->send_progress), pow(10, rms_db / 20) * 5);
+		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtkmedia->priv->send_progress), percent);
 	else
-		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtkmedia->priv->recv_progress), pow(10, rms_db / 20) * 5);
+		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtkmedia->priv->recv_progress), percent);
 
 	return TRUE;
 }
 
+
+static void
+pidgin_media_disconnect_levels(PurpleMedia *media, PidginMedia *gtkmedia)
+{
+	GstElement *element = purple_media_get_audio_pipeline(media);
+	gulong handler_id = g_signal_handler_find(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))),
+						  G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, 
+						  NULL, G_CALLBACK(level_message_cb), gtkmedia);
+	g_signal_handler_disconnect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))), handler_id);
+}
+
+static void
+pidgin_media_finalize (GObject *media)
+{
+	PidginMedia *gtkmedia = PIDGIN_MEDIA(media);
+	if (gtkmedia->priv->media) {
+		pidgin_media_disconnect_levels(gtkmedia->priv->media, gtkmedia);
+		g_object_unref(gtkmedia->priv->media);
+	}
+	if (gtkmedia->priv->send_level)
+		gst_object_unref(gtkmedia->priv->send_level);
+	if (gtkmedia->priv->recv_level)
+		gst_object_unref(gtkmedia->priv->recv_level);
+}
+
+static void
+pidgin_media_emit_message(PidginMedia *gtkmedia, const char *msg)
+{
+	g_signal_emit(gtkmedia, pidgin_media_signals[MESSAGE], 0, msg);
+}
+
 static void
 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia)
 {