2
2
* (c) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
3
* (c) 2006 Jürg Billeter <j@bitron.ch>
4
5
* This library is free software; you can redistribute it and/or
5
6
* modify it under the terms of the GNU Library General Public
33
34
gst_gconf_audio_sink_change_state (GstElement * element,
34
35
GstStateChange transition);
36
43
GST_BOILERPLATE (GstGConfAudioSink, gst_gconf_audio_sink, GstBin, GST_TYPE_BIN);
45
static void gst_gconf_audio_sink_set_property (GObject * object, guint prop_id,
46
const GValue * value, GParamSpec * pspec);
47
static void gst_gconf_audio_sink_get_property (GObject * object, guint prop_id,
48
GValue * value, GParamSpec * pspec);
39
51
gst_gconf_audio_sink_base_init (gpointer klass)
41
53
GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
42
GstElementDetails gst_gconf_audio_sink_details = {
45
"Audio sink embedding the GConf-settings for audio output",
46
"Ronald Bultje <rbultje@ronald.bitfreak.net>"
54
static const GstElementDetails gst_gconf_audio_sink_details =
55
GST_ELEMENT_DETAILS ("GConf audio sink",
57
"Audio sink embedding the GConf-settings for audio output",
58
"Ronald Bultje <rbultje@ronald.bitfreak.net>");
48
59
GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
55
66
gst_element_class_set_details (eklass, &gst_gconf_audio_sink_details);
69
#define GST_TYPE_GCONF_PROFILE (gst_gconf_profile_get_type())
71
gst_gconf_profile_get_type (void)
73
static GType gconf_profile_type = 0;
74
static GEnumValue gconf_profiles[] = {
75
{GCONF_PROFILE_SOUNDS, "Sound Events", "sounds"},
76
{GCONF_PROFILE_MUSIC, "Music and Movies", "music"},
77
{GCONF_PROFILE_CHAT, "Audio/Video Conferencing", "chat"},
81
if (!gconf_profile_type) {
83
g_enum_register_static ("GstGConfProfile", gconf_profiles);
85
return gconf_profile_type;
59
89
gst_gconf_audio_sink_class_init (GstGConfAudioSinkClass * klass)
61
91
GObjectClass *oklass = G_OBJECT_CLASS (klass);
62
92
GstElementClass *eklass = GST_ELEMENT_CLASS (klass);
94
oklass->set_property = gst_gconf_audio_sink_set_property;
95
oklass->get_property = gst_gconf_audio_sink_get_property;
64
96
oklass->dispose = gst_gconf_audio_sink_dispose;
65
97
eklass->change_state = gst_gconf_audio_sink_change_state;
99
g_object_class_install_property (oklass, PROP_PROFILE,
100
g_param_spec_enum ("profile", "Profile", "Profile",
101
GST_TYPE_GCONF_PROFILE, GCONF_PROFILE_SOUNDS, G_PARAM_READWRITE));
89
125
g_free (sink->gconf_str);
90
126
sink->gconf_str = NULL;
128
if (sink->connection) {
129
gconf_client_notify_remove (sink->client, sink->connection);
130
sink->connection = 0;
135
get_gconf_key_for_profile (int profile)
138
case GCONF_PROFILE_SOUNDS:
139
return GST_GCONF_DIR "/default/audiosink";
140
case GCONF_PROFILE_MUSIC:
141
return GST_GCONF_DIR "/default/musicaudiosink";
142
case GCONF_PROFILE_CHAT:
143
return GST_GCONF_DIR "/default/chataudiosink";
145
g_return_val_if_reached (NULL);
102
158
sink->client = gconf_client_get_default ();
103
159
gconf_client_add_dir (sink->client, GST_GCONF_DIR,
104
160
GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
105
gconf_client_notify_add (sink->client,
106
GST_GCONF_DIR "/" GST_GCONF_AUDIOSINK_KEY,
107
cb_toggle_element, sink, NULL, NULL);
162
sink->profile = GCONF_PROFILE_SOUNDS;
163
sink->connection = gconf_client_notify_add (sink->client,
164
get_gconf_key_for_profile (sink->profile), cb_toggle_element,
129
192
GstPad *targetpad;
130
193
gchar *new_gconf_str;
131
194
GstState cur, next;
133
196
new_gconf_str = gst_gconf_get_string (GST_GCONF_AUDIOSINK_KEY);
134
197
if (new_gconf_str != NULL && sink->gconf_str != NULL &&
135
198
(strlen (new_gconf_str) == 0 ||
136
strcmp (sink->gconf_str, new_gconf_str) == 0)) {
199
strcmp (sink->gconf_str, new_gconf_str) == 0)) {
137
200
g_free (new_gconf_str);
138
201
GST_DEBUG_OBJECT (sink, "GConf key was updated, but it didn't change");
148
211
GST_OBJECT_UNLOCK (sink);
150
213
if (cur > GST_STATE_READY || next == GST_STATE_PAUSED) {
151
GST_DEBUG_OBJECT (sink,
214
GST_DEBUG_OBJECT (sink,
152
215
"Auto-sink is already running. Ignoring GConf change");
156
219
GST_DEBUG_OBJECT (sink, "GConf key changed: '%s' to '%s'",
157
GST_STR_NULL (sink->gconf_str), GST_STR_NULL (new_gconf_str));
220
GST_STR_NULL (sink->gconf_str), GST_STR_NULL (new_gconf_str));
159
222
g_free (sink->gconf_str);
160
223
sink->gconf_str = new_gconf_str;
170
233
GST_DEBUG_OBJECT (sink, "Creating new kid");
171
if (!(sink->kid = gst_gconf_get_default_audio_sink ())) {
234
if (!(sink->kid = gst_gconf_get_default_audio_sink (sink->profile))) {
172
235
GST_ELEMENT_ERROR (sink, LIBRARY, SETTINGS, (NULL),
173
236
("Failed to render audio sink from GConf"));
174
237
g_free (sink->gconf_str);
255
gst_gconf_audio_sink_set_property (GObject * object, guint prop_id,
256
const GValue * value, GParamSpec * pspec)
258
GstGConfAudioSink *sink;
260
g_return_if_fail (GST_IS_GCONF_AUDIO_SINK (object));
262
sink = GST_GCONF_AUDIO_SINK (object);
266
sink->profile = g_value_get_enum (value);
267
if (sink->connection) {
268
gconf_client_notify_remove (sink->client, sink->connection);
270
sink->connection = gconf_client_notify_add (sink->client,
271
get_gconf_key_for_profile (sink->profile), cb_toggle_element,
280
gst_gconf_audio_sink_get_property (GObject * object, guint prop_id,
281
GValue * value, GParamSpec * pspec)
283
GstGConfAudioSink *sink;
285
g_return_if_fail (GST_IS_GCONF_AUDIO_SINK (object));
287
sink = GST_GCONF_AUDIO_SINK (object);
291
g_value_set_enum (value, sink->profile);
294
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
192
300
cb_toggle_element (GConfClient * client,
193
301
guint connection_id, GConfEntry * entry, gpointer data)