Blame libs/gst/controller/gsttimedvaluecontrolsource.c

Packit Service 963350
/* GStreamer
Packit Service 963350
 *
Packit Service 963350
 * Copyright (C) 2007,2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
Packit Service 963350
 *               2011 Stefan Sauer <ensonic@users.sf.net>
Packit Service 963350
 *
Packit Service 963350
 * gsttimedvaluecontrolsource.c: Base class for timeed value based control
Packit Service 963350
 *                               sources
Packit Service 963350
 *
Packit Service 963350
 * This library is free software; you can redistribute it and/or
Packit Service 963350
 * modify it under the terms of the GNU Library General Public
Packit Service 963350
 * License as published by the Free Software Foundation; either
Packit Service 963350
 * version 2 of the License, or (at your option) any later version.
Packit Service 963350
 *
Packit Service 963350
 * This library is distributed in the hope that it will be useful,
Packit Service 963350
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 963350
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 963350
 * Library General Public License for more details.
Packit Service 963350
 *
Packit Service 963350
 * You should have received a copy of the GNU Library General Public
Packit Service 963350
 * License along with this library; if not, write to the
Packit Service 963350
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit Service 963350
 * Boston, MA 02110-1301, USA.
Packit Service 963350
 */
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * SECTION:gsttimedvaluecontrolsource
Packit Service 963350
 * @title: GstTimedValueControlSource
Packit Service 963350
 * @short_description: timed value control source base class
Packit Service 963350
 *
Packit Service 963350
 * Base class for #GstControlSource that use time-stamped values.
Packit Service 963350
 *
Packit Service 963350
 * When overriding bind, chain up first to give this bind implementation a
Packit Service 963350
 * chance to setup things.
Packit Service 963350
 *
Packit Service 963350
 * All functions are MT-safe.
Packit Service 963350
 *
Packit Service 963350
 */
Packit Service 963350
Packit Service 963350
#include <glib-object.h>
Packit Service 963350
#include <gst/gst.h>
Packit Service 963350
Packit Service 963350
#include "gstinterpolationcontrolsource.h"
Packit Service 963350
#include "gst/glib-compat-private.h"
Packit Service 963350
Packit Service 963350
#define GST_CAT_DEFAULT controller_debug
Packit Service 963350
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
Packit Service 963350
Packit Service 963350
#define _do_init \
Packit Service 963350
  GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "timed value control source", 0, \
Packit Service 963350
    "timed value control source base class")
Packit Service 963350
Packit Service 963350
#define gst_timed_value_control_source_parent_class parent_class
Packit Service 963350
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstTimedValueControlSource,
Packit Service 963350
    gst_timed_value_control_source, GST_TYPE_CONTROL_SOURCE, _do_init);
Packit Service 963350
Packit Service 963350
Packit Service 963350
enum
Packit Service 963350
{
Packit Service 963350
  VALUE_CHANGED_SIGNAL,
Packit Service 963350
  VALUE_ADDED_SIGNAL,
Packit Service 963350
  VALUE_REMOVED_SIGNAL,
Packit Service 963350
  LAST_SIGNAL
Packit Service 963350
};
Packit Service 963350
Packit Service 963350
static guint gst_timed_value_control_source_signals[LAST_SIGNAL] = { 0 };
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_control_point_free:
Packit Service 963350
 * @cp: the object to free
Packit Service 963350
 *
Packit Service 963350
 * Frees all data allocated by a #GstControlPoint instance.
Packit Service 963350
 */
