/* 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., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, 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 #GValue which will be set to the result. It must be initialized to the correct type.
 *
 * 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 #GstValueArray 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
 * @bind: Class method for binding the #GstControlSource to a specific GParamSpec
 *
 * 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);
G_END_DECLS

#endif /* __GST_CONTROL_SOURCE_H__ */
