libpurple/mediamanager.c

Fri, 15 Apr 2016 11:49:55 +0200

author
Jakub Adam <jakub.adam@ktknet.cz>
date
Fri, 15 Apr 2016 11:49:55 +0200
branch
release-2.x.y
changeset 37651
b5c43edd21f8
parent 37650
f827e56eea34
child 37691
ae26e3eace57
permissions
-rw-r--r--

media: switch source bin fakesink to PAUSED synchronously

Connecting the source bin to the rest if the pipeline while it's still
in the process of transition to PLAYING can block the pipeline.

Backport of Pidgin 3 commit e382df8b8ab4.

19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
1 /**
19889
defa6a4f45cc Cosmetics.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19885
diff changeset
2 * @file mediamanager.c Media Manager API
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
3 * @ingroup core
26105
7647c0dcf202 * Added documentation to media.h and mediamanager.h
Michael Ruprecht <maiku@pidgin.im>
parents: 26096
diff changeset
4 */
7647c0dcf202 * Added documentation to media.h and mediamanager.h
Michael Ruprecht <maiku@pidgin.im>
parents: 26096
diff changeset
5
7647c0dcf202 * Added documentation to media.h and mediamanager.h
Michael Ruprecht <maiku@pidgin.im>
parents: 26096
diff changeset
6 /* purple
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
7 *
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
8 * Purple is the legal property of its developers, whose names are too numerous
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
9 * to list here. Please refer to the COPYRIGHT file distributed with this
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
10 * source distribution.
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
11 *
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
12 * This program is free software; you can redistribute it and/or modify
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
13 * it under the terms of the GNU General Public License as published by
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
14 * the Free Software Foundation; either version 2 of the License, or
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
15 * (at your option) any later version.
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
16 *
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
17 * This program is distributed in the hope that it will be useful,
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
20 * GNU General Public License for more details.
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
21 *
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
22 * You should have received a copy of the GNU General Public License
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
23 * along with this program; if not, write to the Free Software
28321
c8d617c408ab Update various header copyrights thanks to licensecheck.
Paul Aurich <darkrain42@pidgin.im>
parents: 28162
diff changeset
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
25 */
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
26
19889
defa6a4f45cc Cosmetics.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19885
diff changeset
27 #include "internal.h"
defa6a4f45cc Cosmetics.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19885
diff changeset
28
26746
2a2d45ac9774 Switch media to store accounts rather than connections.
Michael Ruprecht <maiku@pidgin.im>
parents: 26640
diff changeset
29 #include "account.h"
26130
b5e9f243cf89 Gracefully handle missing the fsrtpconference GStreamer plugin.
Michael Ruprecht <maiku@pidgin.im>
parents: 26115
diff changeset
30 #include "debug.h"
26479
47511dae9f81 Move GStreamer related media functions into its own header.
Michael Ruprecht <maiku@pidgin.im>
parents: 26427
diff changeset
31 #include "media.h"
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
32 #include "mediamanager.h"
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
33
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
34 #ifdef USE_GSTREAMER
26792
17140fe8c2f6 Include the media API on win32 even though it isn't actually enabled.
Daniel Atallah <datallah@pidgin.im>
parents: 26760
diff changeset
35 #include "marshallers.h"
26479
47511dae9f81 Move GStreamer related media functions into its own header.
Michael Ruprecht <maiku@pidgin.im>
parents: 26427
diff changeset
36 #include "media-gst.h"
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
37 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
38
23704
9b88c9b23aed Use USE_VV instead of USE_FARSIGHT.
Michael Ruprecht <maiku@pidgin.im>
parents: 23701
diff changeset
39 #ifdef USE_VV
29620
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
40 #include <media/backend-fs2.h>
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
41
32113
2a75cce047d5 Port to Farstream
Olivier Crête <olivier.crete@collabora.com>
parents: 31565
diff changeset
42 #ifdef HAVE_FARSIGHT
28109
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
43 #include <gst/farsight/fs-element-added-notifier.h>
32113
2a75cce047d5 Port to Farstream
Olivier Crête <olivier.crete@collabora.com>
parents: 31565
diff changeset
44 #else
2a75cce047d5 Port to Farstream
Olivier Crête <olivier.crete@collabora.com>
parents: 31565
diff changeset
45 #include <farstream/fs-element-added-notifier.h>
2a75cce047d5 Port to Farstream
Olivier Crête <olivier.crete@collabora.com>
parents: 31565
diff changeset
46 #endif
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
47 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
48 #include <gst/app/app.h>
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
49 #endif
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
50
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
51 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
52 #include <gst/video/videooverlay.h>
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
53 #else
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
54 #include <gst/interfaces/xoverlay.h>
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
55 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
56
26614
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
57 /** @copydoc _PurpleMediaManagerPrivate */
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
58 typedef struct _PurpleMediaManagerPrivate PurpleMediaManagerPrivate;
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
59 /** @copydoc _PurpleMediaOutputWindow */
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
60 typedef struct _PurpleMediaOutputWindow PurpleMediaOutputWindow;
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
61 /** @copydoc _PurpleMediaManagerPrivate */
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
62 typedef struct _PurpleMediaElementInfoPrivate PurpleMediaElementInfoPrivate;
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
63
26614
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
64 /** The media manager class. */
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
65 struct _PurpleMediaManagerClass
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
66 {
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
67 GObjectClass parent_class; /**< The parent class. */
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
68 };
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
69
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
70 /** The media manager's data. */
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
71 struct _PurpleMediaManager
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
72 {
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
73 GObject parent; /**< The parent of this manager. */
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
74 PurpleMediaManagerPrivate *priv; /**< Private data for the manager. */
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
75 };
30eda41f2247 Hide the easy structs in mediamanager.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26522
diff changeset
76
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
77 struct _PurpleMediaOutputWindow
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
78 {
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
79 gulong id;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
80 PurpleMedia *media;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
81 gchar *session_id;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
82 gchar *participant;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
83 gulong window_id;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
84 GstElement *sink;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
85 };
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
86
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
87 struct _PurpleMediaManagerPrivate
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
88 {
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
89 GstElement *pipeline;
26520
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
90 PurpleMediaCaps ui_caps;
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
91 GList *medias;
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
92 GList *private_medias;
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
93 GList *elements;
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
94 GList *output_windows;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
95 gulong next_output_window_id;
29620
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
96 GType backend_type;
31311
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
97 GstCaps *video_caps;
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
98
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
99 PurpleMediaElementInfo *video_src;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
100 PurpleMediaElementInfo *video_sink;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
101 PurpleMediaElementInfo *audio_src;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
102 PurpleMediaElementInfo *audio_sink;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
103
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
104 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
105 /* Application data streams */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
106 GList *appdata_info; /* holds PurpleMediaAppDataInfo */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
107 GMutex appdata_mutex;
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
108 guint appdata_cb_token; /* last used read/write callback token */
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
109 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
110 };
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
111
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
112 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
113 typedef struct {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
114 PurpleMedia *media;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
115 GWeakRef media_ref;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
116 gchar *session_id;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
117 gchar *participant;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
118 PurpleMediaAppDataCallbacks callbacks;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
119 gpointer user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
120 GDestroyNotify notify;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
121 GstAppSrc *appsrc;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
122 GstAppSink *appsink;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
123 gint num_samples;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
124 GstSample *current_sample;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
125 guint sample_offset;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
126 gboolean writable;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
127 gboolean connected;
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
128 guint writable_cb_token;
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
129 guint readable_cb_token;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
130 guint writable_timer_id;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
131 guint readable_timer_id;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
132 GCond readable_cond;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
133 } PurpleMediaAppDataInfo;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
134 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
135
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
136 #define PURPLE_MEDIA_MANAGER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerPrivate))
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
137 #define PURPLE_MEDIA_ELEMENT_INFO_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA_ELEMENT_INFO, PurpleMediaElementInfoPrivate))
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
138
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
139 static void purple_media_manager_class_init (PurpleMediaManagerClass *klass);
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
140 static void purple_media_manager_init (PurpleMediaManager *media);
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
141 static void purple_media_manager_finalize (GObject *object);
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
142 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
143 static void free_appdata_info_locked (PurpleMediaAppDataInfo *info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
144 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
145
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
146 static GObjectClass *parent_class = NULL;
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
147
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
148
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
149
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
150 enum {
19885
593613a22e57 You can actually receive Google Talk voice calls with crappy UI now
Sean Egan <seanegan@pidgin.im>
parents: 19884
diff changeset
151 INIT_MEDIA,
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
152 INIT_PRIVATE_MEDIA,
29540
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
153 UI_CAPS_CHANGED,
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
154 LAST_SIGNAL
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
155 };
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
156 static guint purple_media_manager_signals[LAST_SIGNAL] = {0};
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
157 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
158
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
159 GType
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
160 purple_media_manager_get_type()
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
161 {
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
162 #ifdef USE_VV
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
163 static GType type = 0;
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
164
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
165 if (type == 0) {
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
166 static const GTypeInfo info = {
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
167 sizeof(PurpleMediaManagerClass),
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
168 NULL,
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
169 NULL,
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
170 (GClassInitFunc) purple_media_manager_class_init,
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
171 NULL,
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
172 NULL,
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
173 sizeof(PurpleMediaManager),
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
174 0,
22071
4c47e360e467 Fix the prplinfo structs and get rid of some compile warnings.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19889
diff changeset
175 (GInstanceInitFunc) purple_media_manager_init,
4c47e360e467 Fix the prplinfo structs and get rid of some compile warnings.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19889
diff changeset
176 NULL
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
177 };
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
178 type = g_type_register_static(G_TYPE_OBJECT, "PurpleMediaManager", &info, 0);
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
179 }
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
180 return type;
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
181 #else
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
182 return G_TYPE_NONE;
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
183 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
184 }
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
185
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
186 #ifdef USE_VV
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
187 static void
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
188 purple_media_manager_class_init (PurpleMediaManagerClass *klass)
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
189 {
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
190 GObjectClass *gobject_class = (GObjectClass*)klass;
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
191 parent_class = g_type_class_peek_parent(klass);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 29620
diff changeset
192
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
193 gobject_class->finalize = purple_media_manager_finalize;
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
194
19885
593613a22e57 You can actually receive Google Talk voice calls with crappy UI now
Sean Egan <seanegan@pidgin.im>
parents: 19884
diff changeset
195 purple_media_manager_signals[INIT_MEDIA] = g_signal_new ("init-media",
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
196 G_TYPE_FROM_CLASS (klass),
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
197 G_SIGNAL_RUN_LAST,
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
198 0, NULL, NULL,
26183
d78798f480da Remove connection attribute from PurpleMedia.
Michael Ruprecht <maiku@pidgin.im>
parents: 26150
diff changeset
199 purple_smarshal_BOOLEAN__OBJECT_POINTER_STRING,
d78798f480da Remove connection attribute from PurpleMedia.
Michael Ruprecht <maiku@pidgin.im>
parents: 26150
diff changeset
200 G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
d78798f480da Remove connection attribute from PurpleMedia.
Michael Ruprecht <maiku@pidgin.im>
parents: 26150
diff changeset
201 G_TYPE_POINTER, G_TYPE_STRING);
29540
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
202
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
203 purple_media_manager_signals[INIT_PRIVATE_MEDIA] =
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
204 g_signal_new ("init-private-media",
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
205 G_TYPE_FROM_CLASS (klass),
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
206 G_SIGNAL_RUN_LAST,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
207 0, NULL, NULL,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
208 purple_smarshal_BOOLEAN__OBJECT_POINTER_STRING,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
209 G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
210 G_TYPE_POINTER, G_TYPE_STRING);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
211
29540
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
212 purple_media_manager_signals[UI_CAPS_CHANGED] = g_signal_new ("ui-caps-changed",
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
213 G_TYPE_FROM_CLASS (klass),
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
214 G_SIGNAL_RUN_LAST,
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
215 0, NULL, NULL,
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
216 purple_smarshal_VOID__FLAGS_FLAGS,
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
217 G_TYPE_NONE, 2, PURPLE_MEDIA_TYPE_CAPS,
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
218 PURPLE_MEDIA_TYPE_CAPS);
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
219
19884
b4e424a7411e Some UI ;)
Sean Egan <seanegan@pidgin.im>
parents: 19883
diff changeset
220 g_type_class_add_private(klass, sizeof(PurpleMediaManagerPrivate));
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
221 }
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
222
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
223 static void
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
224 purple_media_manager_init (PurpleMediaManager *media)
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
225 {
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
226 media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media);
19884
b4e424a7411e Some UI ;)
Sean Egan <seanegan@pidgin.im>
parents: 19883
diff changeset
227 media->priv->medias = NULL;
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
228 media->priv->private_medias = NULL;
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
229 media->priv->next_output_window_id = 1;
29620
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
230 media->priv->backend_type = PURPLE_TYPE_MEDIA_BACKEND_FS2;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
231 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
232 media->priv->appdata_info = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
233 g_mutex_init (&media->priv->appdata_mutex);
29620
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
234 #endif
28125
2e47531fc140 Unlink the local audio volume and mute between sessions.
Michael Ruprecht <maiku@pidgin.im>
parents: 28110
diff changeset
235
2e47531fc140 Unlink the local audio volume and mute between sessions.
Michael Ruprecht <maiku@pidgin.im>
parents: 28110
diff changeset
236 purple_prefs_add_none("/purple/media");
2e47531fc140 Unlink the local audio volume and mute between sessions.
Michael Ruprecht <maiku@pidgin.im>
parents: 28110
diff changeset
237 purple_prefs_add_none("/purple/media/audio");
31557
02082aa1ba41 During a voice call, Pidgin now sends constant audio traffic, even when there
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31368
diff changeset
238 purple_prefs_add_int("/purple/media/audio/silence_threshold", 5);
28125
2e47531fc140 Unlink the local audio volume and mute between sessions.
Michael Ruprecht <maiku@pidgin.im>
parents: 28110
diff changeset
239 purple_prefs_add_none("/purple/media/audio/volume");
2e47531fc140 Unlink the local audio volume and mute between sessions.
Michael Ruprecht <maiku@pidgin.im>
parents: 28110
diff changeset
240 purple_prefs_add_int("/purple/media/audio/volume/input", 10);
2e47531fc140 Unlink the local audio volume and mute between sessions.
Michael Ruprecht <maiku@pidgin.im>
parents: 28110
diff changeset
241 purple_prefs_add_int("/purple/media/audio/volume/output", 10);
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
242 }
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
243
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
244 static void
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
245 purple_media_manager_finalize (GObject *media)
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
246 {
26115
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
247 PurpleMediaManagerPrivate *priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media);
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
248 for (; priv->medias; priv->medias =
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
249 g_list_delete_link(priv->medias, priv->medias)) {
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
250 g_object_unref(priv->medias->data);
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
251 }
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
252 for (; priv->private_medias; priv->private_medias =
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
253 g_list_delete_link(priv->private_medias, priv->private_medias)) {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
254 g_object_unref(priv->private_medias->data);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
255 }
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
256 for (; priv->elements; priv->elements =
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
257 g_list_delete_link(priv->elements, priv->elements)) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
258 g_object_unref(priv->elements->data);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
259 }
31311
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
260 if (priv->video_caps)
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
261 gst_caps_unref(priv->video_caps);
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
262 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
263 if (priv->appdata_info)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
264 g_list_free_full (priv->appdata_info,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
265 (GDestroyNotify) free_appdata_info_locked);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
266 g_mutex_clear (&priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
267 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
268
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
269 parent_class->finalize(media);
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
270 }
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
271 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
272
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
273 PurpleMediaManager *
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
274 purple_media_manager_get()
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
275 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
276 #ifdef USE_VV
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
277 static PurpleMediaManager *manager = NULL;
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
278
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
279 if (manager == NULL)
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
280 manager = PURPLE_MEDIA_MANAGER(g_object_new(purple_media_manager_get_type(), NULL));
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
281 return manager;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
282 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
283 return NULL;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
284 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
285 }
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
286
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
287 #ifdef USE_VV
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
288 static gboolean
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
289 pipeline_bus_call(GstBus *bus, GstMessage *msg, PurpleMediaManager *manager)
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
290 {
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
291 switch(GST_MESSAGE_TYPE(msg)) {
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
292 case GST_MESSAGE_EOS:
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
293 purple_debug_info("mediamanager", "End of Stream\n");
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
294 break;
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
295 case GST_MESSAGE_ERROR: {
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
296 gchar *debug = NULL;
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
297 GError *err = NULL;
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
298
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
299 gst_message_parse_error(msg, &err, &debug);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
300
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
301 purple_debug_error("mediamanager",
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
302 "gst pipeline error: %s\n",
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
303 err->message);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
304 g_error_free(err);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
305
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
306 if (debug) {
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
307 purple_debug_error("mediamanager",
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
308 "Debug details: %s\n", debug);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
309 g_free (debug);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
310 }
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
311 break;
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
312 }
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
313 default:
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
314 break;
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
315 }
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
316 return TRUE;
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
317 }
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
318 #endif
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
319
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
320 #ifdef USE_GSTREAMER
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
321 GstElement *
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
322 purple_media_manager_get_pipeline(PurpleMediaManager *manager)
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
323 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
324 #ifdef USE_VV
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
325 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
326
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
327 if (manager->priv->pipeline == NULL) {
28110
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
328 FsElementAddedNotifier *notifier;
28109
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
329 gchar *filename;
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
330 GError *err = NULL;
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
331 GKeyFile *keyfile;
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
332 GstBus *bus;
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
333 manager->priv->pipeline = gst_pipeline_new(NULL);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
334
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
335 bus = gst_pipeline_get_bus(
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
336 GST_PIPELINE(manager->priv->pipeline));
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
337 gst_bus_add_signal_watch(GST_BUS(bus));
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
338 g_signal_connect(G_OBJECT(bus), "message",
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
339 G_CALLBACK(pipeline_bus_call), manager);
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
340 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
341 gst_bus_set_sync_handler(bus, gst_bus_sync_signal_handler, NULL, NULL);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
342 #else
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
343 gst_bus_set_sync_handler(bus, gst_bus_sync_signal_handler, NULL);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
344 #endif
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
345 gst_object_unref(bus);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
346
28109
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
347 filename = g_build_filename(purple_user_dir(),
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
348 "fs-element.conf", NULL);
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
349 keyfile = g_key_file_new();
28110
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
350 if (!g_key_file_load_from_file(keyfile, filename,
28109
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
351 G_KEY_FILE_NONE, &err)) {
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
352 if (err->code == 4)
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
353 purple_debug_info("mediamanager",
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
354 "Couldn't read "
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
355 "fs-element.conf: %s\n",
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
356 err->message);
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
357 else
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
358 purple_debug_error("mediamanager",
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
359 "Error reading "
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
360 "fs-element.conf: %s\n",
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
361 err->message);
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
362 g_error_free(err);
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
363 }
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
364 g_free(filename);
0c7d09754f78 Allow setting properties on GStreamer elements with fs-element.conf.
Michael Ruprecht <maiku@pidgin.im>
parents: 27926
diff changeset
365
28110
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
366 /* Hack to make alsasrc stop messing up audio timestamps */
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
367 if (!g_key_file_has_key(keyfile,
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
368 "alsasrc", "slave-method", NULL)) {
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
369 g_key_file_set_integer(keyfile,
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
370 "alsasrc", "slave-method", 2);
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
371 }
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
372
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
373 notifier = fs_element_added_notifier_new();
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
374 fs_element_added_notifier_add(notifier,
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
375 GST_BIN(manager->priv->pipeline));
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
376 fs_element_added_notifier_set_properties_from_keyfile(
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
377 notifier, keyfile);
f0fd4a9d7c5a Set alsasrc's slave-method to 2. This stops the audio timestamps from
Michael Ruprecht <maiku@pidgin.im>
parents: 28109
diff changeset
378
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
379 gst_element_set_state(manager->priv->pipeline,
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
380 GST_STATE_PLAYING);
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
381 }
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
382
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
383 return manager->priv->pipeline;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
384 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
385 return NULL;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
386 #endif
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
387 }
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
388 #endif /* USE_GSTREAMER */
26320
2e9c1e8391f4 Move pipeline creation into the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 26315
diff changeset
389
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
390 static PurpleMedia *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
391 create_media(PurpleMediaManager *manager,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
392 PurpleAccount *account,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
393 const char *conference_type,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
394 const char *remote_user,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
395 gboolean initiator,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
396 gboolean private)
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
397 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
398 #ifdef USE_VV
23701
ecbd92b724df Added better Farsight error handling. Fixes several crash bugs related
Michael Ruprecht <maiku@pidgin.im>
parents: 23697
diff changeset
399 PurpleMedia *media;
36330
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
400 guint signal_id;
23701
ecbd92b724df Added better Farsight error handling. Fixes several crash bugs related
Michael Ruprecht <maiku@pidgin.im>
parents: 23697
diff changeset
401
ecbd92b724df Added better Farsight error handling. Fixes several crash bugs related
Michael Ruprecht <maiku@pidgin.im>
parents: 23697
diff changeset
402 media = PURPLE_MEDIA(g_object_new(purple_media_get_type(),
26315
c72d67da93eb Use the media manager that created the media session in media.c.
Michael Ruprecht <maiku@pidgin.im>
parents: 26289
diff changeset
403 "manager", manager,
26746
2a2d45ac9774 Switch media to store accounts rather than connections.
Michael Ruprecht <maiku@pidgin.im>
parents: 26640
diff changeset
404 "account", account,
29565
c37ea1d82326 Start to use the media backend code in PurpleMedia and PurpleMediaManager.
Michael Ruprecht <maiku@pidgin.im>
parents: 29540
diff changeset
405 "conference-type", conference_type,
26187
3b3059a7c091 Add initiator property to PurpleMedia.
Michael Ruprecht <maiku@pidgin.im>
parents: 26185
diff changeset
406 "initiator", initiator,
23701
ecbd92b724df Added better Farsight error handling. Fixes several crash bugs related
Michael Ruprecht <maiku@pidgin.im>
parents: 23697
diff changeset
407 NULL));
26096
7249fdfc2eab Set the media pipeline to PLAYING immediately after initialization
Michael Ruprecht <maiku@pidgin.im>
parents: 23704
diff changeset
408
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
409 signal_id = private ?
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
410 purple_media_manager_signals[INIT_PRIVATE_MEDIA] :
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
411 purple_media_manager_signals[INIT_MEDIA];
36330
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
412
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
413 if (g_signal_has_handler_pending(manager, signal_id, 0, FALSE)) {
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
414 gboolean signal_ret;
26111
d25772351a75 Stop additional media sessions within a single conversation for grouped contacts.
Michael Ruprecht <maiku@pidgin.im>
parents: 26105
diff changeset
415
36330
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
416 g_signal_emit(manager, signal_id, 0, media, account, remote_user,
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
417 &signal_ret);
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
418 if (signal_ret == FALSE) {
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
419 g_object_unref(media);
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
420 return NULL;
7767aaeade64 media: make "init-media" signal handler optional
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36329
diff changeset
421 }
26111
d25772351a75 Stop additional media sessions within a single conversation for grouped contacts.
Michael Ruprecht <maiku@pidgin.im>
parents: 26105
diff changeset
422 }
d25772351a75 Stop additional media sessions within a single conversation for grouped contacts.
Michael Ruprecht <maiku@pidgin.im>
parents: 26105
diff changeset
423
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
424 if (private)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
425 manager->priv->private_medias = g_list_append(
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
426 manager->priv->private_medias, media);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
427 else
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
428 manager->priv->medias = g_list_append(manager->priv->medias, media);
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
429 return media;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
430 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
431 return NULL;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
432 #endif
19883
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
433 }
2b59550f211d Missed files
Sean Egan <seanegan@pidgin.im>
parents:
diff changeset
434
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
435 static GList *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
436 get_media(PurpleMediaManager *manager, gboolean private)
26115
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
437 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
438 #ifdef USE_VV
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
439 if (private)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
440 return manager->priv->private_medias;
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
441 else
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
442 return manager->priv->medias;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
443 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
444 return NULL;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
445 #endif
26115
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
446 }
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
447
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
448 static GList *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
449 get_media_by_account(PurpleMediaManager *manager,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
450 PurpleAccount *account, gboolean private)
26329
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
451 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
452 #ifdef USE_VV
26329
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
453 GList *media = NULL;
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
454 GList *iter;
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
455
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
456 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL);
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
457
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
458 if (private)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
459 iter = manager->priv->private_medias;
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
460 else
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
461 iter = manager->priv->medias;
26329
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
462 for (; iter; iter = g_list_next(iter)) {
26746
2a2d45ac9774 Switch media to store accounts rather than connections.
Michael Ruprecht <maiku@pidgin.im>
parents: 26640
diff changeset
463 if (purple_media_get_account(iter->data) == account) {
26329
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
464 media = g_list_prepend(media, iter->data);
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
465 }
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
466 }
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
467
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
468 return media;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
469 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
470 return NULL;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
471 #endif
26329
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
472 }
6e390d9ea49a Added purple_media_manager_get_media_by_connection.
Michael Ruprecht <maiku@pidgin.im>
parents: 26327
diff changeset
473
26115
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
474 void
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
475 purple_media_manager_remove_media(PurpleMediaManager *manager, PurpleMedia *media)
26115
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
476 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
477 #ifdef USE_VV
35992
34a67264df99 Fix some CWE-476 coverity warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 32113
diff changeset
478 GList *list;
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
479 GList **medias;
35992
34a67264df99 Fix some CWE-476 coverity warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 32113
diff changeset
480
34a67264df99 Fix some CWE-476 coverity warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 32113
diff changeset
481 g_return_if_fail(manager != NULL);
34a67264df99 Fix some CWE-476 coverity warnings
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents: 32113
diff changeset
482
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
483 if ((list = g_list_find(manager->priv->medias, media))) {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
484 medias = &manager->priv->medias;
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
485 } else if ((list = g_list_find(manager->priv->private_medias, media))) {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
486 medias = &manager->priv->private_medias;
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
487 }
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
488
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
489 if (list) {
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
490 *medias = g_list_delete_link(*medias, list);
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
491
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
492 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
493 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
494 for (list = manager->priv->appdata_info; list; list = list->next) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
495 PurpleMediaAppDataInfo *info = list->data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
496
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
497 if (info->media == media) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
498 manager->priv->appdata_info = g_list_delete_link (
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
499 manager->priv->appdata_info, list);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
500 free_appdata_info_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
501 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
502 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
503 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
504 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
505 }
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
506 #endif
26115
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
507 }
5f0500efc781 * Added input/output volume preferences for voice conversations.
Michael Ruprecht <maiku@pidgin.im>
parents: 26111
diff changeset
508
36331
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
509 PurpleMedia *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
510 purple_media_manager_create_media(PurpleMediaManager *manager,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
511 PurpleAccount *account,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
512 const char *conference_type,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
513 const char *remote_user,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
514 gboolean initiator)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
515 {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
516 return create_media (manager, account, conference_type,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
517 remote_user, initiator, FALSE);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
518 }
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
519
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
520 GList *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
521 purple_media_manager_get_media(PurpleMediaManager *manager)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
522 {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
523 return get_media (manager, FALSE);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
524 }
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
525
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
526 GList *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
527 purple_media_manager_get_media_by_account(PurpleMediaManager *manager,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
528 PurpleAccount *account)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
529 {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
530 return get_media_by_account (manager, account, FALSE);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
531 }
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
532
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
533 PurpleMedia *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
534 purple_media_manager_create_private_media(PurpleMediaManager *manager,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
535 PurpleAccount *account,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
536 const char *conference_type,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
537 const char *remote_user,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
538 gboolean initiator)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
539 {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
540 return create_media (manager, account, conference_type,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
541 remote_user, initiator, TRUE);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
542 }
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
543
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
544 GList *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
545 purple_media_manager_get_private_media(PurpleMediaManager *manager)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
546 {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
547 return get_media (manager, TRUE);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
548 }
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
549
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
550 GList *
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
551 purple_media_manager_get_private_media_by_account(PurpleMediaManager *manager,
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
552 PurpleAccount *account)
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
553 {
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
554 return get_media_by_account (manager, account, TRUE);
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
555 }
d729a9b21265 Add Private media API
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36330
diff changeset
556
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
557 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
558 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
559 free_appdata_info_locked (PurpleMediaAppDataInfo *info)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
560 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
561 if (info->notify)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
562 info->notify (info->user_data);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
563
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
564 /* Make sure no other thread is using the structure */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
565 g_free (info->session_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
566 g_free (info->participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
567
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
568 /* This lets the potential read or write callbacks waiting for appdata_mutex
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
569 * know the info structure has been destroyed. */
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
570 info->readable_cb_token = 0;
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
571 info->writable_cb_token = 0;
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
572
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
573 if (info->readable_timer_id) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
574 purple_timeout_remove (info->readable_timer_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
575 info->readable_timer_id = 0;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
576 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
577
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
578 if (info->writable_timer_id) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
579 purple_timeout_remove (info->writable_timer_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
580 info->writable_timer_id = 0;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
581 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
582
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
583 if (info->current_sample)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
584 gst_sample_unref (info->current_sample);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
585 info->current_sample = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
586
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
587 /* Unblock any reading thread before destroying the GCond */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
588 g_cond_broadcast (&info->readable_cond);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
589
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
590 g_cond_clear (&info->readable_cond);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
591
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
592 g_slice_free (PurpleMediaAppDataInfo, info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
593 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
594
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
595 /*
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
596 * Get an app data info struct associated with a session and lock the mutex
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
597 * We don't want to return an info struct and unlock then it gets destroyed
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
598 * so we need to return it with the lock still taken
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
599 */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
600 static PurpleMediaAppDataInfo *
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
601 get_app_data_info_and_lock (PurpleMediaManager *manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
602 PurpleMedia *media, const gchar *session_id, const gchar *participant)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
603 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
604 GList *i;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
605
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
606 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
607 for (i = manager->priv->appdata_info; i; i = i->next) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
608 PurpleMediaAppDataInfo *info = i->data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
609
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
610 if (info->media == media &&
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
611 g_strcmp0 (info->session_id, session_id) == 0 &&
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
612 (participant == NULL ||
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
613 g_strcmp0 (info->participant, participant) == 0)) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
614 return info;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
615 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
616 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
617
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
618 return NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
619 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
620
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
621 /*
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
622 * Get an app data info struct associated with a session and lock the mutex
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
623 * if it doesn't exist, we create it.
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
624 */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
625 static PurpleMediaAppDataInfo *
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
626 ensure_app_data_info_and_lock (PurpleMediaManager *manager, PurpleMedia *media,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
627 const gchar *session_id, const gchar *participant)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
628 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
629 PurpleMediaAppDataInfo * info = get_app_data_info_and_lock (manager, media,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
630 session_id, participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
631
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
632 if (info == NULL) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
633 info = g_slice_new0 (PurpleMediaAppDataInfo);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
634 info->media = media;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
635 g_weak_ref_init (&info->media_ref, media);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
636 info->session_id = g_strdup (session_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
637 info->participant = g_strdup (participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
638 g_cond_init (&info->readable_cond);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
639 manager->priv->appdata_info = g_list_prepend (
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
640 manager->priv->appdata_info, info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
641 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
642
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
643 return info;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
644 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
645 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
646
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
647
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
648 #ifdef USE_VV
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
649 static void
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
650 request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
651 {
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
652 GstElement *parent = GST_ELEMENT_PARENT(pad);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
653 GstIterator *iter;
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
654 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
655 GValue tmp = G_VALUE_INIT;
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
656 #endif
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
657 GstPad *remaining_pad;
28132
5565fd8df570 Unleak pad if more pads are linked.
Michael Ruprecht <maiku@pidgin.im>
parents: 28125
diff changeset
658 GstIteratorResult result;
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
659
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
660 gst_element_release_request_pad(parent, pad);
31313
eca4138f416c This patch fixes #12758.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31311
diff changeset
661
28132
5565fd8df570 Unleak pad if more pads are linked.
Michael Ruprecht <maiku@pidgin.im>
parents: 28125
diff changeset
662 iter = gst_element_iterate_src_pads(parent);
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
663
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
664 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
665 result = gst_iterator_next(iter, &tmp);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
666 #else
28132
5565fd8df570 Unleak pad if more pads are linked.
Michael Ruprecht <maiku@pidgin.im>
parents: 28125
diff changeset
667 result = gst_iterator_next(iter, (gpointer)&remaining_pad);
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
668 #endif
28132
5565fd8df570 Unleak pad if more pads are linked.
Michael Ruprecht <maiku@pidgin.im>
parents: 28125
diff changeset
669
5565fd8df570 Unleak pad if more pads are linked.
Michael Ruprecht <maiku@pidgin.im>
parents: 28125
diff changeset
670 if (result == GST_ITERATOR_DONE) {
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
671 gst_element_set_locked_state(parent, TRUE);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
672 gst_element_set_state(parent, GST_STATE_NULL);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
673 gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(parent)), parent);
28132
5565fd8df570 Unleak pad if more pads are linked.
Michael Ruprecht <maiku@pidgin.im>
parents: 28125
diff changeset
674 } else if (result == GST_ITERATOR_OK) {
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
675 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
676 remaining_pad = g_value_get_object(&tmp);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
677 g_value_reset(&tmp);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
678 #endif
28132
5565fd8df570 Unleak pad if more pads are linked.
Michael Ruprecht <maiku@pidgin.im>
parents: 28125
diff changeset
679 gst_object_unref(remaining_pad);
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
680 }
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
681
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
682 gst_iterator_free(iter);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
683 }
36329
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
684
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
685 static void
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
686 nonunique_src_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
687 {
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
688 GstElement *element = GST_ELEMENT_PARENT(pad);
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
689 gst_element_set_locked_state(element, TRUE);
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
690 gst_element_set_state(element, GST_STATE_NULL);
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
691 gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(element)), element);
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
692 }
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
693
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
694 #endif
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
695
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
696 #ifdef USE_GSTREAMER
31311
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
697
31319
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
698 void
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
699 purple_media_manager_set_video_caps(PurpleMediaManager *manager, GstCaps *caps)
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
700 {
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
701 #ifdef USE_VV
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
702 if (manager->priv->video_caps)
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
703 gst_caps_unref(manager->priv->video_caps);
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
704
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
705 manager->priv->video_caps = caps;
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
706
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
707 if (manager->priv->pipeline && manager->priv->video_src) {
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
708 gchar *id = purple_media_element_info_get_id(manager->priv->video_src);
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
709 GstElement *src = gst_bin_get_by_name(GST_BIN(manager->priv->pipeline), id);
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
710
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
711 if (src) {
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
712 GstElement *capsfilter = gst_bin_get_by_name(GST_BIN(src), "prpl_video_caps");
36280
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
713 if (capsfilter) {
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
714 g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
715 gst_object_unref (capsfilter);
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
716 }
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
717 gst_object_unref (src);
31319
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
718 }
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
719
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
720 g_free(id);
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
721 }
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
722 #endif
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
723 }
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
724
b271e590aaf9 Public API allowing plugins (including prpls) to get/set video capabilities where desired/appropriate. Fixes #13095.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31313
diff changeset
725 GstCaps *
31311
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
726 purple_media_manager_get_video_caps(PurpleMediaManager *manager)
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
727 {
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
728 #ifdef USE_VV
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
729 if (manager->priv->video_caps == NULL)
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
730 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
731 manager->priv->video_caps = gst_caps_from_string("video/x-raw,"
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
732 #else
31311
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
733 manager->priv->video_caps = gst_caps_from_string("video/x-raw-yuv,"
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
734 #endif
31311
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
735 "width=[250,352], height=[200,288], framerate=[1/1,20/1]");
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
736 return manager->priv->video_caps;
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
737 #else
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
738 return NULL;
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
739 #endif
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
740 }
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
741
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
742 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
743 /*
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
744 * Calls the appdata writable callback from the main thread.
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
745 * This needs to grab the appdata lock and make sure it didn't get destroyed
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
746 * before calling the callback.
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
747 */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
748 static gboolean
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
749 appsrc_writable (gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
750 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
751 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
752 PurpleMediaAppDataInfo *info = user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
753 void (*writable_cb) (PurpleMediaManager *manager, PurpleMedia *media,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
754 const gchar *session_id, const gchar *participant, gboolean writable,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
755 gpointer user_data);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
756 PurpleMedia *media;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
757 gchar *session_id;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
758 gchar *participant;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
759 gboolean writable;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
760 gpointer cb_data;
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
761 guint *cb_token_ptr = &info->writable_cb_token;
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
762 guint cb_token = *cb_token_ptr;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
763
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
764
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
765 g_mutex_lock (&manager->priv->appdata_mutex);
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
766 if (cb_token == 0 || cb_token != *cb_token_ptr) {
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
767 /* In case info was freed while we were waiting for the mutex to unlock
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
768 * we still have a pointer to the cb_token which should still be
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
769 * accessible since it's in the Glib slice allocator. It gets set to 0
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
770 * just after the timeout is canceled which happens also before the
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
771 * AppDataInfo is freed, so even if that memory slice gets reused, the
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
772 * cb_token would be different from its previous value (unless
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
773 * extremely unlucky). So checking if the value for the cb_token changed
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
774 * should be enough to prevent any kind of race condition in which the
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
775 * media/AppDataInfo gets destroyed in one thread while the timeout was
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
776 * triggered and is waiting on the mutex to get unlocked in this thread
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
777 */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
778 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
779 return FALSE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
780 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
781 writable_cb = info->callbacks.writable;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
782 media = g_weak_ref_get (&info->media_ref);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
783 session_id = g_strdup (info->session_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
784 participant = g_strdup (info->participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
785 writable = info->writable && info->connected;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
786 cb_data = info->user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
787
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
788 info->writable_cb_token = 0;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
789 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
790
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
791
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
792 if (writable_cb && media)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
793 writable_cb (manager, media, session_id, participant, writable,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
794 cb_data);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
795
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
796 g_object_unref (media);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
797 g_free (session_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
798 g_free (participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
799
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
800 return FALSE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
801 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
802
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
803 /*
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
804 * Schedule a writable callback to be called from the main thread.
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
805 * We need to do this because need-data/enough-data signals from appsrc
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
806 * will come from the streaming thread and we need to create
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
807 * a source that we attach to the main context but we can't use
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
808 * g_main_context_invoke since we need to be able to cancel the source if the
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
809 * media gets destroyed.
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
810 * We use a timeout source instead of idle source, so the callback gets a higher
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
811 * priority
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
812 */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
813 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
814 call_appsrc_writable_locked (PurpleMediaAppDataInfo *info)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
815 {
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
816 PurpleMediaManager *manager = purple_media_manager_get ();
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
817
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
818 /* We already have a writable callback scheduled, don't create another one */
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
819 if (info->writable_cb_token || info->callbacks.writable == NULL)
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
820 return;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
821
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
822 /* We can't use writable_timer_id as a token, because the timeout is added
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
823 * into libpurple's main event loop, which runs in a different thread than
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
824 * from where call_appsrc_writable_locked() was called. Consequently, the
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
825 * callback may run even before purple_timeout_add() returns the timer ID
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
826 * to us. */
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
827 info->writable_cb_token = ++manager->priv->appdata_cb_token;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
828 info->writable_timer_id = purple_timeout_add (0, appsrc_writable, info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
829 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
830
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
831 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
832 appsrc_need_data (GstAppSrc *appsrc, guint length, gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
833 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
834 PurpleMediaAppDataInfo *info = user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
835 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
836
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
837 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
838 if (!info->writable) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
839 info->writable = TRUE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
840 /* Only signal writable if we also established a connection */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
841 if (info->connected)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
842 call_appsrc_writable_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
843 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
844 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
845 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
846
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
847 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
848 appsrc_enough_data (GstAppSrc *appsrc, gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
849 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
850 PurpleMediaAppDataInfo *info = user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
851 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
852
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
853 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
854 if (info->writable) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
855 info->writable = FALSE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
856 call_appsrc_writable_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
857 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
858 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
859 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
860
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
861 static gboolean
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
862 appsrc_seek_data (GstAppSrc *appsrc, guint64 offset, gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
863 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
864 return FALSE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
865 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
866
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
867 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
868 appsrc_destroyed (PurpleMediaAppDataInfo *info)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
869 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
870 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
871
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
872 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
873 info->appsrc = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
874 if (info->writable) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
875 info->writable = FALSE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
876 call_appsrc_writable_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
877 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
878 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
879 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
880
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
881 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
882 media_established_cb (PurpleMedia *media,const gchar *session_id,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
883 const gchar *participant, PurpleMediaCandidate *local_candidate,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
884 PurpleMediaCandidate *remote_candidate, PurpleMediaAppDataInfo *info)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
885 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
886 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
887
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
888 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
889 info->connected = TRUE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
890 /* We established the connection, if we were writable, then we need to
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
891 * signal it now */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
892 if (info->writable)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
893 call_appsrc_writable_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
894 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
895 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
896
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
897 static GstElement *
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
898 create_send_appsrc(PurpleMedia *media,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
899 const gchar *session_id, const gchar *participant)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
900 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
901 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
902 PurpleMediaAppDataInfo * info = ensure_app_data_info_and_lock (manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
903 media, session_id, participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
904 GstElement *appsrc = (GstElement *)info->appsrc;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
905
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
906 if (appsrc == NULL) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
907 GstAppSrcCallbacks callbacks = {appsrc_need_data, appsrc_enough_data,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
908 appsrc_seek_data, {NULL}};
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
909 GstCaps *caps = gst_caps_new_empty_simple ("application/octet-stream");
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
910
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
911 appsrc = gst_element_factory_make("appsrc", NULL);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
912
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
913 info->appsrc = (GstAppSrc *)appsrc;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
914
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
915 gst_app_src_set_caps (info->appsrc, caps);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
916 gst_app_src_set_callbacks (info->appsrc,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
917 &callbacks, info, (GDestroyNotify) appsrc_destroyed);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
918 g_signal_connect (media, "candidate-pair-established",
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
919 (GCallback) media_established_cb, info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
920 gst_caps_unref (caps);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
921 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
922
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
923 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
924 return appsrc;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
925 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
926
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
927 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
928 appsink_eos (GstAppSink *appsink, gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
929 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
930 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
931
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
932 static GstFlowReturn
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
933 appsink_new_preroll (GstAppSink *appsink, gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
934 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
935 return GST_FLOW_OK;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
936 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
937
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
938 static gboolean
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
939 appsink_readable (gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
940 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
941 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
942 PurpleMediaAppDataInfo *info = user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
943 void (*readable_cb) (PurpleMediaManager *manager, PurpleMedia *media,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
944 const gchar *session_id, const gchar *participant, gpointer user_data);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
945 PurpleMedia *media;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
946 gchar *session_id;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
947 gchar *participant;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
948 gpointer cb_data;
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
949 guint *cb_token_ptr = &info->readable_cb_token;
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
950 guint cb_token = *cb_token_ptr;
37244
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
951 gboolean run_again = FALSE;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
952
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
953 g_mutex_lock (&manager->priv->appdata_mutex);
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
954 if (cb_token == 0 || cb_token != *cb_token_ptr) {
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
955 /* Avoided a race condition (see writable callback) */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
956 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
957 return FALSE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
958 }
37244
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
959
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
960 if (info->callbacks.readable &&
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
961 (info->num_samples > 0 || info->current_sample != NULL)) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
962 readable_cb = info->callbacks.readable;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
963 media = g_weak_ref_get (&info->media_ref);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
964 session_id = g_strdup (info->session_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
965 participant = g_strdup (info->participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
966 cb_data = info->user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
967 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
968
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
969 if (readable_cb)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
970 readable_cb (manager, media, session_id, participant, cb_data);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
971
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
972 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
973 g_object_unref (media);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
974 g_free (session_id);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
975 g_free (participant);
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
976 if (cb_token == 0 || cb_token != *cb_token_ptr) {
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
977 /* We got cancelled */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
978 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
979 return FALSE;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
980 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
981 }
37244
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
982
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
983 /* Do we still have samples? Schedule appsink_readable again. We break here
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
984 * so that other events get a chance to be processed too. */
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
985 if (info->num_samples > 0 || info->current_sample != NULL) {
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
986 run_again = TRUE;
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
987 } else {
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
988 info->readable_cb_token = 0;
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
989 }
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
990
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
991 g_mutex_unlock (&manager->priv->appdata_mutex);
37244
cbc4db14444c Don't require appsink be drained in appsink_readable
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37236
diff changeset
992 return run_again;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
993 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
994
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
995 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
996 call_appsink_readable_locked (PurpleMediaAppDataInfo *info)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
997 {
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
998 PurpleMediaManager *manager = purple_media_manager_get ();
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
999
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1000 /* We must signal that a new sample has arrived to release blocking reads */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1001 g_cond_broadcast (&info->readable_cond);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1002
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1003 /* We already have a writable callback scheduled, don't create another one */
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
1004 if (info->readable_cb_token || info->callbacks.readable == NULL)
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1005 return;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1006
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
1007 info->readable_cb_token = ++manager->priv->appdata_cb_token;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1008 info->readable_timer_id = purple_timeout_add (0, appsink_readable, info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1009 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1010
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1011 static GstFlowReturn
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1012 appsink_new_sample (GstAppSink *appsink, gpointer user_data)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1013 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1014 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1015 PurpleMediaAppDataInfo *info = user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1016
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1017 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1018 info->num_samples++;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1019 call_appsink_readable_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1020 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1021
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1022 return GST_FLOW_OK;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1023 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1024
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1025 static void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1026 appsink_destroyed (PurpleMediaAppDataInfo *info)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1027 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1028 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1029
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1030 g_mutex_lock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1031 info->appsink = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1032 info->num_samples = 0;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1033 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1034 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1035
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1036 static GstElement *
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1037 create_recv_appsink(PurpleMedia *media,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1038 const gchar *session_id, const gchar *participant)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1039 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1040 PurpleMediaManager *manager = purple_media_manager_get ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1041 PurpleMediaAppDataInfo * info = ensure_app_data_info_and_lock (manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1042 media, session_id, participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1043 GstElement *appsink = (GstElement *)info->appsink;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1044
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1045 if (appsink == NULL) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1046 GstAppSinkCallbacks callbacks = {appsink_eos, appsink_new_preroll,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1047 appsink_new_sample, {NULL}};
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1048 GstCaps *caps = gst_caps_new_empty_simple ("application/octet-stream");
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1049
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1050 appsink = gst_element_factory_make("appsink", NULL);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1051
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1052 info->appsink = (GstAppSink *)appsink;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1053
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1054 gst_app_sink_set_caps (info->appsink, caps);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1055 gst_app_sink_set_callbacks (info->appsink,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1056 &callbacks, info, (GDestroyNotify) appsink_destroyed);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1057 gst_caps_unref (caps);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1058
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1059 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1060
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1061 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1062 return appsink;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1063 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1064 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1065
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1066 static PurpleMediaElementInfo *
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1067 get_send_application_element_info ()
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1068 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1069 static PurpleMediaElementInfo *info = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1070
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1071 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1072 if (info == NULL) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1073 info = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1074 "id", "pidginappsrc",
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1075 "name", "Pidgin Application Source",
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1076 "type", PURPLE_MEDIA_ELEMENT_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1077 | PURPLE_MEDIA_ELEMENT_SRC
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1078 | PURPLE_MEDIA_ELEMENT_ONE_SRC,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1079 "create-cb", create_send_appsrc, NULL);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1080 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1081 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1082
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1083 return info;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1084 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1085
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1086
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1087 static PurpleMediaElementInfo *
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1088 get_recv_application_element_info ()
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1089 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1090 static PurpleMediaElementInfo *info = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1091
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1092 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1093 if (info == NULL) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1094 info = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1095 "id", "pidginappsink",
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1096 "name", "Pidgin Application Sink",
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1097 "type", PURPLE_MEDIA_ELEMENT_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1098 | PURPLE_MEDIA_ELEMENT_SINK
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1099 | PURPLE_MEDIA_ELEMENT_ONE_SINK,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1100 "create-cb", create_recv_appsink, NULL);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1101 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1102 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1103
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1104 return info;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1105 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1106
26150
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1107 GstElement *
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1108 purple_media_manager_get_element(PurpleMediaManager *manager,
26522
44401eba59a5 Give more information to element creation functions.
Michael Ruprecht <maiku@pidgin.im>
parents: 26520
diff changeset
1109 PurpleMediaSessionType type, PurpleMedia *media,
44401eba59a5 Give more information to element creation functions.
Michael Ruprecht <maiku@pidgin.im>
parents: 26520
diff changeset
1110 const gchar *session_id, const gchar *participant)
26150
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1111 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1112 #ifdef USE_VV
26150
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1113 GstElement *ret = NULL;
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1114 PurpleMediaElementInfo *info = NULL;
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1115 PurpleMediaElementType element_type;
26150
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1116
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1117 if (type & PURPLE_MEDIA_SEND_AUDIO)
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1118 info = manager->priv->audio_src;
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1119 else if (type & PURPLE_MEDIA_RECV_AUDIO)
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1120 info = manager->priv->audio_sink;
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1121 else if (type & PURPLE_MEDIA_SEND_VIDEO)
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1122 info = manager->priv->video_src;
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1123 else if (type & PURPLE_MEDIA_RECV_VIDEO)
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1124 info = manager->priv->video_sink;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1125 else if (type & PURPLE_MEDIA_SEND_APPLICATION)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1126 info = get_send_application_element_info ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1127 else if (type & PURPLE_MEDIA_RECV_APPLICATION)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1128 info = get_recv_application_element_info ();
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1129
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1130 if (info == NULL)
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1131 return NULL;
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1132
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1133 element_type = purple_media_element_info_get_element_type(info);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1134
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1135 if (element_type & PURPLE_MEDIA_ELEMENT_UNIQUE &&
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1136 element_type & PURPLE_MEDIA_ELEMENT_SRC) {
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1137 GstElement *tee;
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1138 GstPad *pad;
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1139 GstPad *ghost;
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1140 gchar *id = purple_media_element_info_get_id(info);
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1141
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1142 ret = gst_bin_get_by_name(GST_BIN(
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1143 purple_media_manager_get_pipeline(
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1144 manager)), id);
26150
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1145
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1146 if (ret == NULL) {
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1147 GstElement *bin, *fakesink;
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1148 ret = purple_media_element_info_call_create(info,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1149 media, session_id, participant);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1150 bin = gst_bin_new(id);
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1151 tee = gst_element_factory_make("tee", "tee");
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1152 gst_bin_add_many(GST_BIN(bin), ret, tee, NULL);
31311
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1153
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1154 if (type & PURPLE_MEDIA_SEND_VIDEO) {
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1155 GstElement *videoscale;
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1156 GstElement *capsfilter;
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1157
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1158 videoscale = gst_element_factory_make("videoscale", NULL);
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1159 capsfilter = gst_element_factory_make("capsfilter", "prpl_video_caps");
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1160
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1161 g_object_set(G_OBJECT(capsfilter),
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1162 "caps", purple_media_manager_get_video_caps(manager), NULL);
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1163
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1164 gst_bin_add_many(GST_BIN(bin), videoscale, capsfilter, NULL);
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1165 gst_element_link_many(ret, videoscale, capsfilter, tee, NULL);
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1166 } else
740a84050c72 Add a GstCapsFilter between every video source and the rest of the pipeline.
Jakub Adam <jakub.adam@ktknet.cz>
parents: 31294
diff changeset
1167 gst_element_link(ret, tee);
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1168
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1169 /*
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1170 * This shouldn't be necessary, but it stops it from
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1171 * giving a not-linked error upon destruction
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1172 */
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1173 fakesink = gst_element_factory_make("fakesink", NULL);
37650
f827e56eea34 media: don't keep last sample reference on sinks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37244
diff changeset
1174 g_object_set(fakesink,
37651
b5c43edd21f8 media: switch source bin fakesink to PAUSED synchronously
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37650
diff changeset
1175 "async", FALSE,
37650
f827e56eea34 media: don't keep last sample reference on sinks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37244
diff changeset
1176 "sync", FALSE,
f827e56eea34 media: don't keep last sample reference on sinks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37244
diff changeset
1177 "enable-last-sample", FALSE,
f827e56eea34 media: don't keep last sample reference on sinks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 37244
diff changeset
1178 NULL);
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1179 gst_bin_add(GST_BIN(bin), fakesink);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1180 gst_element_link(tee, fakesink);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1181
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1182 ret = bin;
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1183 gst_object_ref(ret);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1184 gst_bin_add(GST_BIN(purple_media_manager_get_pipeline(
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1185 manager)), ret);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1186 }
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1187 g_free(id);
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1188
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1189 tee = gst_bin_get_by_name(GST_BIN(ret), "tee");
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1190 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1191 pad = gst_element_get_request_pad(tee, "src_%u");
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1192 #else
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1193 pad = gst_element_get_request_pad(tee, "src%d");
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1194 #endif
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1195 gst_object_unref(tee);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1196 ghost = gst_ghost_pad_new(NULL, pad);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1197 gst_object_unref(pad);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1198 g_signal_connect(GST_PAD(ghost), "unlinked",
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1199 G_CALLBACK(request_pad_unlinked_cb), NULL);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1200 gst_pad_set_active(ghost, TRUE);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1201 gst_element_add_pad(ret, ghost);
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1202 } else {
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1203 ret = purple_media_element_info_call_create(info,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1204 media, session_id, participant);
36280
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
1205 if (element_type & PURPLE_MEDIA_ELEMENT_SRC) {
36329
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
1206 GstPad *pad = gst_element_get_static_pad(ret, "src");
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
1207 g_signal_connect(pad, "unlinked",
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
1208 G_CALLBACK(nonunique_src_unlinked_cb), NULL);
8e4fa54f1662 media: ensure nonunique source is removed from pipeline when unlinked
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36316
diff changeset
1209 gst_object_unref(pad);
36280
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
1210 gst_object_ref(ret);
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
1211 gst_bin_add(GST_BIN(purple_media_manager_get_pipeline(manager)),
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
1212 ret);
b52be4fef1de Fix gstreamer elements references
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 35992
diff changeset
1213 }
26511
764632d560ee Make sharing sources between media sessions work.
Michael Ruprecht <maiku@pidgin.im>
parents: 26480
diff changeset
1214 }
26150
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1215
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1216 if (ret == NULL)
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1217 purple_debug_error("media", "Error creating source or sink\n");
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1218
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1219 return ret;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1220 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1221 return NULL;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1222 #endif
26150
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1223 }
951503fc5456 Add purple_media_manager_get_element.
Michael Ruprecht <maiku@pidgin.im>
parents: 26130
diff changeset
1224
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1225 PurpleMediaElementInfo *
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1226 purple_media_manager_get_element_info(PurpleMediaManager *manager,
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1227 const gchar *id)
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1228 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1229 #ifdef USE_VV
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1230 GList *iter;
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1231
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1232 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL);
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1233
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1234 iter = manager->priv->elements;
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1235
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1236 for (; iter; iter = g_list_next(iter)) {
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1237 gchar *element_id =
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1238 purple_media_element_info_get_id(iter->data);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1239 if (!strcmp(element_id, id)) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1240 g_free(element_id);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1241 g_object_ref(iter->data);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1242 return iter->data;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1243 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1244 g_free(element_id);
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1245 }
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1246 #endif
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1247
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1248 return NULL;
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1249 }
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1250
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1251 gboolean
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1252 purple_media_manager_register_element(PurpleMediaManager *manager,
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1253 PurpleMediaElementInfo *info)
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1254 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1255 #ifdef USE_VV
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1256 PurpleMediaElementInfo *info2;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1257 gchar *id;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1258
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1259 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1260 g_return_val_if_fail(info != NULL, FALSE);
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1261
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1262 id = purple_media_element_info_get_id(info);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1263 info2 = purple_media_manager_get_element_info(manager, id);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1264 g_free(id);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1265
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1266 if (info2 != NULL) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1267 g_object_unref(info2);
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1268 return FALSE;
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1269 }
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1270
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1271 manager->priv->elements =
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1272 g_list_prepend(manager->priv->elements, info);
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1273 return TRUE;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1274 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1275 return FALSE;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1276 #endif
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1277 }
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1278
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1279 gboolean
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1280 purple_media_manager_unregister_element(PurpleMediaManager *manager,
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1281 const gchar *id)
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1282 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1283 #ifdef USE_VV
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1284 PurpleMediaElementInfo *info;
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1285
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1286 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1288 info = purple_media_manager_get_element_info(manager, id);
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1289
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1290 if (info == NULL) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1291 g_object_unref(info);
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1292 return FALSE;
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1293 }
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1294
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1295 if (manager->priv->audio_src == info)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1296 manager->priv->audio_src = NULL;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1297 if (manager->priv->audio_sink == info)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1298 manager->priv->audio_sink = NULL;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1299 if (manager->priv->video_src == info)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1300 manager->priv->video_src = NULL;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1301 if (manager->priv->video_sink == info)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1302 manager->priv->video_sink = NULL;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1303
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1304 manager->priv->elements = g_list_remove(
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1305 manager->priv->elements, info);
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1306 g_object_unref(info);
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1307 return TRUE;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1308 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1309 return FALSE;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1310 #endif
26287
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1311 }
c0cdd840a828 Implement functions to register and unregister media elements for use in
Michael Ruprecht <maiku@pidgin.im>
parents: 26276
diff changeset
1312
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1313 gboolean
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1314 purple_media_manager_set_active_element(PurpleMediaManager *manager,
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1315 PurpleMediaElementInfo *info)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1316 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1317 #ifdef USE_VV
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1318 PurpleMediaElementInfo *info2;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1319 PurpleMediaElementType type;
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1320 gboolean ret = FALSE;
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1321 gchar *id;
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1322
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1323 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1324 g_return_val_if_fail(info != NULL, FALSE);
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1325
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1326 id = purple_media_element_info_get_id(info);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1327 info2 = purple_media_manager_get_element_info(manager, id);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1328 g_free(id);
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1329
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1330 if (info2 == NULL)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1331 purple_media_manager_register_element(manager, info);
26748
ff7e5e2db250 Fix some assertions.
Michael Ruprecht <maiku@pidgin.im>
parents: 26746
diff changeset
1332 else
ff7e5e2db250 Fix some assertions.
Michael Ruprecht <maiku@pidgin.im>
parents: 26746
diff changeset
1333 g_object_unref(info2);
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1334
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1335 type = purple_media_element_info_get_element_type(info);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1336
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1337 if (type & PURPLE_MEDIA_ELEMENT_SRC) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1338 if (type & PURPLE_MEDIA_ELEMENT_AUDIO) {
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1339 manager->priv->audio_src = info;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1340 ret = TRUE;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1341 }
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1342 if (type & PURPLE_MEDIA_ELEMENT_VIDEO) {
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1343 manager->priv->video_src = info;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1344 ret = TRUE;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1345 }
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1346 }
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1347 if (type & PURPLE_MEDIA_ELEMENT_SINK) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1348 if (type & PURPLE_MEDIA_ELEMENT_AUDIO) {
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1349 manager->priv->audio_sink = info;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1350 ret = TRUE;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1351 }
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1352 if (type & PURPLE_MEDIA_ELEMENT_VIDEO) {
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1353 manager->priv->video_sink = info;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1354 ret = TRUE;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1355 }
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1356 }
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1357
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1358 return ret;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1359 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1360 return FALSE;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1361 #endif
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1362 }
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1363
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1364 PurpleMediaElementInfo *
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1365 purple_media_manager_get_active_element(PurpleMediaManager *manager,
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1366 PurpleMediaElementType type)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1367 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1368 #ifdef USE_VV
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1369 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL);
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1370
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1371 if (type & PURPLE_MEDIA_ELEMENT_SRC) {
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1372 if (type & PURPLE_MEDIA_ELEMENT_AUDIO)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1373 return manager->priv->audio_src;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1374 else if (type & PURPLE_MEDIA_ELEMENT_VIDEO)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1375 return manager->priv->video_src;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1376 else if (type & PURPLE_MEDIA_ELEMENT_APPLICATION)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1377 return get_send_application_element_info ();
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1378 } else if (type & PURPLE_MEDIA_ELEMENT_SINK) {
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1379 if (type & PURPLE_MEDIA_ELEMENT_AUDIO)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1380 return manager->priv->audio_sink;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1381 else if (type & PURPLE_MEDIA_ELEMENT_VIDEO)
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1382 return manager->priv->video_sink;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1383 else if (type & PURPLE_MEDIA_ELEMENT_APPLICATION)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1384 return get_recv_application_element_info ();
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1385
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1386 }
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1387 #endif
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1388
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1389 return NULL;
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1390 }
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
1391 #endif /* USE_GSTREAMER */
26289
1d832b48fa58 Add active elements to PurpleMediaManager. These are the elements that
Michael Ruprecht <maiku@pidgin.im>
parents: 26287
diff changeset
1392
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1393 #ifdef USE_VV
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1394 static void
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1395 window_id_cb(GstBus *bus, GstMessage *msg, PurpleMediaOutputWindow *ow)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1396 {
26626
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1397 GstElement *sink;
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1398
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1399 if (GST_MESSAGE_TYPE(msg) != GST_MESSAGE_ELEMENT
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1400 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1401 || !gst_is_video_overlay_prepare_window_handle_message(msg))
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1402 #else
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1403 || !gst_structure_has_name(msg->structure, "prepare-xwindow-id"))
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1404 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1405 return;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1406
26626
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1407 sink = GST_ELEMENT(GST_MESSAGE_SRC(msg));
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1408 while (sink != ow->sink) {
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1409 if (sink == NULL)
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1410 return;
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1411 sink = GST_ELEMENT_PARENT(sink);
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1412 }
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1413
26626
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1414 g_signal_handlers_disconnect_matched(bus, G_SIGNAL_MATCH_FUNC
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1415 | G_SIGNAL_MATCH_DATA, 0, 0, NULL,
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1416 window_id_cb, ow);
afe9f06f73d0 Fix embedding video when the sink is a gconfvideosrc pointing to an
Michael Ruprecht <maiku@pidgin.im>
parents: 26616
diff changeset
1417
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1418 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1419 gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(GST_MESSAGE_SRC(msg)),
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1420 ow->window_id);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1421 #elif GST_CHECK_VERSION(0,10,31)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1422 gst_x_overlay_set_window_handle(GST_X_OVERLAY(GST_MESSAGE_SRC(msg)),
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1423 ow->window_id);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1424 #else
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1425 gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(GST_MESSAGE_SRC(msg)),
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1426 ow->window_id);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1427 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1428 }
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1429 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1430
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1431 gboolean
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1432 purple_media_manager_create_output_window(PurpleMediaManager *manager,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1433 PurpleMedia *media, const gchar *session_id,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1434 const gchar *participant)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1435 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1436 #ifdef USE_VV
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1437 GList *iter;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1438
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1439 g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1440
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1441 iter = manager->priv->output_windows;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1442 for(; iter; iter = g_list_next(iter)) {
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1443 PurpleMediaOutputWindow *ow = iter->data;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1444
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1445 if (ow->sink == NULL && ow->media == media &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1446 ((participant != NULL &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1447 ow->participant != NULL &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1448 !strcmp(participant, ow->participant)) ||
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1449 (participant == ow->participant)) &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1450 !strcmp(session_id, ow->session_id)) {
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1451 GstBus *bus;
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1452 GstElement *queue, *convert;
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1453 GstElement *tee = purple_media_get_tee(media,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1454 session_id, participant);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1455
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1456 if (tee == NULL)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1457 continue;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1458
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1459 queue = gst_element_factory_make("queue", NULL);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1460 #if GST_CHECK_VERSION(1,0,0)
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1461 convert = gst_element_factory_make("videoconvert", NULL);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1462 #else
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1463 convert = gst_element_factory_make("ffmpegcolorspace", NULL);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1464 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1465 ow->sink = purple_media_manager_get_element(
26522
44401eba59a5 Give more information to element creation functions.
Michael Ruprecht <maiku@pidgin.im>
parents: 26520
diff changeset
1466 manager, PURPLE_MEDIA_RECV_VIDEO,
44401eba59a5 Give more information to element creation functions.
Michael Ruprecht <maiku@pidgin.im>
parents: 26520
diff changeset
1467 ow->media, ow->session_id,
44401eba59a5 Give more information to element creation functions.
Michael Ruprecht <maiku@pidgin.im>
parents: 26520
diff changeset
1468 ow->participant);
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1469
26427
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1470 if (participant == NULL) {
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1471 /* aka this is a preview sink */
26427
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1472 GObjectClass *klass =
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1473 G_OBJECT_GET_CLASS(ow->sink);
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1474 if (g_object_class_find_property(klass,
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1475 "sync"))
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1476 g_object_set(G_OBJECT(ow->sink),
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1477 "sync", FALSE, NULL);
26427
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1478 if (g_object_class_find_property(klass,
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1479 "async"))
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1480 g_object_set(G_OBJECT(ow->sink),
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1481 "async", FALSE, NULL);
cc660e80275f Silence warning about videotestsrc not having two properties.
Michael Ruprecht <maiku@pidgin.im>
parents: 26329
diff changeset
1482 }
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1483
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1484 gst_bin_add_many(GST_BIN(GST_ELEMENT_PARENT(tee)),
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1485 queue, convert, ow->sink, NULL);
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1486
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1487 bus = gst_pipeline_get_bus(GST_PIPELINE(
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1488 manager->priv->pipeline));
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1489 g_signal_connect(bus, "sync-message::element",
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1490 G_CALLBACK(window_id_cb), ow);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1491 gst_object_unref(bus);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1492
28140
bbb3777dbe3e Switch around some GStreamer linking and state setting.
Michael Ruprecht <maiku@pidgin.im>
parents: 28132
diff changeset
1493 gst_element_set_state(ow->sink, GST_STATE_PLAYING);
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1494 gst_element_set_state(convert, GST_STATE_PLAYING);
28140
bbb3777dbe3e Switch around some GStreamer linking and state setting.
Michael Ruprecht <maiku@pidgin.im>
parents: 28132
diff changeset
1495 gst_element_set_state(queue, GST_STATE_PLAYING);
36316
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1496 gst_element_link(convert, ow->sink);
2415067473ba Support GStreamer 1.x and resync with trunk
David Woodhouse <David.Woodhouse@intel.com>
parents: 36280
diff changeset
1497 gst_element_link(queue, convert);
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1498 gst_element_link(tee, queue);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1499 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1500 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1501 return TRUE;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1502 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1503 return FALSE;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1504 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1505 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1506
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1507 gulong
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1508 purple_media_manager_set_output_window(PurpleMediaManager *manager,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1509 PurpleMedia *media, const gchar *session_id,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1510 const gchar *participant, gulong window_id)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1511 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1512 #ifdef USE_VV
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1513 PurpleMediaOutputWindow *output_window;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1514
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1515 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1516 g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1517
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1518 output_window = g_new0(PurpleMediaOutputWindow, 1);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1519 output_window->id = manager->priv->next_output_window_id++;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1520 output_window->media = media;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1521 output_window->session_id = g_strdup(session_id);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1522 output_window->participant = g_strdup(participant);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1523 output_window->window_id = window_id;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1524
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1525 manager->priv->output_windows = g_list_prepend(
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1526 manager->priv->output_windows, output_window);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1527
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1528 if (purple_media_get_tee(media, session_id, participant) != NULL)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1529 purple_media_manager_create_output_window(manager,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1530 media, session_id, participant);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1531
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1532 return output_window->id;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1533 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1534 return 0;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1535 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1536 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1537
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1538 gboolean
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1539 purple_media_manager_remove_output_window(PurpleMediaManager *manager,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1540 gulong output_window_id)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1541 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1542 #ifdef USE_VV
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1543 PurpleMediaOutputWindow *output_window = NULL;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1544 GList *iter;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1545
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1546 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1547
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1548 iter = manager->priv->output_windows;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1549 for (; iter; iter = g_list_next(iter)) {
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1550 PurpleMediaOutputWindow *ow = iter->data;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1551 if (ow->id == output_window_id) {
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1552 manager->priv->output_windows = g_list_delete_link(
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1553 manager->priv->output_windows, iter);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1554 output_window = ow;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1555 break;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1556 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1557 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1558
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1559 if (output_window == NULL)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1560 return FALSE;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1561
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1562 if (output_window->sink != NULL) {
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1563 GstPad *pad = gst_element_get_static_pad(
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1564 output_window->sink, "sink");
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1565 GstPad *peer = gst_pad_get_peer(pad);
28161
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1566 GstElement *colorspace = GST_ELEMENT_PARENT(peer), *queue;
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1567 gst_object_unref(pad);
28161
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1568 gst_object_unref(peer);
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1569 pad = gst_element_get_static_pad(colorspace, "sink");
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1570 peer = gst_pad_get_peer(pad);
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1571 queue = GST_ELEMENT_PARENT(peer);
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1572 gst_object_unref(pad);
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1573 gst_object_unref(peer);
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1574 pad = gst_element_get_static_pad(queue, "sink");
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1575 peer = gst_pad_get_peer(pad);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1576 gst_object_unref(pad);
27926
7ed64195754d Don't crash when there isn't a webcam connected.
Michael Ruprecht <maiku@pidgin.im>
parents: 26792
diff changeset
1577 if (peer != NULL)
7ed64195754d Don't crash when there isn't a webcam connected.
Michael Ruprecht <maiku@pidgin.im>
parents: 26792
diff changeset
1578 gst_element_release_request_pad(GST_ELEMENT_PARENT(peer), peer);
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1579 gst_element_set_locked_state(queue, TRUE);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1580 gst_element_set_state(queue, GST_STATE_NULL);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1581 gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(queue)), queue);
28161
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1582 gst_element_set_locked_state(colorspace, TRUE);
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1583 gst_element_set_state(colorspace, GST_STATE_NULL);
4368c139d67f Fix unidirectional media sessions and add a colorspace before the video sink.
Michael Ruprecht <maiku@pidgin.im>
parents: 28140
diff changeset
1584 gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(colorspace)), colorspace);
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1585 gst_element_set_locked_state(output_window->sink, TRUE);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1586 gst_element_set_state(output_window->sink, GST_STATE_NULL);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1587 gst_bin_remove(GST_BIN(GST_ELEMENT_PARENT(output_window->sink)),
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1588 output_window->sink);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1589 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1590
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1591 g_free(output_window->session_id);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1592 g_free(output_window->participant);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1593 g_free(output_window);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1594
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1595 return TRUE;
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1596 #else
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1597 return FALSE;
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1598 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1599 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1600
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1601 void
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1602 purple_media_manager_remove_output_windows(PurpleMediaManager *manager,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1603 PurpleMedia *media, const gchar *session_id,
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1604 const gchar *participant)
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1605 {
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1606 #ifdef USE_VV
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1607 GList *iter;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1608
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1609 g_return_if_fail(PURPLE_IS_MEDIA(media));
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1610
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1611 iter = manager->priv->output_windows;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1612
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1613 for (; iter;) {
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1614 PurpleMediaOutputWindow *ow = iter->data;
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1615 iter = g_list_next(iter);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1616
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1617 if (media == ow->media &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1618 ((session_id != NULL && ow->session_id != NULL &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1619 !strcmp(session_id, ow->session_id)) ||
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1620 (session_id == ow->session_id)) &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1621 ((participant != NULL && ow->participant != NULL &&
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1622 !strcmp(participant, ow->participant)) ||
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1623 (participant == ow->participant)))
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1624 purple_media_manager_remove_output_window(
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1625 manager, ow->id);
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1626 }
26480
5c4ab4baeb32 Properly wrap media functions so the API doesn't disappear when USE_VV
Michael Ruprecht <maiku@pidgin.im>
parents: 26479
diff changeset
1627 #endif
26323
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1628 }
cf93de98325c Only create output windows once there's data to be output.
Michael Ruprecht <maiku@pidgin.im>
parents: 26320
diff changeset
1629
26520
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1630 void
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1631 purple_media_manager_set_ui_caps(PurpleMediaManager *manager,
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1632 PurpleMediaCaps caps)
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1633 {
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1634 #ifdef USE_VV
29540
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1635 PurpleMediaCaps oldcaps;
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1636
26520
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1637 g_return_if_fail(PURPLE_IS_MEDIA_MANAGER(manager));
29540
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1638
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1639 oldcaps = manager->priv->ui_caps;
26520
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1640 manager->priv->ui_caps = caps;
29540
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1641
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1642 if (caps != oldcaps)
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1643 g_signal_emit(manager,
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1644 purple_media_manager_signals[UI_CAPS_CHANGED],
6d554484fbf7 Added the ui-caps-changed signal to the media manager.
Michael Ruprecht <maiku@pidgin.im>
parents: 28321
diff changeset
1645 0, caps, oldcaps);
26520
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1646 #endif
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1647 }
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1648
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1649 PurpleMediaCaps
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1650 purple_media_manager_get_ui_caps(PurpleMediaManager *manager)
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1651 {
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1652 #ifdef USE_VV
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1653 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager),
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1654 PURPLE_MEDIA_CAPS_NONE);
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1655 return manager->priv->ui_caps;
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1656 #else
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
1657 return PURPLE_MEDIA_CAPS_NONE;
26520
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1658 #endif
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1659 }
8cbe60f17f3b Add purple_media_manager_{get,set}_ui_caps.
Michael Ruprecht <maiku@pidgin.im>
parents: 26511
diff changeset
1660
29620
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1661 void
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1662 purple_media_manager_set_backend_type(PurpleMediaManager *manager,
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1663 GType backend_type)
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1664 {
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1665 #ifdef USE_VV
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1666 g_return_if_fail(PURPLE_IS_MEDIA_MANAGER(manager));
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1667
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1668 manager->priv->backend_type = backend_type;
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1669 #endif
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1670 }
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1671
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1672 GType
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1673 purple_media_manager_get_backend_type(PurpleMediaManager *manager)
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 29620
diff changeset
1674 {
29620
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1675 #ifdef USE_VV
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1676 g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager),
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1677 PURPLE_MEDIA_CAPS_NONE);
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1678
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1679 return manager->priv->backend_type;
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1680 #else
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1681 return G_TYPE_NONE;
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1682 #endif
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1683 }
86e4f028f910 Add a way to set and get which media backend type to use.
Michael Ruprecht <maiku@pidgin.im>
parents: 29565
diff changeset
1684
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1685 void
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1686 purple_media_manager_set_application_data_callbacks(PurpleMediaManager *manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1687 PurpleMedia *media, const gchar *session_id,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1688 const gchar *participant, PurpleMediaAppDataCallbacks *callbacks,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1689 gpointer user_data, GDestroyNotify notify)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1690 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1691 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1692 PurpleMediaAppDataInfo * info = ensure_app_data_info_and_lock (manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1693 media, session_id, participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1694
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1695 if (info->notify)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1696 info->notify (info->user_data);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1697
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
1698 if (info->readable_cb_token) {
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1699 purple_timeout_remove (info->readable_timer_id);
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
1700 info->readable_cb_token = 0;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1701 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1702
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
1703 if (info->writable_cb_token) {
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1704 purple_timeout_remove (info->writable_timer_id);
37236
79fe6b95f105 Fix a race condition in appsrc read/write callbacks
Jakub Adam <jakub.adam@ktknet.cz>
parents: 36333
diff changeset
1705 info->writable_cb_token = 0;
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1706 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1707
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1708 if (callbacks) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1709 info->callbacks = *callbacks;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1710 } else {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1711 info->callbacks.writable = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1712 info->callbacks.readable = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1713 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1714 info->user_data = user_data;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1715 info->notify = notify;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1716
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1717 call_appsrc_writable_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1718 if (info->num_samples > 0 || info->current_sample != NULL)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1719 call_appsink_readable_locked (info);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1720
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1721 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1722 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1723 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1724
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1725 gint
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1726 purple_media_manager_send_application_data (
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1727 PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1728 const gchar *participant, gpointer buffer, guint size, gboolean blocking)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1729 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1730 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1731 PurpleMediaAppDataInfo * info = get_app_data_info_and_lock (manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1732 media, session_id, participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1733
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1734 if (info && info->appsrc && info->connected) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1735 GstBuffer *gstbuffer = gst_buffer_new_wrapped (g_memdup (buffer, size),
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1736 size);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1737 GstAppSrc *appsrc = gst_object_ref (info->appsrc);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1738
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1739 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1740 if (gst_app_src_push_buffer (appsrc, gstbuffer) == GST_FLOW_OK) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1741 if (blocking) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1742 GstPad *srcpad;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1743
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1744 srcpad = gst_element_get_static_pad (GST_ELEMENT (appsrc),
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1745 "src");
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1746 if (srcpad) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1747 gst_pad_peer_query (srcpad, gst_query_new_drain ());
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1748 gst_object_unref (srcpad);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1749 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1750 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1751 gst_object_unref (appsrc);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1752 return size;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1753 } else {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1754 gst_object_unref (appsrc);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1755 return -1;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1756 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1757 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1758 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1759 return -1;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1760 #else
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1761 return -1;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1762 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1763 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1764
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1765 gint
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1766 purple_media_manager_receive_application_data (
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1767 PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1768 const gchar *participant, gpointer buffer, guint max_size,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1769 gboolean blocking)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1770 {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1771 #ifdef HAVE_MEDIA_APPLICATION
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1772 PurpleMediaAppDataInfo * info = get_app_data_info_and_lock (manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1773 media, session_id, participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1774 guint bytes_read = 0;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1775
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1776 if (info) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1777 /* If we are in a blocking read, we need to loop until max_size data
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1778 * is read into the buffer, if we're not, then we need to read as much
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1779 * data as possible
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1780 */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1781 do {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1782 if (!info->current_sample && info->appsink && info->num_samples > 0) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1783 info->current_sample = gst_app_sink_pull_sample (info->appsink);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1784 info->sample_offset = 0;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1785 if (info->current_sample)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1786 info->num_samples--;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1787 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1788
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1789 if (info->current_sample) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1790 GstBuffer *gstbuffer = gst_sample_get_buffer (
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1791 info->current_sample);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1792
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1793 if (gstbuffer) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1794 GstMapInfo mapinfo;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1795 guint bytes_to_copy;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1796
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1797 gst_buffer_map (gstbuffer, &mapinfo, GST_MAP_READ);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1798 /* We must copy only the data remaining in the buffer without
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1799 * overflowing the buffer */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1800 bytes_to_copy = max_size - bytes_read;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1801 if (bytes_to_copy > mapinfo.size - info->sample_offset)
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1802 bytes_to_copy = mapinfo.size - info->sample_offset;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1803 memcpy ((guint8 *)buffer + bytes_read,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1804 mapinfo.data + info->sample_offset, bytes_to_copy);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1805
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1806 gst_buffer_unmap (gstbuffer, &mapinfo);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1807 info->sample_offset += bytes_to_copy;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1808 bytes_read += bytes_to_copy;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1809 if (info->sample_offset == mapinfo.size) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1810 gst_sample_unref (info->current_sample);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1811 info->current_sample = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1812 info->sample_offset = 0;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1813 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1814 } else {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1815 /* In case there's no buffer in the sample (should never
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1816 * happen), we need to at least unref it */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1817 gst_sample_unref (info->current_sample);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1818 info->current_sample = NULL;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1819 info->sample_offset = 0;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1820 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1821 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1822
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1823 /* If blocking, wait until there's an available sample */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1824 while (bytes_read < max_size && blocking &&
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1825 info->current_sample == NULL && info->num_samples == 0) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1826 g_cond_wait (&info->readable_cond, &manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1827
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1828 /* We've been signaled, we need to unlock and regrab the info
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1829 * struct to make sure nothing changed */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1830 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1831 info = get_app_data_info_and_lock (manager,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1832 media, session_id, participant);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1833 if (info == NULL || info->appsink == NULL) {
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1834 /* The session was destroyed while we were waiting, we
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1835 * should return here */
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1836 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1837 return bytes_read;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1838 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1839 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1840 } while (bytes_read < max_size &&
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1841 (blocking || info->num_samples > 0));
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1842
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1843 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1844 return bytes_read;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1845 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1846 g_mutex_unlock (&manager->priv->appdata_mutex);
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1847 return -1;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1848 #else
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1849 return -1;
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1850 #endif
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1851 }
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1852
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
1853 #ifdef USE_GSTREAMER
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1854
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1855 /*
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1856 * PurpleMediaElementType
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1857 */
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1858
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1859 GType
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1860 purple_media_element_type_get_type()
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1861 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1862 static GType type = 0;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1863 if (type == 0) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1864 static const GFlagsValue values[] = {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1865 { PURPLE_MEDIA_ELEMENT_NONE,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1866 "PURPLE_MEDIA_ELEMENT_NONE", "none" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1867 { PURPLE_MEDIA_ELEMENT_AUDIO,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1868 "PURPLE_MEDIA_ELEMENT_AUDIO", "audio" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1869 { PURPLE_MEDIA_ELEMENT_VIDEO,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1870 "PURPLE_MEDIA_ELEMENT_VIDEO", "video" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1871 { PURPLE_MEDIA_ELEMENT_AUDIO_VIDEO,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1872 "PURPLE_MEDIA_ELEMENT_AUDIO_VIDEO",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1873 "audio-video" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1874 { PURPLE_MEDIA_ELEMENT_NO_SRCS,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1875 "PURPLE_MEDIA_ELEMENT_NO_SRCS", "no-srcs" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1876 { PURPLE_MEDIA_ELEMENT_ONE_SRC,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1877 "PURPLE_MEDIA_ELEMENT_ONE_SRC", "one-src" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1878 { PURPLE_MEDIA_ELEMENT_MULTI_SRC,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1879 "PURPLE_MEDIA_ELEMENT_MULTI_SRC",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1880 "multi-src" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1881 { PURPLE_MEDIA_ELEMENT_REQUEST_SRC,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1882 "PURPLE_MEDIA_ELEMENT_REQUEST_SRC",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1883 "request-src" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1884 { PURPLE_MEDIA_ELEMENT_NO_SINKS,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1885 "PURPLE_MEDIA_ELEMENT_NO_SINKS", "no-sinks" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1886 { PURPLE_MEDIA_ELEMENT_ONE_SINK,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1887 "PURPLE_MEDIA_ELEMENT_ONE_SINK", "one-sink" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1888 { PURPLE_MEDIA_ELEMENT_MULTI_SINK,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1889 "PURPLE_MEDIA_ELEMENT_MULTI_SINK",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1890 "multi-sink" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1891 { PURPLE_MEDIA_ELEMENT_REQUEST_SINK,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1892 "PURPLE_MEDIA_ELEMENT_REQUEST_SINK",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1893 "request-sink" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1894 { PURPLE_MEDIA_ELEMENT_UNIQUE,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1895 "PURPLE_MEDIA_ELEMENT_UNIQUE", "unique" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1896 { PURPLE_MEDIA_ELEMENT_SRC,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1897 "PURPLE_MEDIA_ELEMENT_SRC", "src" },
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1898 { PURPLE_MEDIA_ELEMENT_SINK,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1899 "PURPLE_MEDIA_ELEMENT_SINK", "sink" },
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1900 { PURPLE_MEDIA_ELEMENT_APPLICATION,
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
1901 "PURPLE_MEDIA_ELEMENT_APPLICATION", "application" },
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1902 { 0, NULL, NULL }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1903 };
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1904 type = g_flags_register_static(
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1905 "PurpleMediaElementType", values);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1906 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1907 return type;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1908 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1909
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1910 /*
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1911 * PurpleMediaElementInfo
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1912 */
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1913
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1914 struct _PurpleMediaElementInfoClass
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1915 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1916 GObjectClass parent_class;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1917 };
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1918
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1919 struct _PurpleMediaElementInfo
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1920 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1921 GObject parent;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1922 };
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1923
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
1924 #ifdef USE_VV
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1925 struct _PurpleMediaElementInfoPrivate
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1926 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1927 gchar *id;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1928 gchar *name;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1929 PurpleMediaElementType type;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1930 PurpleMediaElementCreateCallback create;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1931 };
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1932
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1933 enum {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1934 PROP_0,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1935 PROP_ID,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1936 PROP_NAME,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1937 PROP_TYPE,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1938 PROP_CREATE_CB,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1939 };
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1940
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1941 static void
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1942 purple_media_element_info_init(PurpleMediaElementInfo *info)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1943 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1944 PurpleMediaElementInfoPrivate *priv =
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1945 PURPLE_MEDIA_ELEMENT_INFO_GET_PRIVATE(info);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1946 priv->id = NULL;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1947 priv->name = NULL;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1948 priv->type = PURPLE_MEDIA_ELEMENT_NONE;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1949 priv->create = NULL;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1950 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1951
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1952 static void
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1953 purple_media_element_info_finalize(GObject *info)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1954 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1955 PurpleMediaElementInfoPrivate *priv =
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1956 PURPLE_MEDIA_ELEMENT_INFO_GET_PRIVATE(info);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1957 g_free(priv->id);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1958 g_free(priv->name);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1959 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1960
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1961 static void
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1962 purple_media_element_info_set_property (GObject *object, guint prop_id,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1963 const GValue *value, GParamSpec *pspec)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1964 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1965 PurpleMediaElementInfoPrivate *priv;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1966 g_return_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(object));
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1967
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1968 priv = PURPLE_MEDIA_ELEMENT_INFO_GET_PRIVATE(object);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1969
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1970 switch (prop_id) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1971 case PROP_ID:
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1972 g_free(priv->id);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1973 priv->id = g_value_dup_string(value);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1974 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1975 case PROP_NAME:
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1976 g_free(priv->name);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1977 priv->name = g_value_dup_string(value);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1978 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1979 case PROP_TYPE: {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1980 priv->type = g_value_get_flags(value);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1981 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1982 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1983 case PROP_CREATE_CB:
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1984 priv->create = g_value_get_pointer(value);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1985 break;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 29620
diff changeset
1986 default:
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1987 G_OBJECT_WARN_INVALID_PROPERTY_ID(
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1988 object, prop_id, pspec);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1989 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1990 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1991 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1992
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1993 static void
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1994 purple_media_element_info_get_property (GObject *object, guint prop_id,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1995 GValue *value, GParamSpec *pspec)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1996 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1997 PurpleMediaElementInfoPrivate *priv;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
1998 g_return_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(object));
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 29620
diff changeset
1999
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2000 priv = PURPLE_MEDIA_ELEMENT_INFO_GET_PRIVATE(object);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2001
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2002 switch (prop_id) {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2003 case PROP_ID:
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2004 g_value_set_string(value, priv->id);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2005 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2006 case PROP_NAME:
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2007 g_value_set_string(value, priv->name);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2008 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2009 case PROP_TYPE:
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2010 g_value_set_flags(value, priv->type);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2011 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2012 case PROP_CREATE_CB:
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2013 g_value_set_pointer(value, priv->create);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2014 break;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 29620
diff changeset
2015 default:
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2016 G_OBJECT_WARN_INVALID_PROPERTY_ID(
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2017 object, prop_id, pspec);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2018 break;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2019 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2020 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2021
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2022 static void
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2023 purple_media_element_info_class_init(PurpleMediaElementInfoClass *klass)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2024 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2025 GObjectClass *gobject_class = (GObjectClass*)klass;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 29620
diff changeset
2026
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2027 gobject_class->finalize = purple_media_element_info_finalize;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2028 gobject_class->set_property = purple_media_element_info_set_property;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2029 gobject_class->get_property = purple_media_element_info_get_property;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2030
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2031 g_object_class_install_property(gobject_class, PROP_ID,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2032 g_param_spec_string("id",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2033 "ID",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2034 "The unique identifier of the element.",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2035 NULL,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2036 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2037
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2038 g_object_class_install_property(gobject_class, PROP_NAME,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2039 g_param_spec_string("name",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2040 "Name",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2041 "The friendly/display name of this element.",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2042 NULL,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2043 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2044
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2045 g_object_class_install_property(gobject_class, PROP_TYPE,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2046 g_param_spec_flags("type",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2047 "Element Type",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2048 "The type of element this is.",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2049 PURPLE_TYPE_MEDIA_ELEMENT_TYPE,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2050 PURPLE_MEDIA_ELEMENT_NONE,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2051 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2052
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2053 g_object_class_install_property(gobject_class, PROP_CREATE_CB,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2054 g_param_spec_pointer("create-cb",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2055 "Create Callback",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2056 "The function called to create this element.",
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2057 G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE));
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2058
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2059 g_type_class_add_private(klass, sizeof(PurpleMediaElementInfoPrivate));
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2060 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2061
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2062 G_DEFINE_TYPE(PurpleMediaElementInfo,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2063 purple_media_element_info, G_TYPE_OBJECT);
26640
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
2064 #else
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
2065 GType
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
2066 purple_media_element_info_get_type()
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
2067 {
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
2068 return G_TYPE_NONE;
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
2069 }
eba80d2f198f Make it compile with --disable-vv... again!
Michael Ruprecht <maiku@pidgin.im>
parents: 26626
diff changeset
2070 #endif
26616
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2071
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2072 gchar *
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2073 purple_media_element_info_get_id(PurpleMediaElementInfo *info)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2074 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2075 #ifdef USE_VV
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2076 gchar *id;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2077 g_return_val_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(info), NULL);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2078 g_object_get(info, "id", &id, NULL);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2079 return id;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2080 #else
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2081 return NULL;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2082 #endif
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2083 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2084
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2085 gchar *
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2086 purple_media_element_info_get_name(PurpleMediaElementInfo *info)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2087 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2088 #ifdef USE_VV
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2089 gchar *name;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2090 g_return_val_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(info), NULL);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2091 g_object_get(info, "name", &name, NULL);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2092 return name;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2093 #else
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2094 return NULL;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2095 #endif
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2096 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2097
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2098 PurpleMediaElementType
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2099 purple_media_element_info_get_element_type(PurpleMediaElementInfo *info)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2100 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2101 #ifdef USE_VV
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2102 PurpleMediaElementType type;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2103 g_return_val_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(info),
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2104 PURPLE_MEDIA_ELEMENT_NONE);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2105 g_object_get(info, "type", &type, NULL);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2106 return type;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2107 #else
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2108 return PURPLE_MEDIA_ELEMENT_NONE;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2109 #endif
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2110 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2111
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2112 GstElement *
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2113 purple_media_element_info_call_create(PurpleMediaElementInfo *info,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2114 PurpleMedia *media, const gchar *session_id,
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2115 const gchar *participant)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2116 {
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2117 #ifdef USE_VV
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2118 PurpleMediaElementCreateCallback create;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2119 g_return_val_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(info), NULL);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2120 g_object_get(info, "create-cb", &create, NULL);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2121 if (create)
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2122 return create(media, session_id, participant);
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2123 #endif
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2124 return NULL;
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2125 }
4f58db29d346 Hide and gobjectify PurpleMediaElementInfo.
Michael Ruprecht <maiku@pidgin.im>
parents: 26614
diff changeset
2126
36333
4fe1034f3dce Add application media type and APIs
Youness Alaoui <kakaroto@kakaroto.homelinux.net>
parents: 36331
diff changeset
2127
26760
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
2128 #endif /* USE_GSTREAMER */
251146cb6d09 Fix build with --disable-gstreamer.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 26748
diff changeset
2129

mercurial