| 2040 g_object_unref(sg); |
2041 g_object_unref(sg); |
| 2041 |
2042 |
| 2042 return ret; |
2043 return ret; |
| 2043 } |
2044 } |
| 2044 |
2045 |
| |
2046 #ifdef USE_VV |
| |
2047 |
| |
2048 /* get a GList of pairs name / device */ |
| |
2049 static GList * |
| |
2050 get_device_items(const gchar *plugin) |
| |
2051 { |
| |
2052 GList *ret = NULL; |
| |
2053 GList *devices = purple_media_get_devices(plugin); |
| |
2054 GstElement *element = gst_element_factory_make(plugin, NULL); |
| |
2055 |
| |
2056 if (element == NULL) |
| |
2057 return NULL; |
| |
2058 |
| |
2059 for(; devices ; devices = g_list_delete_link(devices, devices)) { |
| |
2060 gchar *name; |
| |
2061 g_object_set(G_OBJECT(element), "device", devices->data, NULL); |
| |
2062 g_object_get(G_OBJECT(element), "device-name", &name, NULL); |
| |
2063 ret = g_list_append(ret, name); |
| |
2064 ret = g_list_append(ret, devices->data); |
| |
2065 } |
| |
2066 |
| |
2067 gst_object_unref(element); |
| |
2068 return ret; |
| |
2069 } |
| |
2070 |
| |
2071 /* |
| |
2072 * Test functions to run video preview |
| |
2073 */ |
| |
2074 static gboolean |
| |
2075 preview_video_bus_call(GstBus *bus, GstMessage *msg, gpointer pipeline) |
| |
2076 { |
| |
2077 switch(GST_MESSAGE_TYPE(msg)) { |
| |
2078 case GST_MESSAGE_EOS: |
| |
2079 purple_debug_info("preview-video", "End of Stream\n"); |
| |
2080 break; |
| |
2081 case GST_MESSAGE_ERROR: { |
| |
2082 gchar *debug = NULL; |
| |
2083 GError *err = NULL; |
| |
2084 |
| |
2085 gst_message_parse_error(msg, &err, &debug); |
| |
2086 |
| |
2087 purple_debug_error("preview-video", "Error: %s\n", err->message); |
| |
2088 g_error_free(err); |
| |
2089 |
| |
2090 if (debug) { |
| |
2091 purple_debug_error("preview-video", "details: %s\n", debug); |
| |
2092 g_free (debug); |
| |
2093 } |
| |
2094 break; |
| |
2095 } |
| |
2096 default: |
| |
2097 return TRUE; |
| |
2098 } |
| |
2099 |
| |
2100 gst_element_set_state(pipeline, GST_STATE_NULL); |
| |
2101 gst_object_unref(GST_PIPELINE(pipeline)); |
| |
2102 return FALSE; |
| |
2103 } |
| |
2104 |
| |
2105 static void |
| |
2106 preview_button_clicked(GtkWidget *widget, gpointer *data) |
| |
2107 { |
| |
2108 const char *plugin = purple_prefs_get_string("/purple/media/video/plugin"); |
| |
2109 const char *device = purple_prefs_get_string("/purple/media/video/device"); |
| |
2110 GstBus *bus; |
| |
2111 |
| |
2112 /* create a preview window... */ |
| |
2113 GstElement *pipeline = NULL; |
| |
2114 GError *p_err = NULL; |
| |
2115 |
| |
2116 gchar *test_pipeline_str = NULL; |
| |
2117 |
| |
2118 if (strlen(device) > 0) |
| |
2119 test_pipeline_str = g_strdup_printf("%s device=\"%s\" !" \ |
| |
2120 " ffmpegcolorspace !" \ |
| |
2121 " autovideosink", |
| |
2122 plugin, device); |
| |
2123 else |
| |
2124 test_pipeline_str = g_strdup_printf("%s ! ffmpegcolorspace !" \ |
| |
2125 " autovideosink", plugin); |
| |
2126 |
| |
2127 pipeline = gst_parse_launch (test_pipeline_str, &p_err); |
| |
2128 |
| |
2129 g_free(test_pipeline_str); |
| |
2130 |
| |
2131 if (pipeline == NULL) { |
| |
2132 purple_debug_error("gtkprefs", |
| |
2133 "Error starting preview: %s\n", p_err->message); |
| |
2134 g_error_free(p_err); |
| |
2135 return; |
| |
2136 } |
| |
2137 |
| |
2138 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); |
| |
2139 gst_bus_add_watch(bus, preview_video_bus_call, pipeline); |
| |
2140 gst_object_unref(bus); |
| |
2141 |
| |
2142 gst_element_set_state(pipeline, GST_STATE_PLAYING); |
| |
2143 } |
| |
2144 |
| |
2145 static void |
| |
2146 media_plugin_changed_cb(const gchar *name, PurplePrefType type, |
| |
2147 gconstpointer value, gpointer data) |
| |
2148 { |
| |
2149 GtkWidget *hbox = data; |
| |
2150 GtkWidget *dd = NULL; |
| |
2151 GtkWidget *preview_button = NULL; |
| |
2152 const char *plugin = value; |
| |
2153 const char *device = purple_prefs_get_string("/purple/media/video/device"); |
| |
2154 GList *video_items = get_device_items(plugin); |
| |
2155 GList *list; |
| |
2156 |
| |
2157 if (video_items == NULL) { |
| |
2158 video_items = g_list_prepend(video_items, g_strdup("")); |
| |
2159 video_items = g_list_prepend(video_items, g_strdup("Default")); |
| |
2160 } |
| |
2161 |
| |
2162 if (g_list_find(video_items, device) == NULL) |
| |
2163 { |
| |
2164 purple_prefs_set_string("/purple/media/video/device", |
| |
2165 g_list_next(video_items)->data); |
| |
2166 } |
| |
2167 |
| |
2168 list = gtk_container_get_children(GTK_CONTAINER(hbox)); |
| |
2169 |
| |
2170 while (list) { |
| |
2171 gtk_widget_destroy(list->data); |
| |
2172 list = g_list_delete_link(list, list); |
| |
2173 } |
| |
2174 |
| |
2175 dd = pidgin_prefs_dropdown_from_list(hbox, _("_Device:"), PURPLE_PREF_STRING, |
| |
2176 "/purple/media/video/device", |
| |
2177 video_items); |
| |
2178 |
| |
2179 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5); |
| |
2180 |
| |
2181 preview_button = gtk_button_new_with_mnemonic(_("_Preview")); |
| |
2182 g_signal_connect(G_OBJECT(preview_button), "clicked", |
| |
2183 G_CALLBACK(preview_button_clicked), NULL); |
| |
2184 |
| |
2185 gtk_container_add(GTK_CONTAINER(hbox), preview_button); |
| |
2186 |
| |
2187 gtk_widget_show_all(hbox); |
| |
2188 } |
| |
2189 |
| |
2190 static void |
| |
2191 prefs_media_input_volume_changed(GtkRange *range) |
| |
2192 { |
| |
2193 double val = (double)gtk_range_get_value(GTK_RANGE(range)); |
| |
2194 GList *medias = purple_media_manager_get_media(purple_media_manager_get()); |
| |
2195 purple_prefs_set_int("/purple/media/audio/volume/input", val); |
| |
2196 |
| |
2197 val /= 10.0; |
| |
2198 for (; medias; medias = g_list_next(medias)) { |
| |
2199 PurpleMedia *media = PURPLE_MEDIA(medias->data); |
| |
2200 GList *sessions = purple_media_get_session_names(media); |
| |
2201 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { |
| |
2202 const gchar *session = sessions->data; |
| |
2203 if (purple_media_get_session_type(media, session) |
| |
2204 & PURPLE_MEDIA_SEND_AUDIO) { |
| |
2205 GstElement *volume = gst_bin_get_by_name( |
| |
2206 GST_BIN(purple_media_get_src(media, session)), |
| |
2207 "purpleaudioinputvolume"); |
| |
2208 g_object_set(volume, "volume", val, NULL); |
| |
2209 } |
| |
2210 } |
| |
2211 } |
| |
2212 } |
| |
2213 |
| |
2214 static void |
| |
2215 prefs_media_output_volume_changed(GtkRange *range) |
| |
2216 { |
| |
2217 double val = (double)gtk_range_get_value(GTK_RANGE(range)); |
| |
2218 GList *medias = purple_media_manager_get_media(purple_media_manager_get()); |
| |
2219 purple_prefs_set_int("/purple/media/audio/volume/output", val); |
| |
2220 |
| |
2221 val /= 10.0; |
| |
2222 for (; medias; medias = g_list_next(medias)) { |
| |
2223 PurpleMedia *media = PURPLE_MEDIA(medias->data); |
| |
2224 GList *sessions = purple_media_get_session_names(media); |
| |
2225 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { |
| |
2226 const gchar *session = sessions->data; |
| |
2227 if (purple_media_get_session_type(media, session) |
| |
2228 & PURPLE_MEDIA_RECV_AUDIO) { |
| |
2229 GstElement *volume = gst_bin_get_by_name( |
| |
2230 GST_BIN(purple_media_get_sink(media, session)), |
| |
2231 "purpleaudiooutputvolume"); |
| |
2232 g_object_set(volume, "volume", val, NULL); |
| |
2233 } |
| |
2234 } |
| |
2235 } |
| |
2236 } |
| |
2237 |
| |
2238 static GtkWidget * |
| |
2239 media_page() |
| |
2240 { |
| |
2241 GtkWidget *ret; |
| |
2242 GtkWidget *vbox; |
| |
2243 GtkWidget *hbox; |
| |
2244 GtkWidget *dd; |
| |
2245 GtkWidget *preview_button; |
| |
2246 GtkWidget *sw; |
| |
2247 GtkSizeGroup *sg, *sg2; |
| |
2248 const char *plugin = purple_prefs_get_string("/purple/media/video/plugin"); |
| |
2249 const char *device = purple_prefs_get_string("/purple/media/video/device"); |
| |
2250 GList *video_items = get_device_items(plugin); |
| |
2251 GList *audio_items = get_device_items("alsasrc"); |
| |
2252 |
| |
2253 if (video_items == NULL) { |
| |
2254 video_items = g_list_prepend(video_items, ""); |
| |
2255 video_items = g_list_prepend(video_items, "Default"); |
| |
2256 } |
| |
2257 |
| |
2258 if (g_list_find(video_items, device) == NULL) |
| |
2259 { |
| |
2260 purple_prefs_set_string("/purple/media/video/device", |
| |
2261 g_list_next(video_items)->data); |
| |
2262 } |
| |
2263 |
| |
2264 ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE); |
| |
2265 gtk_container_set_border_width (GTK_CONTAINER (ret), PIDGIN_HIG_BORDER); |
| |
2266 |
| |
2267 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
| |
2268 sg2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
| |
2269 |
| |
2270 vbox = pidgin_make_frame (ret, _("Video Input")); |
| |
2271 gtk_size_group_add_widget(sg2, vbox); |
| |
2272 |
| |
2273 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| |
2274 dd = pidgin_prefs_dropdown(vbox, _("_Plugin:"), PURPLE_PREF_STRING, |
| |
2275 "/purple/media/video/plugin", |
| |
2276 _("Default"), "gconfvideosrc", |
| |
2277 _("Video4Linux"), "v4lsrc", |
| |
2278 _("Video4Linux2"), "v4l2src", |
| |
2279 _("Video Test Source"), "videotestsrc", |
| |
2280 NULL); |
| |
2281 |
| |
2282 gtk_size_group_add_widget(sg, dd); |
| |
2283 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5); |
| |
2284 |
| |
2285 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| |
2286 dd = pidgin_prefs_dropdown_from_list(hbox, _("Device:"), PURPLE_PREF_STRING, |
| |
2287 "/purple/media/video/device", |
| |
2288 video_items); |
| |
2289 |
| |
2290 purple_prefs_connect_callback(prefs, "/purple/media/video/plugin", |
| |
2291 media_plugin_changed_cb, hbox); |
| |
2292 |
| |
2293 g_signal_connect_swapped(hbox, "destroy", |
| |
2294 G_CALLBACK(purple_prefs_disconnect_by_handle), hbox); |
| |
2295 |
| |
2296 gtk_size_group_add_widget(sg, dd); |
| |
2297 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5); |
| |
2298 |
| |
2299 preview_button = gtk_button_new_with_mnemonic(_("_Preview")); |
| |
2300 g_signal_connect(G_OBJECT(preview_button), "clicked", |
| |
2301 G_CALLBACK(preview_button_clicked), NULL); |
| |
2302 |
| |
2303 gtk_container_add(GTK_CONTAINER(hbox), preview_button); |
| |
2304 gtk_container_add(GTK_CONTAINER(vbox), hbox); |
| |
2305 |
| |
2306 vbox = pidgin_make_frame (ret, _("Audio Input")); |
| |
2307 gtk_size_group_add_widget(sg2, vbox); |
| |
2308 dd = pidgin_prefs_dropdown_from_list(vbox, _("Device:"), PURPLE_PREF_STRING, |
| |
2309 "/purple/media/audio/device", |
| |
2310 audio_items); |
| |
2311 |
| |
2312 gtk_size_group_add_widget(sg, dd); |
| |
2313 gtk_misc_set_alignment(GTK_MISC(dd), 0, 0.5); |
| |
2314 |
| |
2315 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| |
2316 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
| |
2317 |
| |
2318 /* Input Volume */ |
| |
2319 sw = gtk_hscale_new_with_range(0.0, 100.0, 5.0); |
| |
2320 gtk_range_set_increments(GTK_RANGE(sw), 5.0, 25.0); |
| |
2321 gtk_range_set_value(GTK_RANGE(sw), |
| |
2322 purple_prefs_get_int("/purple/media/audio/volume/input")); |
| |
2323 g_signal_connect (G_OBJECT (sw), "format-value", |
| |
2324 G_CALLBACK (prefs_sound_volume_format), |
| |
2325 NULL); |
| |
2326 g_signal_connect (G_OBJECT (sw), "value-changed", |
| |
2327 G_CALLBACK (prefs_media_input_volume_changed), |
| |
2328 NULL); |
| |
2329 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Volume:"), sg, sw, TRUE, NULL); |
| |
2330 |
| |
2331 vbox = pidgin_make_frame (ret, _("Audio Output")); |
| |
2332 gtk_size_group_add_widget(sg2, vbox); |
| |
2333 |
| |
2334 /* Output Volume */ |
| |
2335 sw = gtk_hscale_new_with_range(0.0, 100.0, 5.0); |
| |
2336 gtk_range_set_increments(GTK_RANGE(sw), 5.0, 25.0); |
| |
2337 gtk_range_set_value(GTK_RANGE(sw), |
| |
2338 purple_prefs_get_int("/purple/media/audio/volume/output")); |
| |
2339 g_signal_connect (G_OBJECT (sw), "format-value", |
| |
2340 G_CALLBACK (prefs_sound_volume_format), |
| |
2341 NULL); |
| |
2342 g_signal_connect (G_OBJECT (sw), "value-changed", |
| |
2343 G_CALLBACK (prefs_media_output_volume_changed), |
| |
2344 NULL); |
| |
2345 pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("Volume:"), sg, sw, TRUE, NULL); |
| |
2346 |
| |
2347 gtk_widget_show_all(ret); |
| |
2348 |
| |
2349 return ret; |
| |
2350 } |
| |
2351 |
| |
2352 #endif /* USE_VV */ |
| 2045 |
2353 |
| 2046 static void |
2354 static void |
| 2047 set_idle_away(PurpleSavedStatus *status) |
2355 set_idle_away(PurpleSavedStatus *status) |
| 2048 { |
2356 { |
| 2049 purple_prefs_set_int("/purple/savedstatus/idleaway", purple_savedstatus_get_creation_time(status)); |
2357 purple_prefs_set_int("/purple/savedstatus/idleaway", purple_savedstatus_get_creation_time(status)); |