Packit Service 963350
void
Packit Service 963350
gst_control_point_free (GstControlPoint * cp)
Packit Service 963350
{
Packit Service 963350
  g_return_if_fail (cp);
Packit Service 963350
Packit Service 963350
  g_slice_free (GstControlPoint, cp);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GstControlPoint *
Packit Service 963350
gst_control_point_copy (GstControlPoint * cp)
Packit Service 963350
{
Packit Service 963350
  return g_slice_dup (GstControlPoint, cp);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GType
Packit Service 963350
gst_control_point_get_type (void)
Packit Service 963350
{
Packit Service 963350
  static volatile gsize type_id = 0;
Packit Service 963350
Packit Service 963350
  if (g_once_init_enter (&type_id)) {
Packit Service 963350
    GType tmp =
Packit Service 963350
        g_boxed_type_register_static (g_intern_static_string
Packit Service 963350
        ("GstControlPoint"),
Packit Service 963350
        (GBoxedCopyFunc) gst_control_point_copy,
Packit Service 963350
        (GBoxedFreeFunc) gst_control_point_free);
Packit Service 963350
    g_once_init_leave (&type_id, tmp);
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  return type_id;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
gst_timed_value_control_source_reset (GstTimedValueControlSource * self)
Packit Service 963350
{
Packit Service 963350
  GstControlSource *csource = (GstControlSource *) self;
Packit Service 963350
Packit Service 963350
  csource->get_value = NULL;
Packit Service 963350
  csource->get_value_array = NULL;
Packit Service 963350
Packit Service 963350
  if (self->values) {
Packit Service 963350
    g_sequence_free (self->values);
Packit Service 963350
    self->values = NULL;
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  self->nvalues = 0;
Packit Service 963350
  self->valid_cache = FALSE;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/*
Packit Service 963350
 * gst_control_point_compare:
Packit Service 963350
 * @p1: a pointer to a #GstControlPoint
Packit Service 963350
 * @p2: a pointer to a #GstControlPoint
Packit Service 963350
 *
Packit Service 963350
 * Compare function for g_list operations that operates on two #GstControlPoint
Packit Service 963350
 * parameters.
Packit Service 963350
 */
Packit Service 963350
static gint
Packit Service 963350
gst_control_point_compare (gconstpointer p1, gconstpointer p2)
Packit Service 963350
{
Packit Service 963350
  GstClockTime ct1 = ((GstControlPoint *) p1)->timestamp;
Packit Service 963350
  GstClockTime ct2 = ((GstControlPoint *) p2)->timestamp;
Packit Service 963350
Packit Service 963350
  return ((ct1 < ct2) ? -1 : ((ct1 == ct2) ? 0 : 1));
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/*
Packit Service 963350
 * gst_control_point_find:
Packit Service 963350
 * @p1: a pointer to a #GstControlPoint
Packit Service 963350
 * @p2: a pointer to a #GstClockTime
Packit Service 963350
 * @user_data: supplied user data
Packit Service 963350
 *
Packit Service 963350
 * Compare function for g_sequence operations that operates on a #GstControlPoint and
Packit Service 963350
 * a #GstClockTime.
Packit Service 963350
 */
Packit Service 963350
static gint
Packit Service 963350
gst_control_point_find (gconstpointer p1, gconstpointer p2, gpointer user_data)
Packit Service 963350
{
Packit Service 963350
  GstClockTime ct1 = ((GstControlPoint *) p1)->timestamp;
Packit Service 963350
  GstClockTime ct2 = *(GstClockTime *) p2;
Packit Service 963350
Packit Service 963350
  return ((ct1 < ct2) ? -1 : ((ct1 == ct2) ? 0 : 1));
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static GstControlPoint *
Packit Service 963350
_make_new_cp (GstTimedValueControlSource * self, GstClockTime timestamp,
Packit Service 963350
    const gdouble value)
Packit Service 963350
{
Packit Service 963350
  GstControlPoint *cp;
Packit Service 963350
Packit Service 963350
  /* create a new GstControlPoint */
Packit Service 963350
  cp = g_slice_new0 (GstControlPoint);
Packit Service 963350
  cp->timestamp = timestamp;
Packit Service 963350
  cp->value = value;
Packit Service 963350
Packit Service 963350
  return cp;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
gst_timed_value_control_source_set_internal (GstTimedValueControlSource *
Packit Service 963350
    self, GstClockTime timestamp, const gdouble value)
Packit Service 963350
{
Packit Service 963350
  GstControlPoint *cp;
Packit Service 963350
Packit Service 963350
  g_mutex_lock (&self->lock);
Packit Service 963350
Packit Service 963350
  /* check if a control point for the timestamp already exists */
Packit Service 963350
  if (G_LIKELY (self->values)) {
Packit Service 963350
    GSequenceIter *iter = g_sequence_lookup (self->values, &timestamp,
Packit Service 963350
        (GCompareDataFunc) gst_control_point_find, NULL);
Packit Service 963350
Packit Service 963350
    if (iter) {
Packit Service 963350
      GstControlPoint *cp = g_sequence_get (iter);
Packit Service 963350
Packit Service 963350
      /* update control point */
Packit Service 963350
      cp->value = value;
Packit Service 963350
      g_mutex_unlock (&self->lock);
Packit Service 963350
Packit Service 963350
      g_signal_emit (self,
Packit Service 963350
          gst_timed_value_control_source_signals[VALUE_CHANGED_SIGNAL], 0, cp);
Packit Service 963350
      goto done;
Packit Service 963350
    }
Packit Service 963350
  } else {
Packit Service 963350
    self->values = g_sequence_new ((GDestroyNotify) gst_control_point_free);
Packit Service 963350
    GST_INFO ("create new timed value sequence");
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  /* sort new cp into the prop->values list */
Packit Service 963350
  cp = _make_new_cp (self, timestamp, value);
Packit Service 963350
  g_sequence_insert_sorted (self->values, cp,
Packit Service 963350
      (GCompareDataFunc) gst_control_point_compare, NULL);
Packit Service 963350
  self->nvalues++;
Packit Service 963350
  g_mutex_unlock (&self->lock);
Packit Service 963350
Packit Service 963350
  g_signal_emit (self,
Packit Service 963350
      gst_timed_value_control_source_signals[VALUE_ADDED_SIGNAL], 0, cp);
Packit Service 963350
Packit Service 963350
done:
Packit Service 963350
  self->valid_cache = FALSE;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_source_find_control_point_iter:
Packit Service 963350
 * @self: the control source to search in
Packit Service 963350
 * @timestamp: the search key
Packit Service 963350
 *
Packit Service 963350
 * Find last value before given timestamp in control point list.
Packit Service 963350
 * If all values in the control point list come after the given
Packit Service 963350
 * timestamp or no values exist, %NULL is returned.
Packit Service 963350
 *
Packit Service 963350
 * For use in control source implementations.
Packit Service 963350
 *
Packit Service 963350
 * Returns: (transfer none): the found #GSequenceIter or %NULL
Packit Service 963350
 */
Packit Service 963350
GSequenceIter *gst_timed_value_control_source_find_control_point_iter
Packit Service 963350
    (GstTimedValueControlSource * self, GstClockTime timestamp)
Packit Service 963350
{
Packit Service 963350
  GSequenceIter *iter;
Packit Service 963350
Packit Service 963350
  if (!self->values)
Packit Service 963350
    return NULL;
Packit Service 963350
Packit Service 963350
  iter =
Packit Service 963350
      g_sequence_search (self->values, &timestamp,
Packit Service 963350
      (GCompareDataFunc) gst_control_point_find, NULL);
Packit Service 963350
Packit Service 963350
  /* g_sequence_search() returns the iter where timestamp
Packit Service 963350
   * would be inserted, i.e. the iter > timestamp, so
Packit Service 963350
   * we need to get the previous one. And of course, if
Packit Service 963350
   * there is no previous one, we return NULL. */
Packit Service 963350
  if (g_sequence_iter_is_begin (iter))
Packit Service 963350
    return NULL;
Packit Service 963350
Packit Service 963350
  return g_sequence_iter_prev (iter);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_source_set:
Packit Service 963350
 * @self: the #GstTimedValueControlSource object
Packit Service 963350
 * @timestamp: the time the control-change is scheduled for
Packit Service 963350
 * @value: the control-value
Packit Service 963350
 *
Packit Service 963350
 * Set the value of given controller-handled property at a certain time.
Packit Service 963350
 *
Packit Service 963350
 * Returns: FALSE if the values couldn't be set, TRUE otherwise.
Packit Service 963350
 */
Packit Service 963350
gboolean
Packit Service 963350
gst_timed_value_control_source_set (GstTimedValueControlSource * self,
Packit Service 963350
    GstClockTime timestamp, const gdouble value)
Packit Service 963350
{
Packit Service 963350
  g_return_val_if_fail (GST_IS_TIMED_VALUE_CONTROL_SOURCE (self), FALSE);
Packit Service 963350
  g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
Packit Service 963350
Packit Service 963350
  gst_timed_value_control_source_set_internal (self, timestamp, value);
Packit Service 963350
Packit Service 963350
  return TRUE;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_source_set_from_list:
Packit Service 963350
 * @self: the #GstTimedValueControlSource object
Packit Service 963350
 * @timedvalues: (transfer none) (element-type GstTimedValue): a list
Packit Service 963350
 * with #GstTimedValue items
Packit Service 963350
 *
Packit Service 963350
 * Sets multiple timed values at once.
Packit Service 963350
 *
Packit Service 963350
 * Returns: FALSE if the values couldn't be set, TRUE otherwise.
Packit Service 963350
 */
Packit Service 963350
gboolean
Packit Service 963350
gst_timed_value_control_source_set_from_list (GstTimedValueControlSource *
Packit Service 963350
    self, const GSList * timedvalues)
Packit Service 963350
{
Packit Service 963350
  const GSList *node;
Packit Service 963350
  GstTimedValue *tv;
Packit Service 963350
  gboolean res = FALSE;
Packit Service 963350
Packit Service 963350
  g_return_val_if_fail (GST_IS_TIMED_VALUE_CONTROL_SOURCE (self), FALSE);
Packit Service 963350
Packit Service 963350
  for (node = timedvalues; node; node = g_slist_next (node)) {
Packit Service 963350
    tv = node->data;
Packit Service 963350
    if (!GST_CLOCK_TIME_IS_VALID (tv->timestamp)) {
Packit Service 963350
      GST_WARNING ("GstTimedValued with invalid timestamp passed to %s",
Packit Service 963350
          GST_FUNCTION);
Packit Service 963350
    } else {
Packit Service 963350
      gst_timed_value_control_source_set_internal (self, tv->timestamp,
Packit Service 963350
          tv->value);
Packit Service 963350
      res = TRUE;
Packit Service 963350
    }
Packit Service 963350
  }
Packit Service 963350
  return res;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_source_unset:
Packit Service 963350
 * @self: the #GstTimedValueControlSource object
Packit Service 963350
 * @timestamp: the time the control-change should be removed from
Packit Service 963350
 *
Packit Service 963350
 * Used to remove the value of given controller-handled property at a certain
Packit Service 963350
 * time.
Packit Service 963350
 *
Packit Service 963350
 * Returns: FALSE if the value couldn't be unset (i.e. not found, TRUE otherwise.
Packit Service 963350
 */
Packit Service 963350
gboolean
Packit Service 963350
gst_timed_value_control_source_unset (GstTimedValueControlSource * self,
Packit Service 963350
    GstClockTime timestamp)
Packit Service 963350
{
Packit Service 963350
  GSequenceIter *iter;
Packit Service 963350
  gboolean res = FALSE;
Packit Service 963350
  GstControlPoint *cp = NULL;
Packit Service 963350
Packit Service 963350
  g_return_val_if_fail (GST_IS_TIMED_VALUE_CONTROL_SOURCE (self), FALSE);
Packit Service 963350
  g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
Packit Service 963350
Packit Service 963350
  g_mutex_lock (&self->lock);
Packit Service 963350
  /* check if a control point for the timestamp exists */
Packit Service 963350
  if (G_LIKELY (self->values) && (iter =
Packit Service 963350
          g_sequence_lookup (self->values, &timestamp,
Packit Service 963350
              (GCompareDataFunc) gst_control_point_find, NULL))) {
Packit Service 963350
Packit Service 963350
    /* Iter contains the iter right after timestamp, i.e.
Packit Service 963350
     * we need to get the previous one and check the timestamp
Packit Service 963350
     */
Packit Service 963350
    cp = g_slice_dup (GstControlPoint, g_sequence_get (iter));
Packit Service 963350
    g_sequence_remove (iter);
Packit Service 963350
    self->nvalues--;
Packit Service 963350
    self->valid_cache = FALSE;
Packit Service 963350
    res = TRUE;
Packit Service 963350
  }
Packit Service 963350
  g_mutex_unlock (&self->lock);
Packit Service 963350
Packit Service 963350
  if (cp) {
Packit Service 963350
    g_signal_emit (self,
Packit Service 963350
        gst_timed_value_control_source_signals[VALUE_REMOVED_SIGNAL], 0, cp);
Packit Service 963350
    g_slice_free (GstControlPoint, cp);
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  return res;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_source_unset_all:
Packit Service 963350
 * @self: the #GstTimedValueControlSource object
Packit Service 963350
 *
Packit Service 963350
 * Used to remove all time-stamped values of given controller-handled property
Packit Service 963350
 *
Packit Service 963350
 */
Packit Service 963350
void
Packit Service 963350
gst_timed_value_control_source_unset_all (GstTimedValueControlSource * self)
Packit Service 963350
{
Packit Service 963350
  g_return_if_fail (GST_IS_TIMED_VALUE_CONTROL_SOURCE (self));
Packit Service 963350
Packit Service 963350
  g_mutex_lock (&self->lock);
Packit Service 963350
  /* free GstControlPoint structures */
Packit Service 963350
  if (self->values) {
Packit Service 963350
    g_sequence_free (self->values);
Packit Service 963350
    self->values = NULL;
Packit Service 963350
  }
Packit Service 963350
  self->nvalues = 0;
Packit Service 963350
  self->valid_cache = FALSE;
Packit Service 963350
Packit Service 963350
  g_mutex_unlock (&self->lock);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
_append_control_point (GstControlPoint * cp, GQueue * res)
Packit Service 963350
{
Packit Service 963350
  g_queue_push_tail (res, cp);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_source_get_all:
Packit Service 963350
 * @self: the #GstTimedValueControlSource to get the list from
Packit Service 963350
 *
Packit Service 963350
 * Returns a read-only copy of the list of #GstTimedValue for the given property.
Packit Service 963350
 * Free the list after done with it.
Packit Service 963350
 *
Packit Service 963350
 * Returns: (transfer container) (element-type GstTimedValue): a copy
Packit Service 963350
 * of the list, or %NULL if the property isn't handled by the controller
Packit Service 963350
 */
Packit Service 963350
GList *
Packit Service 963350
gst_timed_value_control_source_get_all (GstTimedValueControlSource * self)
Packit Service 963350
{
Packit Service 963350
  GQueue res = G_QUEUE_INIT;
Packit Service 963350
Packit Service 963350
  g_return_val_if_fail (GST_IS_TIMED_VALUE_CONTROL_SOURCE (self), NULL);
Packit Service 963350
Packit Service 963350
  g_mutex_lock (&self->lock);
Packit Service 963350
  if (G_LIKELY (self->values))
Packit Service 963350
    g_sequence_foreach (self->values, (GFunc) _append_control_point, &res;;
Packit Service 963350
  g_mutex_unlock (&self->lock);
Packit Service 963350
Packit Service 963350
  return res.head;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_source_get_count:
Packit Service 963350
 * @self: the #GstTimedValueControlSource to get the number of values from
Packit Service 963350
 *
Packit Service 963350
 * Get the number of control points that are set.
Packit Service 963350
 *
Packit Service 963350
 * Returns: the number of control points that are set.
Packit Service 963350
 */
Packit Service 963350
gint
Packit Service 963350
gst_timed_value_control_source_get_count (GstTimedValueControlSource * self)
Packit Service 963350
{
Packit Service 963350
  g_return_val_if_fail (GST_IS_TIMED_VALUE_CONTROL_SOURCE (self), 0);
Packit Service 963350
  return self->nvalues;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/**
Packit Service 963350
 * gst_timed_value_control_invalidate_cache:
Packit Service 963350
 * @self: the #GstTimedValueControlSource
Packit Service 963350
 *
Packit Service 963350
 * Reset the controlled value cache.
Packit Service 963350
 */
Packit Service 963350
void
Packit Service 963350
gst_timed_value_control_invalidate_cache (GstTimedValueControlSource * self)
Packit Service 963350
{
Packit Service 963350
  g_return_if_fail (GST_IS_TIMED_VALUE_CONTROL_SOURCE (self));
Packit Service 963350
  self->valid_cache = FALSE;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
gst_timed_value_control_source_init (GstTimedValueControlSource * self)
Packit Service 963350
{
Packit Service 963350
  g_mutex_init (&self->lock);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
gst_timed_value_control_source_finalize (GObject * obj)
Packit Service 963350
{
Packit Service 963350
  GstTimedValueControlSource *self = GST_TIMED_VALUE_CONTROL_SOURCE (obj);
Packit Service 963350
Packit Service 963350
  g_mutex_lock (&self->lock);
Packit Service 963350
  gst_timed_value_control_source_reset (self);
Packit Service 963350
  g_mutex_unlock (&self->lock);
Packit Service 963350
  g_mutex_clear (&self->lock);
Packit Service 963350
Packit Service 963350
  G_OBJECT_CLASS (parent_class)->finalize (obj);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
gst_timed_value_control_source_class_init (GstTimedValueControlSourceClass
Packit Service 963350
    * klass)
Packit Service 963350
{
Packit Service 963350
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit Service 963350
  //GstControlSourceClass *csource_class = GST_CONTROL_SOURCE_CLASS (klass);
Packit Service 963350
Packit Service 963350
  /**
Packit Service 963350
   * GstTimedValueControlSource::value-changed
Packit Service 963350
   * @self: The #GstTimedValueControlSource on which a #GstTimedValue has changed
Packit Service 963350
   * @timed_value: The #GstTimedValue where the value changed
Packit Service 963350
   *
Packit Service 963350
   * Emited right after the new value has been set on @timed_signals
Packit Service 963350
   *
Packit Service 963350
   * Since: 1.6
Packit Service 963350
   */
Packit Service 963350
  gst_timed_value_control_source_signals[VALUE_CHANGED_SIGNAL] =
Packit Service 963350
      g_signal_new ("value-changed", G_TYPE_FROM_CLASS (klass),
Packit Service 963350
      G_SIGNAL_RUN_FIRST, 0, NULL,
Packit Service 963350
      NULL, g_cclosure_marshal_generic, G_TYPE_NONE, 1,
Packit Service 963350
      gst_control_point_get_type ());
Packit Service 963350
Packit Service 963350
  /**
Packit Service 963350
   * GstTimedValueControlSource::value-added
Packit Service 963350
   * @self: The #GstTimedValueControlSource into which a #GstTimedValue has been
Packit Service 963350
   *        added
Packit Service 963350
   * @timed_value: The newly added #GstTimedValue
Packit Service 963350
   *
Packit Service 963350
   * Emited right after the new value has been added to @self
Packit Service 963350
   *
Packit Service 963350
   * Since: 1.6
Packit Service 963350
   */
Packit Service 963350
  gst_timed_value_control_source_signals[VALUE_ADDED_SIGNAL] =
Packit Service 963350
      g_signal_new ("value-added", G_TYPE_FROM_CLASS (klass),
Packit Service 963350
      G_SIGNAL_RUN_FIRST, 0, NULL,
Packit Service 963350
      NULL, g_cclosure_marshal_generic, G_TYPE_NONE, 1,
Packit Service 963350
      gst_control_point_get_type ());
Packit Service 963350
Packit Service 963350
  /**
Packit Service 963350
   * GstTimedValueControlSource::value-removed
Packit Service 963350
   * @self: The #GstTimedValueControlSource from which a #GstTimedValue has been
Packit Service 963350
   *        removed
Packit Service 963350
   * @timed_value: The removed #GstTimedValue
Packit Service 963350
   *
Packit Service 963350
   * Emited when @timed_value is removed from @self
Packit Service 963350
   *
Packit Service 963350
   * Since: 1.6
Packit Service 963350
   */
Packit Service 963350
  gst_timed_value_control_source_signals[VALUE_REMOVED_SIGNAL] =
Packit Service 963350
      g_signal_new ("value-removed", G_TYPE_FROM_CLASS (klass),
Packit Service 963350
      G_SIGNAL_RUN_FIRST, 0, NULL,
Packit Service 963350
      NULL, g_cclosure_marshal_generic, G_TYPE_NONE, 1,
Packit Service 963350
      gst_control_point_get_type ());
Packit Service 963350
Packit Service 963350
Packit Service 963350
  gobject_class->finalize = gst_timed_value_control_source_finalize;
Packit Service 963350
}