1 /* GStreamer Editing Services
2 * Copyright (C) 2009 Edward Hervey <edward.hervey@collabora.co.uk>
3 * 2009 Nokia Corporation
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
22 * SECTION:gesaudiosource
23 * @title: GESAudioSource
24 * @short_description: Base Class for audio sources
26 * ## Children Properties
28 * You can use the following children properties through the
29 * #ges_track_element_set_child_property and alike set of methods:
31 * - #gdouble `volume`: volume factor, 1.0=100%.
32 * - #gboolean `mute`: mute channel.
39 #include "ges-internal.h"
40 #include "ges/ges-meta-container.h"
41 #include "ges-track-element.h"
42 #include "ges-audio-source.h"
43 #include "ges-layer.h"
45 struct _GESAudioSourcePrivate
47 GstElement *capsfilter;
48 GESTrack *current_track;
51 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GESAudioSource, ges_audio_source,
55 _sync_element_to_layer_property_float (GESTrackElement * trksrc,
56 GstElement * element, const gchar * meta, const gchar * propname)
58 GESTimelineElement *parent;
62 parent = ges_timeline_element_get_parent (GES_TIMELINE_ELEMENT (trksrc));
64 GST_DEBUG_OBJECT (trksrc, "Not in a clip... doing nothing");
69 layer = ges_clip_get_layer (GES_CLIP (parent));
71 gst_object_unref (parent);
75 ges_meta_container_get_float (GES_META_CONTAINER (layer), meta, &value);
76 g_object_set (element, propname, value, NULL);
77 GST_DEBUG_OBJECT (trksrc, "Setting %s to %f", propname, value);
80 gst_object_unref (layer);
83 GST_DEBUG_OBJECT (trksrc, "NOT setting the %s", propname);
88 restriction_caps_cb (GESTrack * track,
89 GParamSpec * arg G_GNUC_UNUSED, GESAudioSource * self)
93 g_object_get (track, "restriction-caps", &caps, NULL);
95 GST_DEBUG_OBJECT (self, "Setting capsfilter caps to %" GST_PTR_FORMAT, caps);
96 g_object_set (self->priv->capsfilter, "caps", caps, NULL);
99 gst_caps_unref (caps);
103 _track_changed_cb (GESAudioSource * self, GParamSpec * arg G_GNUC_UNUSED,
106 GESTrack *track = ges_track_element_get_track (GES_TRACK_ELEMENT (self));
108 if (self->priv->current_track) {
109 g_signal_handlers_disconnect_by_func (self->priv->current_track,
110 (GCallback) restriction_caps_cb, self);
113 self->priv->current_track = track;
115 restriction_caps_cb (track, NULL, self);
117 g_signal_connect (track, "notify::restriction-caps",
118 G_CALLBACK (restriction_caps_cb), self);
123 ges_audio_source_create_element (GESTrackElement * trksrc)
125 GstElement *volume, *vbin;
127 GstElement *sub_element;
129 GESSourceClass *source_class = GES_SOURCE_GET_CLASS (trksrc);
130 const gchar *props[] = { "volume", "mute", NULL };
131 GESAudioSource *self = GES_AUDIO_SOURCE (trksrc);
133 g_assert (source_class->create_source);
135 sub_element = source_class->create_source (GES_SOURCE (trksrc));
137 GST_DEBUG_OBJECT (trksrc, "Creating a bin sub_element ! volume");
139 gst_parse_bin_from_description
140 ("audioconvert ! audioresample ! volume name=v ! capsfilter name=audio-track-caps-filter",
142 elements = g_ptr_array_new ();
143 g_ptr_array_add (elements, vbin);
144 topbin = ges_source_create_topbin (GES_SOURCE (trksrc), "audiosrcbin",
145 sub_element, elements);
146 volume = gst_bin_get_by_name (GST_BIN (vbin), "v");
147 self->priv->capsfilter = gst_bin_get_by_name (GST_BIN (vbin),
148 "audio-track-caps-filter");
150 g_signal_connect (self, "notify::track", (GCallback) _track_changed_cb, NULL);
151 _track_changed_cb (self, NULL, NULL);
153 _sync_element_to_layer_property_float (trksrc, volume, GES_META_VOLUME,
155 ges_track_element_add_children_props (trksrc, volume, NULL, NULL, props);
156 gst_object_unref (volume);
162 ges_audio_source_dispose (GObject * object)
164 GESAudioSource *self = GES_AUDIO_SOURCE (object);
166 if (self->priv->capsfilter) {
167 gst_object_unref (self->priv->capsfilter);
168 self->priv->capsfilter = NULL;
171 G_OBJECT_CLASS (ges_audio_source_parent_class)->dispose (object);
175 ges_audio_source_class_init (GESAudioSourceClass * klass)
177 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
178 GESTrackElementClass *track_class = GES_TRACK_ELEMENT_CLASS (klass);
180 gobject_class->dispose = ges_audio_source_dispose;
181 track_class->nleobject_factorytype = "nlesource";
182 track_class->create_element = ges_audio_source_create_element;
183 track_class->ABI.abi.default_track_type = GES_TRACK_TYPE_AUDIO;
187 ges_audio_source_init (GESAudioSource * self)
189 self->priv = ges_audio_source_get_instance_private (self);