ges-audio-test-source.c 5.69 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/* GStreamer Editing Services
 * Copyright (C) 2010 Brandon Lewis <brandon.lewis@collabora.co.uk>
 *               2010 Nokia Corporation
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
Tim-Philipp Müller's avatar
Tim-Philipp Müller committed
17 18
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
19 20 21
 */

/**
22
 * SECTION:gesaudiotestsource
23
 * @title: GESAudioTestSource
24
 * @short_description: produce a simple test waveform or silence
25
 *
26 27 28
 * Outputs a test audio stream using audiotestsrc. The default property values
 * output silence. Useful for testing pipelines, or to fill gaps in an audio
 * track.
29 30 31
 */

#include "ges-internal.h"
32
#include "ges-track-element.h"
33
#include "ges-audio-test-source.h"
34

35 36
G_DEFINE_TYPE (GESAudioTestSource, ges_audio_test_source,
    GES_TYPE_AUDIO_SOURCE);
37
#define DEFAULT_VOLUME 1.0
38

39
struct _GESAudioTestSourcePrivate
40
{
41 42
  gdouble freq;
  gdouble volume;
43 44
};

45 46 47 48 49
enum
{
  PROP_0,
};

50
static void ges_audio_test_source_get_property (GObject * object, guint
51 52
    property_id, GValue * value, GParamSpec * pspec);

53
static void ges_audio_test_source_set_property (GObject * object, guint
54 55
    property_id, const GValue * value, GParamSpec * pspec);

56
static GstElement *ges_audio_test_source_create_source (GESTrackElement * self);
57 58

static void
59
ges_audio_test_source_class_init (GESAudioTestSourceClass * klass)
60
{
61
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
62
  GESAudioSourceClass *source_class = GES_AUDIO_SOURCE_CLASS (klass);
63

64
  g_type_class_add_private (klass, sizeof (GESAudioTestSourcePrivate));
65

66 67
  object_class->get_property = ges_audio_test_source_get_property;
  object_class->set_property = ges_audio_test_source_set_property;
68

69
  source_class->create_source = ges_audio_test_source_create_source;
70 71 72
}

static void
73
ges_audio_test_source_init (GESAudioTestSource * self)
74
{
75
  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
76
      GES_TYPE_AUDIO_TEST_SOURCE, GESAudioTestSourcePrivate);
77

78
  self->priv->freq = 440;
79
  self->priv->volume = DEFAULT_VOLUME;
80 81 82
}

static void
83
ges_audio_test_source_get_property (GObject * object,
84 85 86 87 88 89 90 91 92
    guint property_id, GValue * value, GParamSpec * pspec)
{
  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  }
}

static void
93
ges_audio_test_source_set_property (GObject * object,
94 95 96 97 98 99 100 101 102
    guint property_id, const GValue * value, GParamSpec * pspec)
{
  switch (property_id) {
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  }
}

static GstElement *
103
ges_audio_test_source_create_source (GESTrackElement * trksrc)
104
{
105
  GESAudioTestSource *self;
106
  GstElement *ret;
107
  const gchar *props[] = { "volume", "freq", NULL };
Edward Hervey's avatar
Edward Hervey committed
108

109
  self = (GESAudioTestSource *) trksrc;
110
  ret = gst_element_factory_make ("audiotestsrc", NULL);
111 112
  g_object_set (ret, "volume", (gdouble) self->priv->volume, "freq", (gdouble)
      self->priv->freq, NULL);
Edward Hervey's avatar
Edward Hervey committed
113

114 115
  ges_track_element_add_children_props (trksrc, ret, NULL, NULL, props);

116
  return ret;
117 118
}

119
/**
120 121
 * ges_audio_test_source_set_freq:
 * @self: a #GESAudioTestSource
122 123
 * @freq: The frequency you want to apply on @self
 *
124
 * Lets you set the frequency applied on the track element
125
 */
126
void
127
ges_audio_test_source_set_freq (GESAudioTestSource * self, gdouble freq)
128
{
129 130
  GstElement *element =
      ges_track_element_get_element (GES_TRACK_ELEMENT (self));
Edward Hervey's avatar
Edward Hervey committed
131

132
  self->priv->freq = freq;
133 134 135 136 137 138 139 140
  if (element) {
    GValue val = { 0 };

    g_value_init (&val, G_TYPE_DOUBLE);
    g_value_set_double (&val, freq);
    ges_track_element_set_child_property (GES_TRACK_ELEMENT (self), "freq",
        &val);
  }
141 142
}

143
/**
144 145
 * ges_audio_test_source_set_volume:
 * @self: a #GESAudioTestSource
146 147 148 149
 * @volume: The volume you want to apply on @self
 *
 * Sets the volume of the test audio signal.
 */
150
void
151
ges_audio_test_source_set_volume (GESAudioTestSource * self, gdouble volume)
152
{
153 154
  GstElement *element =
      ges_track_element_get_element (GES_TRACK_ELEMENT (self));
Edward Hervey's avatar
Edward Hervey committed
155

156
  self->priv->volume = volume;
157 158 159 160 161 162 163 164
  if (element) {
    GValue val = { 0 };

    g_value_init (&val, G_TYPE_DOUBLE);
    g_value_set_double (&val, volume);
    ges_track_element_set_child_property (GES_TRACK_ELEMENT (self), "volume",
        &val);
  }
165 166
}

167
/**
168 169
 * ges_audio_test_source_get_freq:
 * @self: a #GESAudioTestSource
170
 *
171 172 173
 * Get the current frequency of @self.
 *
 * Returns: The current frequency of @self.
174 175
 */
double
176
ges_audio_test_source_get_freq (GESAudioTestSource * self)
177
{
178 179 180 181
  GValue val = { 0 };

  ges_track_element_get_child_property (GES_TRACK_ELEMENT (self), "freq", &val);
  return g_value_get_double (&val);
182 183 184
}

/**
185 186
 * ges_audio_test_source_get_volume:
 * @self: a #GESAudioTestSource
187
 *
188
 * Get the current volume of @self.
189 190 191 192
 *
 * Returns: The current volume of @self
 */
double
193
ges_audio_test_source_get_volume (GESAudioTestSource * self)
194
{
195 196 197 198 199
  GValue val = { 0 };

  ges_track_element_get_child_property (GES_TRACK_ELEMENT (self), "volume",
      &val);
  return g_value_get_double (&val);
200 201
}

202
/**
203
 * ges_audio_test_source_new:
204
 *
205
 * Creates a new #GESAudioTestSource.
206
 *
207
 * Returns: (transfer floating) (nullable): The newly created #GESAudioTestSource.
208
 */
209 210
GESAudioTestSource *
ges_audio_test_source_new (void)
211
{
212
  return g_object_new (GES_TYPE_AUDIO_TEST_SOURCE, "track-type",
213
      GES_TRACK_TYPE_AUDIO, NULL);
214
}