/* GStreamer
 *
 * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
 *
 * gstcontrolsource.h: Interface declaration for control sources
 *
 * 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
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_CONTROL_SOURCE_H__
#define __GST_CONTROL_SOURCE_H__

#include <gst/gstconfig.h>

#include <glib-object.h>

#include <gst/gstclock.h>

G_BEGIN_DECLS

#define GST_TYPE_CONTROL_SOURCE \
  (gst_control_source_get_type())
#define GST_CONTROL_SOURCE(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CONTROL_SOURCE,GstControlSource))
#define GST_CONTROL_SOURCE_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CONTROL_SOURCE,GstControlSourceClass))
#define GST_IS_CONTROL_SOURCE(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CONTROL_SOURCE))
#define GST_IS_CONTROL_SOURCE_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CONTROL_SOURCE))
#define GST_CONTROL_SOURCE_GET_CLASS(obj) \
  (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CONTOL_SOURCE, GstControlSourceClass))

typedef struct _GstControlSource GstControlSource;
typedef struct _GstControlSourceClass GstControlSourceClass;
typedef struct _GstTimedValue GstTimedValue;
typedef struct _GstValueArray GstValueArray;

/**
 * GstTimedValue:
 * @timestamp: timestamp of the value change
 * @value: the corresponding value
 *
 * Structure for saving a timestamp and a value.
 */
struct _GstTimedValue
{
  GstClockTime timestamp;
  gdouble      value;
};

/**
 * GstControlSourceGetValue:
 * @self: the #GstControlSource instance
 * @timestamp: timestamp for which a value should be calculated
 * @value: a value which will be set to the result.
 *
 * Function for returning a value for a given timestamp.
 *
 * Returns: %TRUE if the value was successfully calculated.
 *
 */
typedef gboolean (* GstControlSourceGetValue) (GstControlSource *self, 
    GstClockTime timestamp, gdouble *value);

/**
 * GstControlSourceGetValueArray:
 * @self: the #GstControlSource instance
 * @timestamp: timestamp for which a value should be calculated
 * @interval: the time spacing between subsequent values
 * @n_values: the number of values
 * @values: array to put control-values in
 *
 * Function for returning an array of values for starting at a given timestamp.
 *
 * Returns: %TRUE if the values were successfully calculated.
 *
 */
typedef gboolean (* GstControlSourceGetValueArray) (GstControlSource *self, 
    GstClockTime timestamp, GstClockTime interval, guint n_values, gdouble *values);

/**
 * GstControlSource:
 * @get_value: Function for returning a value for a given timestamp
 * @get_value_array: Function for returning a values array for a given timestamp
 *
 * The instance structure of #GstControlSource.
 */
struct _GstControlSource {
  GstObject parent;

  /*< public >*/
  GstControlSourceGetValue get_value;             /* Returns the value for a property at a given timestamp */
  GstControlSourceGetValueArray get_value_array;  /* Returns values for a property in a given timespan */

  /*< private >*/
  gpointer _gst_reserved[GST_PADDING];
};

/**
 * GstControlSourceClass:
 * @parent_class: Parent class
 *
 * The class structure of #GstControlSource.
 */

struct _GstControlSourceClass
{
  GstObjectClass parent_class;

  /*< private >*/
  gpointer _gst_reserved[GST_PADDING];
};

GType gst_control_source_get_type (void);

/* Functions */
gboolean       gst_control_source_get_value             (GstControlSource *self, GstClockTime timestamp,
                                                         gdouble *value);
gboolean       gst_control_source_get_value_array       (GstControlSource *self, GstClockTime timestamp,
                                                         GstClockTime interval, guint n_values,
                                                         gdouble *values);
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstControlSource, gst_object_unref)
#endif

#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstValueArray, gst_object_unref)
#endif

G_END_DECLS

#endif /* __GST_CONTROL_SOURCE_H__ */
