# HG changeset patch # User Paul Aurich # Date 1249665131 0 # Node ID 30bde00f1909e35f947c45367ea472336bfb8e1b # Parent c1687897825f6a5fcd090a5aa40cc17c67f218c2# Parent 6f27b4d8c1c304325f2cd76026dd501c946f6cc3 merge of '3ec6c363917ec3d2ab175d9e68ed1b9b8bb848fa' and '74d121b6673d769eb89a8ddcab15d8e31cbee94a' diff -r 6f27b4d8c1c3 -r 30bde00f1909 finch/gntmedia.c --- a/finch/gntmedia.c Fri Aug 07 17:11:12 2009 +0000 +++ b/finch/gntmedia.c Fri Aug 07 17:12:11 2009 +0000 @@ -417,11 +417,7 @@ create_default_audio_src(PurpleMedia *media, const gchar *session_id, const gchar *participant) { - GstElement *bin, *src, *volume; - GstPad *pad, *ghost; - double input_volume = purple_prefs_get_int( - "/finch/media/audio/volume/input")/10.0; - + GstElement *src; src = gst_element_factory_make("gconfaudiosrc", NULL); if (src == NULL) src = gst_element_factory_make("autoaudiosrc", NULL); @@ -436,28 +432,15 @@ "element for the default audio source.\n"); return NULL; } - - bin = gst_bin_new("finchdefaultaudiosrc"); - volume = gst_element_factory_make("volume", "purpleaudioinputvolume"); - g_object_set(volume, "volume", input_volume, NULL); - gst_bin_add_many(GST_BIN(bin), src, volume, NULL); - gst_element_link(src, volume); - pad = gst_element_get_pad(volume, "src"); - ghost = gst_ghost_pad_new("ghostsrc", pad); - gst_element_add_pad(bin, ghost); - - return bin; + gst_element_set_name(src, "finchdefaultaudiosrc"); + return src; } static GstElement * create_default_audio_sink(PurpleMedia *media, const gchar *session_id, const gchar *participant) { - GstElement *bin, *sink, *volume, *queue; - GstPad *pad, *ghost; - double output_volume = purple_prefs_get_int( - "/finch/media/audio/volume/output")/10.0; - + GstElement *sink; sink = gst_element_factory_make("gconfaudiosink", NULL); if (sink == NULL) sink = gst_element_factory_make("autoaudiosink",NULL); @@ -466,19 +449,7 @@ "element for the default audio sink.\n"); return NULL; } - - bin = gst_bin_new("finchdefaultaudiosink"); - volume = gst_element_factory_make("volume", "purpleaudiooutputvolume"); - g_object_set(volume, "volume", output_volume, NULL); - queue = gst_element_factory_make("queue", NULL); - gst_bin_add_many(GST_BIN(bin), sink, volume, queue, NULL); - gst_element_link(volume, sink); - gst_element_link(queue, volume); - pad = gst_element_get_pad(queue, "sink"); - ghost = gst_ghost_pad_new("ghostsink", pad); - gst_element_add_pad(bin, ghost); - - return bin; + return sink; } #endif /* USE_VV */ @@ -516,12 +487,6 @@ purple_debug_info("gntmedia", "Registering media element types\n"); purple_media_manager_set_active_element(manager, default_audio_src); purple_media_manager_set_active_element(manager, default_audio_sink); - - purple_prefs_add_none("/finch/media"); - purple_prefs_add_none("/finch/media/audio"); - purple_prefs_add_none("/finch/media/audio/volume"); - purple_prefs_add_int("/finch/media/audio/volume/input", 10); - purple_prefs_add_int("/finch/media/audio/volume/output", 10); #endif } diff -r 6f27b4d8c1c3 -r 30bde00f1909 libpurple/marshallers.list --- a/libpurple/marshallers.list Fri Aug 07 17:11:12 2009 +0000 +++ b/libpurple/marshallers.list Fri Aug 07 17:12:11 2009 +0000 @@ -1,5 +1,6 @@ VOID:POINTER,POINTER,OBJECT BOOLEAN:OBJECT,POINTER,STRING VOID:STRING,STRING +VOID:STRING,STRING,DOUBLE VOID:ENUM,STRING,STRING VOID:ENUM,STRING,STRING,BOOLEAN diff -r 6f27b4d8c1c3 -r 30bde00f1909 libpurple/media.c --- a/libpurple/media.c Fri Aug 07 17:11:12 2009 +0000 +++ b/libpurple/media.c Fri Aug 07 17:12:11 2009 +0000 @@ -94,6 +94,8 @@ FsStream *stream; GstElement *src; GstElement *tee; + GstElement *volume; + GstElement *level; GList *local_candidates; GList *remote_candidates; @@ -159,6 +161,7 @@ S_ERROR, CANDIDATES_PREPARED, CODECS_CHANGED, + LEVEL, NEW_CANDIDATE, STATE_CHANGED, STREAM_INFO, @@ -271,6 +274,10 @@ "PURPLE_MEDIA_INFO_MUTE", "mute" }, { PURPLE_MEDIA_INFO_UNMUTE, "PURPLE_MEDIA_INFO_UNMUTE", "unmute" }, + { PURPLE_MEDIA_INFO_PAUSE, + "PURPLE_MEDIA_INFO_PAUSE", "pause" }, + { PURPLE_MEDIA_INFO_UNPAUSE, + "PURPLE_MEDIA_INFO_UNPAUSE", "unpause" }, { PURPLE_MEDIA_INFO_HOLD, "PURPLE_MEDIA_INFO_HOLD", "hold" }, { PURPLE_MEDIA_INFO_UNHOLD, @@ -340,6 +347,11 @@ G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); + purple_media_signals[LEVEL] = g_signal_new("level", G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, + purple_smarshal_VOID__STRING_STRING_DOUBLE, + G_TYPE_NONE, 3, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_DOUBLE); purple_media_signals[NEW_CANDIDATE] = g_signal_new("new-candidate", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, purple_smarshal_VOID__POINTER_POINTER_OBJECT, @@ -1898,7 +1910,27 @@ gst_element_set_state(session->tee, GST_STATE_PLAYING); g_object_get(session->session, "sink-pad", &sinkpad, NULL); - srcpad = gst_element_get_request_pad(session->tee, "src%d"); + if (session->type & PURPLE_MEDIA_SEND_AUDIO) { + gchar *name = g_strdup_printf("volume_%s", session->id); + GstElement *level; + GstElement *volume = gst_element_factory_make("volume", name); + double input_volume = purple_prefs_get_int( + "/purple/media/audio/volume/input")/10.0; + g_free(name); + name = g_strdup_printf("sendlevel_%s", session->id); + level = gst_element_factory_make("level", name); + g_free(name); + gst_bin_add(GST_BIN(session->media->priv->confbin), volume); + gst_bin_add(GST_BIN(session->media->priv->confbin), level); + gst_element_link(session->tee, volume); + gst_element_link(volume, level); + gst_element_set_state(level, GST_STATE_PLAYING); + gst_element_set_state(volume, GST_STATE_PLAYING); + srcpad = gst_element_get_static_pad(level, "src"); + g_object_set(volume, "volume", input_volume, NULL); + } else { + srcpad = gst_element_get_request_pad(session->tee, "src%d"); + } purple_debug_info("media", "connecting pad: %s\n", gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK ? "success" : "failure"); @@ -1955,6 +1987,55 @@ { switch(GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ELEMENT: { + if (g_signal_has_handler_pending(media, + purple_media_signals[LEVEL], 0, FALSE) + && gst_structure_has_name( + gst_message_get_structure(msg), "level")) { + GstElement *src = GST_ELEMENT(GST_MESSAGE_SRC(msg)); + gchar *name; + gchar *participant = NULL; + PurpleMediaSession *session = NULL; + gdouble rms_db; + gdouble percent; + const GValue *list; + const GValue *value; + + if (!PURPLE_IS_MEDIA(media) || + GST_ELEMENT_PARENT(src) != + media->priv->confbin) + break; + + name = gst_element_get_name(src); + if (!strncmp(name, "sendlevel_", 10)) { + session = purple_media_get_session( + media, name+10); + } else { + GList *iter = media->priv->streams; + for (; iter; iter = g_list_next(iter)) { + PurpleMediaStream *stream = iter->data; + if (stream->level == src) { + session = stream->session; + participant = stream->participant; + break; + } + } + } + g_free(name); + if (!session) + break; + + list = gst_structure_get_value( + gst_message_get_structure(msg), "rms"); + 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; + + g_signal_emit(media, purple_media_signals[LEVEL], + 0, session->id, participant, percent); + break; + } if (!FS_IS_CONFERENCE(GST_MESSAGE_SRC(msg)) || !PURPLE_IS_MEDIA(media) || media->priv->conference != @@ -2172,12 +2253,30 @@ sessions, sessions)) { PurpleMediaSession *session = sessions->data; if (session->type & PURPLE_MEDIA_SEND_AUDIO) { + gchar *name = g_strdup_printf("volume_%s", + session->id); GstElement *volume = gst_bin_get_by_name( - GST_BIN(session->src), - "purpleaudioinputvolume"); + GST_BIN(session->media-> + priv->confbin), name); + g_free(name); g_object_set(volume, "mute", active, NULL); } } + } else if (local == TRUE && (type == PURPLE_MEDIA_INFO_PAUSE || + type == PURPLE_MEDIA_INFO_UNPAUSE)) { + gboolean active = (type == PURPLE_MEDIA_INFO_PAUSE); + GList *streams = purple_media_get_streams(media, + session_id, participant); + for (; streams; streams = g_list_delete_link(streams, streams)) { + PurpleMediaStream *stream = streams->data; + if (stream->session->type & PURPLE_MEDIA_SEND_VIDEO) { + g_object_set(stream->stream, "direction", + purple_media_to_fs_stream_direction( + stream->session->type & ((active) ? + ~PURPLE_MEDIA_SEND_VIDEO : + PURPLE_MEDIA_VIDEO)), NULL); + } + } } g_signal_emit(media, purple_media_signals[STREAM_INFO], @@ -2338,11 +2437,21 @@ GstElement *sink = NULL; if (codec->media_type == FS_MEDIA_TYPE_AUDIO) { + GstElement *queue = NULL; + double output_volume = purple_prefs_get_int( + "/purple/media/audio/volume/output")/10.0; /* * Should this instead be: * audioconvert ! audioresample ! liveadder ! * audioresample ! audioconvert ! realsink */ + queue = gst_element_factory_make("queue", NULL); + stream->volume = gst_element_factory_make( + "volume", NULL); + g_object_set(stream->volume, "volume", + output_volume, NULL); + stream->level = gst_element_factory_make( + "level", NULL); stream->src = gst_element_factory_make( "liveadder", NULL); sink = purple_media_manager_get_element(priv->manager, @@ -2350,16 +2459,28 @@ stream->session->media, stream->session->id, stream->participant); + gst_bin_add(GST_BIN(priv->confbin), queue); + gst_bin_add(GST_BIN(priv->confbin), stream->volume); + gst_bin_add(GST_BIN(priv->confbin), stream->level); + gst_bin_add(GST_BIN(priv->confbin), sink); + gst_element_link(stream->level, sink); + gst_element_link(stream->volume, stream->level); + gst_element_link(queue, stream->volume); + gst_element_sync_state_with_parent(sink); + gst_element_sync_state_with_parent(stream->level); + gst_element_sync_state_with_parent(stream->volume); + sink = queue; } else if (codec->media_type == FS_MEDIA_TYPE_VIDEO) { stream->src = gst_element_factory_make( "fsfunnel", NULL); sink = gst_element_factory_make( "fakesink", NULL); g_object_set(G_OBJECT(sink), "async", FALSE, NULL); + gst_bin_add(GST_BIN(priv->confbin), sink); } stream->tee = gst_element_factory_make("tee", NULL); gst_bin_add_many(GST_BIN(priv->confbin), - stream->src, stream->tee, sink, NULL); + stream->src, stream->tee, NULL); gst_element_sync_state_with_parent(sink); gst_element_sync_state_with_parent(stream->tee); gst_element_sync_state_with_parent(stream->src); @@ -2975,6 +3096,8 @@ g_return_if_fail(PURPLE_IS_MEDIA(media)); + purple_prefs_set_int("/purple/media/audio/volume/input", level); + if (session_id == NULL) sessions = g_hash_table_get_values(media->priv->sessions); else @@ -2985,10 +3108,13 @@ PurpleMediaSession *session = sessions->data; if (session->type & PURPLE_MEDIA_SEND_AUDIO) { + gchar *name = g_strdup_printf("volume_%s", + session->id); GstElement *volume = gst_bin_get_by_name( - GST_BIN(session->src), - "purpleaudioinputvolume"); - g_object_set(volume, "volume", level, NULL); + GST_BIN(session->media->priv->confbin), + name); + g_free(name); + g_object_set(volume, "volume", level/10.0, NULL); } } #endif @@ -3003,34 +3129,17 @@ g_return_if_fail(PURPLE_IS_MEDIA(media)); + purple_prefs_set_int("/purple/media/audio/volume/output", level); + streams = purple_media_get_streams(media, session_id, participant); for (; streams; streams = g_list_delete_link(streams, streams)) { PurpleMediaStream *stream = streams->data; - if (stream->session->type & PURPLE_MEDIA_RECV_AUDIO) { - GstElement *tee = stream->tee; - GstIterator *iter = gst_element_iterate_src_pads(tee); - GstPad *sinkpad; - while (gst_iterator_next(iter, (gpointer)&sinkpad) - == GST_ITERATOR_OK) { - GstPad *peer = gst_pad_get_peer(sinkpad); - GstElement *volume; - - if (peer == NULL) { - gst_object_unref(sinkpad); - continue; - } - - volume = gst_bin_get_by_name(GST_BIN( - GST_OBJECT_PARENT(peer)), - "purpleaudiooutputvolume"); - g_object_set(volume, "volume", level, NULL); - gst_object_unref(peer); - gst_object_unref(sinkpad); - } - gst_iterator_free(iter); + if (stream->session->type & PURPLE_MEDIA_RECV_AUDIO + && GST_IS_ELEMENT(stream->volume)) { + g_object_set(stream->volume, "volume", level/10.0, NULL); } } #endif diff -r 6f27b4d8c1c3 -r 30bde00f1909 libpurple/media.h --- a/libpurple/media.h Fri Aug 07 17:11:12 2009 +0000 +++ b/libpurple/media.h Fri Aug 07 17:12:11 2009 +0000 @@ -103,6 +103,8 @@ PURPLE_MEDIA_INFO_REJECT, PURPLE_MEDIA_INFO_MUTE, PURPLE_MEDIA_INFO_UNMUTE, + PURPLE_MEDIA_INFO_PAUSE, + PURPLE_MEDIA_INFO_UNPAUSE, PURPLE_MEDIA_INFO_HOLD, PURPLE_MEDIA_INFO_UNHOLD, } PurpleMediaInfoType; diff -r 6f27b4d8c1c3 -r 30bde00f1909 libpurple/mediamanager.c --- a/libpurple/mediamanager.c Fri Aug 07 17:11:12 2009 +0000 +++ b/libpurple/mediamanager.c Fri Aug 07 17:12:11 2009 +0000 @@ -157,6 +157,12 @@ media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media); media->priv->medias = NULL; media->priv->next_output_window_id = 1; + + purple_prefs_add_none("/purple/media"); + purple_prefs_add_none("/purple/media/audio"); + purple_prefs_add_none("/purple/media/audio/volume"); + purple_prefs_add_int("/purple/media/audio/volume/input", 10); + purple_prefs_add_int("/purple/media/audio/volume/output", 10); } static void @@ -393,15 +399,19 @@ GstElement *parent = GST_ELEMENT_PARENT(pad); GstIterator *iter; GstPad *remaining_pad; + GstIteratorResult result; gst_element_release_request_pad(GST_ELEMENT_PARENT(pad), pad); - iter = gst_element_iterate_pads(parent); + iter = gst_element_iterate_src_pads(parent); - if (gst_iterator_next(iter, (gpointer)&remaining_pad) - == GST_ITERATOR_DONE) { + result = gst_iterator_next(iter, (gpointer)&remaining_pad); + + if (result == GST_ITERATOR_DONE) { gst_element_set_locked_state(parent, TRUE); gst_element_set_state(parent, GST_STATE_NULL); gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(parent)), parent); + } else if (result == GST_ITERATOR_OK) { + gst_object_unref(remaining_pad); } gst_iterator_free(iter); diff -r 6f27b4d8c1c3 -r 30bde00f1909 pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Fri Aug 07 17:11:12 2009 +0000 +++ b/pidgin/gtkmedia.c Fri Aug 07 17:12:11 2009 +0000 @@ -82,14 +82,14 @@ { PurpleMedia *media; gchar *screenname; - GstElement *send_level; - GstElement *recv_level; + gulong level_handler_id; GtkItemFactory *item_factory; GtkWidget *menubar; GtkWidget *statusbar; GtkWidget *mute; + GtkWidget *pause; GtkWidget *send_progress; GtkWidget *recv_progress; @@ -99,6 +99,7 @@ GtkWidget *display; GtkWidget *send_widget; GtkWidget *recv_widget; + GtkWidget *button_widget; GtkWidget *local_video; GtkWidget *remote_video; @@ -129,9 +130,7 @@ enum { PROP_0, PROP_MEDIA, - PROP_SCREENNAME, - PROP_SEND_LEVEL, - PROP_RECV_LEVEL + PROP_SCREENNAME }; static GType @@ -182,18 +181,6 @@ "The screenname of the user this session is with.", NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, PROP_SEND_LEVEL, - g_param_spec_object("send-level", - "Send level", - "The GstElement of this media's send 'level'", - GST_TYPE_ELEMENT, - G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, PROP_RECV_LEVEL, - g_param_spec_object("recv-level", - "Receive level", - "The GstElement of this media's recv 'level'", - GST_TYPE_ELEMENT, - G_PARAM_READWRITE)); g_type_class_add_private(klass, sizeof(PidginMediaPrivate)); } @@ -207,6 +194,15 @@ NULL, NULL, TRUE); } +static void +pidgin_media_pause_toggled(GtkToggleButton *toggle, PidginMedia *media) +{ + purple_media_stream_info(media->priv->media, + gtk_toggle_button_get_active(toggle) ? + PURPLE_MEDIA_INFO_PAUSE : PURPLE_MEDIA_INFO_UNPAUSE, + NULL, NULL, TRUE); +} + static gboolean pidgin_media_delete_event_cb(GtkWidget *widget, GdkEvent *event, PidginMedia *media) @@ -338,45 +334,16 @@ G_CALLBACK(pidgin_media_delete_event_cb), media); } -static gboolean -level_message_cb(GstBus *bus, GstMessage *message, PidginMedia *gtkmedia) +static void +level_message_cb(PurpleMedia *media, gchar *session_id, gchar *participant, + double level, PidginMedia *gtkmedia) { - gdouble rms_db; - gdouble percent; - const GValue *list; - const GValue *value; - - GstElement *src = GST_ELEMENT(GST_MESSAGE_SRC(message)); GtkWidget *progress; - - if (message->type != GST_MESSAGE_ELEMENT) - return TRUE; - - if (!gst_structure_has_name( - gst_message_get_structure(message), "level")) - return TRUE; - - if (src == gtkmedia->priv->send_level) + if (participant == NULL) progress = gtkmedia->priv->send_progress; - else if (src == gtkmedia->priv->recv_level) + else progress = gtkmedia->priv->recv_progress; - else - return TRUE; - - list = gst_structure_get_value( - gst_message_get_structure(message), "rms"); - - /* Only bother with the first channel. */ - 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; - - gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), percent); - return TRUE; + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), level); } @@ -412,16 +379,6 @@ gtkmedia->priv->item_factory = NULL; } - if (gtkmedia->priv->send_level) { - gst_object_unref(gtkmedia->priv->send_level); - gtkmedia->priv->send_level = NULL; - } - - if (gtkmedia->priv->recv_level) { - gst_object_unref(gtkmedia->priv->recv_level); - gtkmedia->priv->recv_level = NULL; - } - G_OBJECT_CLASS(parent_class)->dispose(media); } @@ -565,8 +522,7 @@ { double val = (double)gtk_range_get_value(GTK_RANGE(range)); #endif - purple_prefs_set_int("/pidgin/media/audio/volume/input", val); - purple_media_set_input_volume(media, NULL, val / 10.0); + purple_media_set_input_volume(media, NULL, val); } static void @@ -580,8 +536,7 @@ { double val = (double)gtk_range_get_value(GTK_RANGE(range)); #endif - purple_prefs_set_int("/pidgin/media/audio/volume/output", val); - purple_media_set_output_volume(media, NULL, NULL, val / 10.0); + purple_media_set_output_volume(media, NULL, NULL, val); } static GtkWidget * @@ -593,10 +548,10 @@ if (type & PURPLE_MEDIA_SEND_AUDIO) { value = purple_prefs_get_int( - "/pidgin/media/audio/volume/input"); + "/purple/media/audio/volume/input"); } else if (type & PURPLE_MEDIA_RECV_AUDIO) { value = purple_prefs_get_int( - "/pidgin/media/audio/volume/output"); + "/purple/media/audio/volume/output"); } else g_return_val_if_reached(NULL); @@ -651,9 +606,7 @@ static void pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia, const gchar *sid) { - PurpleMediaManager *manager = purple_media_get_manager(media); - GstElement *pipeline = purple_media_manager_get_pipeline(manager); - GtkWidget *send_widget = NULL, *recv_widget = NULL; + GtkWidget *send_widget = NULL, *recv_widget = NULL, *button_widget = NULL; PurpleMediaSessionType type = purple_media_get_session_type(media, sid); @@ -672,9 +625,15 @@ send_widget = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display), send_widget, TRUE, TRUE, 0); + button_widget = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); + gtk_box_pack_end(GTK_BOX(send_widget), button_widget, + FALSE, FALSE, 0); + gtk_widget_show(GTK_WIDGET(button_widget)); gtk_widget_show(send_widget); - } else + } else { send_widget = gtkmedia->priv->send_widget; + button_widget = gtkmedia->priv->button_widget; + } if (type & PURPLE_MEDIA_RECV_VIDEO) { PidginMediaRealizeData *data; @@ -727,6 +686,15 @@ gtk_widget_show(local_video); gtk_widget_show(aspect); + gtkmedia->priv->pause = + gtk_toggle_button_new_with_mnemonic(_("_Pause")); + g_signal_connect(gtkmedia->priv->pause, "toggled", + G_CALLBACK(pidgin_media_pause_toggled), + gtkmedia); + gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->pause, + FALSE, FALSE, 0); + gtk_widget_show(gtkmedia->priv->pause); + gtkmedia->priv->local_video = local_video; } @@ -736,44 +704,34 @@ PURPLE_MEDIA_RECV_AUDIO), FALSE, FALSE, 0); } if (type & PURPLE_MEDIA_SEND_AUDIO) { - GstElement *media_src; - GtkWidget *hbox; - - hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_end(GTK_BOX(send_widget), hbox, FALSE, FALSE, 0); gtkmedia->priv->mute = gtk_toggle_button_new_with_mnemonic("_Mute"); g_signal_connect(gtkmedia->priv->mute, "toggled", G_CALLBACK(pidgin_media_mute_toggled), gtkmedia); - gtk_box_pack_end(GTK_BOX(hbox), gtkmedia->priv->mute, + gtk_box_pack_end(GTK_BOX(button_widget), gtkmedia->priv->mute, FALSE, FALSE, 0); gtk_widget_show(gtkmedia->priv->mute); - gtk_widget_show(GTK_WIDGET(hbox)); - - media_src = purple_media_get_src(media, sid); - gtkmedia->priv->send_level = gst_bin_get_by_name( - GST_BIN(media_src), "sendlevel"); gtk_box_pack_end(GTK_BOX(send_widget), pidgin_media_add_audio_widget(gtkmedia, PURPLE_MEDIA_SEND_AUDIO), FALSE, FALSE, 0); - - gtk_widget_show(gtkmedia->priv->mute); } - if (type & PURPLE_MEDIA_AUDIO) { - GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); - g_signal_connect(G_OBJECT(bus), "message::element", - G_CALLBACK(level_message_cb), gtkmedia); - gst_object_unref(bus); + if (type & PURPLE_MEDIA_AUDIO && + gtkmedia->priv->level_handler_id == 0) { + gtkmedia->priv->level_handler_id = g_signal_connect( + media, "level", G_CALLBACK(level_message_cb), + gtkmedia); } if (send_widget != NULL) gtkmedia->priv->send_widget = send_widget; if (recv_widget != NULL) gtkmedia->priv->recv_widget = recv_widget; + if (button_widget != NULL) + gtkmedia->priv->button_widget = button_widget; if (purple_media_is_initiator(media, sid, NULL) == FALSE) { if (gtkmedia->priv->timeout_id != 0) @@ -802,25 +760,6 @@ } else if (state == PURPLE_MEDIA_STATE_NEW && sid != NULL && name != NULL) { pidgin_media_ready_cb(media, gtkmedia, sid); - } else if (state == PURPLE_MEDIA_STATE_CONNECTED && - purple_media_get_session_type(media, sid) & - PURPLE_MEDIA_RECV_AUDIO) { - GstElement *tee = purple_media_get_tee(media, sid, name); - GstIterator *iter = gst_element_iterate_src_pads(tee); - GstPad *sinkpad; - if (gst_iterator_next(iter, (gpointer)&sinkpad) - == GST_ITERATOR_OK) { - GstPad *peer = gst_pad_get_peer(sinkpad); - if (peer != NULL) { - gtkmedia->priv->recv_level = - gst_bin_get_by_name( - GST_BIN(GST_OBJECT_PARENT( - peer)), "recvlevel"); - gst_object_unref(peer); - } - gst_object_unref(sinkpad); - } - gst_iterator_free(iter); } } @@ -875,18 +814,6 @@ g_free(media->priv->screenname); media->priv->screenname = g_value_dup_string(value); break; - case PROP_SEND_LEVEL: - if (media->priv->send_level) - gst_object_unref(media->priv->send_level); - media->priv->send_level = g_value_get_object(value); - g_object_ref(media->priv->send_level); - break; - case PROP_RECV_LEVEL: - if (media->priv->recv_level) - gst_object_unref(media->priv->recv_level); - media->priv->recv_level = g_value_get_object(value); - g_object_ref(media->priv->recv_level); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -908,12 +835,6 @@ case PROP_SCREENNAME: g_value_set_string(value, media->priv->screenname); break; - case PROP_SEND_LEVEL: - g_value_set_object(value, media->priv->send_level); - break; - case PROP_RECV_LEVEL: - g_value_set_object(value, media->priv->recv_level); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1016,11 +937,7 @@ create_default_audio_src(PurpleMedia *media, const gchar *session_id, const gchar *participant) { - GstElement *bin, *src, *volume, *level; - GstPad *pad, *ghost; - double input_volume = purple_prefs_get_int( - "/pidgin/media/audio/volume/input")/10.0; - + GstElement *src; src = gst_element_factory_make("gconfaudiosrc", NULL); if (src == NULL) src = gst_element_factory_make("autoaudiosrc", NULL); @@ -1035,31 +952,15 @@ "element for the default audio source.\n"); return NULL; } - - bin = gst_bin_new("pidgindefaultaudiosrc"); - volume = gst_element_factory_make("volume", "purpleaudioinputvolume"); - g_object_set(volume, "volume", input_volume, NULL); - level = gst_element_factory_make("level", "sendlevel"); - gst_bin_add_many(GST_BIN(bin), src, volume, level, NULL); - gst_element_link(src, volume); - gst_element_link(volume, level); - pad = gst_element_get_pad(level, "src"); - ghost = gst_ghost_pad_new("ghostsrc", pad); - gst_element_add_pad(bin, ghost); - g_object_set(G_OBJECT(level), "message", TRUE, NULL); - - return bin; + gst_element_set_name(src, "pidgindefaultaudiosrc"); + return src; } static GstElement * create_default_audio_sink(PurpleMedia *media, const gchar *session_id, const gchar *participant) { - GstElement *bin, *sink, *volume, *level, *queue; - GstPad *pad, *ghost; - double output_volume = purple_prefs_get_int( - "/pidgin/media/audio/volume/output")/10.0; - + GstElement *sink; sink = gst_element_factory_make("gconfaudiosink", NULL); if (sink == NULL) sink = gst_element_factory_make("autoaudiosink",NULL); @@ -1068,22 +969,7 @@ "element for the default audio sink.\n"); return NULL; } - - bin = gst_bin_new("pidginrecvaudiobin"); - volume = gst_element_factory_make("volume", "purpleaudiooutputvolume"); - g_object_set(volume, "volume", output_volume, NULL); - level = gst_element_factory_make("level", "recvlevel"); - queue = gst_element_factory_make("queue", NULL); - gst_bin_add_many(GST_BIN(bin), sink, volume, level, queue, NULL); - gst_element_link(level, sink); - gst_element_link(volume, level); - gst_element_link(queue, volume); - pad = gst_element_get_pad(queue, "sink"); - ghost = gst_ghost_pad_new("ghostsink", pad); - gst_element_add_pad(bin, ghost); - g_object_set(G_OBJECT(level), "message", TRUE, NULL); - - return bin; + return sink; } #endif /* USE_VV */ @@ -1142,12 +1028,6 @@ purple_media_manager_set_active_element(manager, default_video_sink); purple_media_manager_set_active_element(manager, default_audio_src); purple_media_manager_set_active_element(manager, default_audio_sink); - - purple_prefs_add_none("/pidgin/media"); - purple_prefs_add_none("/pidgin/media/audio"); - purple_prefs_add_none("/pidgin/media/audio/volume"); - purple_prefs_add_int("/pidgin/media/audio/volume/input", 10); - purple_prefs_add_int("/pidgin/media/audio/volume/output", 10); #endif }