Mercurial > pidgin.yaz
annotate pidgin/gtkmedia.c @ 25561:1ec6a26cfefc
Remove a compile error, and a few warnings.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Sat, 29 Dec 2007 17:06:59 +0000 |
parents | 8067ba21fdd0 |
children | 741a702033e0 |
rev | line source |
---|---|
25550 | 1 /** |
2 * @file media.c Account API | |
3 * @ingroup core | |
4 * | |
5 * Pidgin | |
6 * | |
7 * Pidgin is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
25 | |
26 #include <string.h> | |
27 #include "internal.h" | |
28 #include "connection.h" | |
29 #include "media.h" | |
30 | |
31 #include "gtkmedia.h" | |
32 | |
33 #ifdef USE_FARSIGHT | |
34 | |
35 #include <farsight/farsight.h> | |
36 | |
37 struct _PidginMediaPrivate | |
38 { | |
39 PurpleMedia *media; | |
40 GstElement *send_level; | |
41 GstElement *recv_level; | |
42 | |
43 GtkWidget *accept; | |
44 GtkWidget *reject; | |
45 GtkWidget *hangup; | |
46 | |
47 GtkWidget *send_progress; | |
48 GtkWidget *recv_progress; | |
49 }; | |
50 | |
51 #define PIDGIN_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PIDGIN_TYPE_MEDIA, PidginMediaPrivate)) | |
52 | |
53 static void pidgin_media_class_init (PidginMediaClass *klass); | |
54 static void pidgin_media_init (PidginMedia *media); | |
55 static void pidgin_media_finalize (GObject *object); | |
56 static void pidgin_media_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); | |
57 static void pidgin_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); | |
58 | |
59 static GtkHBoxClass *parent_class = NULL; | |
60 | |
61 | |
62 | |
63 enum { | |
64 MESSAGE, | |
65 LAST_SIGNAL | |
66 }; | |
67 static guint pidgin_media_signals[LAST_SIGNAL] = {0}; | |
68 | |
69 enum { | |
70 PROP_0, | |
71 PROP_MEDIA, | |
72 PROP_SEND_LEVEL, | |
73 PROP_RECV_LEVEL | |
74 }; | |
75 | |
76 GType | |
77 pidgin_media_get_type() | |
78 { | |
79 static GType type = 0; | |
80 | |
81 if (type == 0) { | |
82 static const GTypeInfo info = { | |
83 sizeof(PidginMediaClass), | |
84 NULL, | |
85 NULL, | |
86 (GClassInitFunc) pidgin_media_class_init, | |
87 NULL, | |
88 NULL, | |
89 sizeof(PidginMedia), | |
90 0, | |
25561
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
91 (GInstanceInitFunc) pidgin_media_init, |
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
92 NULL |
25550 | 93 }; |
94 type = g_type_register_static(GTK_TYPE_HBOX, "PidginMedia", &info, 0); | |
95 } | |
96 return type; | |
97 } | |
98 | |
99 | |
100 static void | |
101 pidgin_media_class_init (PidginMediaClass *klass) | |
102 { | |
103 GObjectClass *gobject_class = (GObjectClass*)klass; | |
104 GtkContainerClass *container_class = (GtkContainerClass*)klass; | |
105 parent_class = g_type_class_peek_parent(klass); | |
106 | |
107 gobject_class->finalize = pidgin_media_finalize; | |
108 gobject_class->set_property = pidgin_media_set_property; | |
109 gobject_class->get_property = pidgin_media_get_property; | |
110 | |
111 g_object_class_install_property(gobject_class, PROP_MEDIA, | |
112 g_param_spec_object("media", | |
113 "PurpleMedia", | |
114 "The PurpleMedia associated with this media.", | |
115 PURPLE_TYPE_MEDIA, | |
116 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); | |
117 g_object_class_install_property(gobject_class, PROP_SEND_LEVEL, | |
118 g_param_spec_object("send-level", | |
119 "Send level", | |
120 "The GstElement of this media's send 'level'", | |
121 GST_TYPE_ELEMENT, | |
122 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); | |
123 g_object_class_install_property(gobject_class, PROP_RECV_LEVEL, | |
124 g_param_spec_object("recv-level", | |
125 "Receive level", | |
126 "The GstElement of this media's recv 'level'", | |
127 GST_TYPE_ELEMENT, | |
128 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); | |
129 | |
130 pidgin_media_signals[MESSAGE] = g_signal_new("message", G_TYPE_FROM_CLASS(klass), | |
131 G_SIGNAL_RUN_LAST, 0, NULL, NULL, | |
132 g_cclosure_marshal_VOID__STRING, | |
133 G_TYPE_NONE, 1, G_TYPE_STRING); | |
134 | |
135 g_type_class_add_private(klass, sizeof(PidginMediaPrivate)); | |
136 } | |
137 | |
138 | |
139 static void | |
140 pidgin_media_init (PidginMedia *media) | |
141 { | |
142 media->priv = PIDGIN_MEDIA_GET_PRIVATE(media); | |
143 media->priv->hangup = gtk_button_new_with_label("Hangup"); | |
144 media->priv->accept = gtk_button_new_with_label("Accept"); | |
145 media->priv->reject = gtk_button_new_with_label("Reject"); | |
146 media->priv->send_progress = gtk_progress_bar_new(); | |
147 media->priv->recv_progress = gtk_progress_bar_new(); | |
148 | |
149 gtk_widget_set_size_request(media->priv->send_progress, 70, 5); | |
150 gtk_widget_set_size_request(media->priv->recv_progress, 70, 5); | |
151 | |
152 gtk_box_pack_start(GTK_BOX(media), media->priv->hangup, FALSE, FALSE, 0); | |
153 gtk_box_pack_start(GTK_BOX(media), media->priv->accept, FALSE, FALSE, 0); | |
154 gtk_box_pack_start(GTK_BOX(media), media->priv->reject, FALSE, FALSE, 0); | |
155 | |
156 gtk_box_pack_start(GTK_BOX(media), media->priv->send_progress, FALSE, FALSE, 6); | |
157 gtk_box_pack_start(GTK_BOX(media), media->priv->recv_progress, FALSE, FALSE, 6); | |
158 | |
159 gtk_widget_show(media->priv->send_progress); | |
160 gtk_widget_show(media->priv->recv_progress); | |
161 gtk_widget_show_all(media->priv->accept); | |
162 gtk_widget_show_all(media->priv->reject); | |
163 } | |
164 | |
165 static void | |
166 pidgin_media_finalize (GObject *media) | |
167 { | |
168 } | |
169 | |
170 static void | |
171 pidgin_media_emit_message(PidginMedia *gtkmedia, const char *msg) | |
172 { | |
173 g_signal_emit(gtkmedia, pidgin_media_signals[MESSAGE], 0, msg); | |
174 } | |
175 | |
176 static gboolean | |
177 level_message_cb(GstBus *bus, GstMessage *message, PidginMedia *gtkmedia) | |
178 { | |
179 const GstStructure *s; | |
180 const gchar *name; | |
181 | |
182 int channels; | |
183 gdouble rms_db, peak_db, decay_db; | |
184 gdouble rms; | |
185 const GValue *list; | |
186 const GValue *value; | |
187 | |
188 GstElement *src = GST_MESSAGE_SRC(message); | |
189 | |
190 if (message->type != GST_MESSAGE_ELEMENT) | |
191 return TRUE; | |
192 | |
193 s = gst_message_get_structure(message); | |
194 name = gst_structure_get_name(s); | |
195 | |
196 if (strcmp(name, "level")) | |
197 return TRUE; | |
198 | |
199 list = gst_structure_get_value(s, "rms"); | |
200 | |
201 /* Only bother with the first channel. */ | |
202 value = gst_value_list_get_value(list, 0); | |
203 rms_db = g_value_get_double(value); | |
204 | |
205 if (!strcmp(gst_element_get_name(src), "sendlevel")) | |
25561
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
206 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtkmedia->priv->send_progress), pow(10, rms_db / 20) * 5); |
25550 | 207 else |
25561
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
208 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtkmedia->priv->recv_progress), pow(10, rms_db / 20) * 5); |
25550 | 209 |
210 return TRUE; | |
211 } | |
212 | |
213 static void | |
214 pidgin_media_ready_cb(PurpleMedia *media, PidginMedia *gtkmedia) | |
215 { | |
216 GstElement *element = purple_media_get_audio_pipeline(media); | |
25561
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
217 gst_bus_add_signal_watch(GST_BUS(gst_pipeline_get_bus(GST_PIPELINE(element)))); |
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
218 g_signal_connect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))), "message", G_CALLBACK(level_message_cb), gtkmedia); |
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
219 printf("\n\nbus: %p\n", gst_pipeline_get_bus(GST_PIPELINE(element))); |
25550 | 220 } |
221 | |
222 static void | |
223 pidgin_media_accept_cb(PurpleMedia *media, PidginMedia *gtkmedia) | |
224 { | |
225 pidgin_media_emit_message(gtkmedia, _("Call in progress.")); | |
226 gtk_widget_show(gtkmedia->priv->hangup); | |
227 gtk_widget_hide(gtkmedia->priv->accept); | |
228 gtk_widget_hide(gtkmedia->priv->reject); | |
229 } | |
230 | |
231 static void | |
232 pidgin_media_hangup_cb(PurpleMedia *media, PidginMedia *gtkmedia) | |
233 { | |
234 pidgin_media_emit_message(gtkmedia, _("You have ended the call.")); | |
25561
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
235 gtk_widget_destroy(GTK_WIDGET(gtkmedia)); |
25550 | 236 } |
237 | |
238 static void | |
239 pidgin_media_reject_cb(PurpleMedia *media, PidginMedia *gtkmedia) | |
240 { | |
241 pidgin_media_emit_message(gtkmedia, _("You have rejected the call.")); | |
25561
1ec6a26cfefc
Remove a compile error, and a few warnings.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
25550
diff
changeset
|
242 gtk_widget_destroy(GTK_WIDGET(gtkmedia)); |
25550 | 243 } |
244 | |
245 static void | |
246 pidgin_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) | |
247 { | |
248 PidginMedia *media; | |
249 g_return_if_fail(PIDGIN_IS_MEDIA(object)); | |
250 | |
251 media = PIDGIN_MEDIA(object); | |
252 switch (prop_id) { | |
253 case PROP_MEDIA: | |
254 if (media->priv->media) | |
255 g_object_unref(media->priv->media); | |
256 media->priv->media = g_value_get_object(value); | |
257 g_object_ref(media->priv->media); | |
258 g_signal_connect_swapped(G_OBJECT(media->priv->accept), "clicked", | |
259 G_CALLBACK(purple_media_accept), media->priv->media); | |
260 g_signal_connect_swapped(G_OBJECT(media->priv->reject), "clicked", | |
261 G_CALLBACK(purple_media_reject), media->priv->media); | |
262 g_signal_connect_swapped(G_OBJECT(media->priv->hangup), "clicked", | |
263 G_CALLBACK(purple_media_hangup), media->priv->media); | |
264 | |
265 g_signal_connect(G_OBJECT(media->priv->media), "accepted", | |
266 G_CALLBACK(pidgin_media_accept_cb), media); | |
267 g_signal_connect(G_OBJECT(media->priv->media) ,"ready", | |
268 G_CALLBACK(pidgin_media_ready_cb), media); | |
269 g_signal_connect(G_OBJECT(media->priv->media), "hangup", | |
270 G_CALLBACK(pidgin_media_hangup_cb), media); | |
271 g_signal_connect(G_OBJECT(media->priv->media), "reject", | |
272 G_CALLBACK(pidgin_media_reject_cb), media); | |
273 break; | |
274 case PROP_SEND_LEVEL: | |
275 if (media->priv->send_level) | |
276 gst_object_unref(media->priv->send_level); | |
277 media->priv->send_level = g_value_get_object(value); | |
278 g_object_ref(media->priv->send_level); | |
279 break; | |
280 case PROP_RECV_LEVEL: | |
281 if (media->priv->recv_level) | |
282 gst_object_unref(media->priv->recv_level); | |
283 media->priv->recv_level = g_value_get_object(value); | |
284 g_object_ref(media->priv->recv_level); | |
285 break; | |
286 default: | |
287 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | |
288 break; | |
289 } | |
290 } | |
291 | |
292 static void | |
293 pidgin_media_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) | |
294 { | |
295 PidginMedia *media; | |
296 g_return_if_fail(PIDGIN_IS_MEDIA(object)); | |
297 | |
298 media = PIDGIN_MEDIA(object); | |
299 | |
300 switch (prop_id) { | |
301 case PROP_MEDIA: | |
302 g_value_set_object(value, media->priv->media); | |
303 break; | |
304 case PROP_SEND_LEVEL: | |
305 g_value_set_object(value, media->priv->send_level); | |
306 break; | |
307 case PROP_RECV_LEVEL: | |
308 g_value_set_object(value, media->priv->recv_level); | |
309 break; | |
310 default: | |
311 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | |
312 break; | |
313 } | |
314 } | |
315 | |
316 GtkWidget * | |
317 pidgin_media_new(PurpleMedia *media, GstElement *sendlevel, GstElement *recvlevel) | |
318 { | |
319 return GTK_WIDGET(g_object_new(pidgin_media_get_type(), "media", media, "send-level", sendlevel, "recv-level", recvlevel, NULL)); | |
320 } | |
321 | |
322 #endif /* USE_FARSIGHT */ |