/* GStreamer
 * Copyright (C) 2005 Stefan Kost <ensonic@users.sf.net>
 *
 * 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_AUDIO_TEST_SRC_H__
#define __GST_AUDIO_TEST_SRC_H__


#include <gst/gst.h>
#include <gst/base/gstbasesrc.h>

#include <gst/audio/audio.h>

G_BEGIN_DECLS


#define GST_TYPE_AUDIO_TEST_SRC \
  (gst_audio_test_src_get_type())
#define GST_AUDIO_TEST_SRC(obj) \
  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_TEST_SRC,GstAudioTestSrc))
#define GST_AUDIO_TEST_SRC_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_TEST_SRC,GstAudioTestSrcClass))
#define GST_IS_AUDIO_TEST_SRC(obj) \
  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_TEST_SRC))
#define GST_IS_AUDIO_TEST_SRC_CLASS(klass) \
  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_TEST_SRC))

/**
 * GstAudioTestSrcWave:
 * @GST_AUDIO_TEST_SRC_WAVE_SINE: a sine wave
 * @GST_AUDIO_TEST_SRC_WAVE_SQUARE: a square wave
 * @GST_AUDIO_TEST_SRC_WAVE_SAW: a saw wave
 * @GST_AUDIO_TEST_SRC_WAVE_TRIANGLE: a tringle wave
 * @GST_AUDIO_TEST_SRC_WAVE_SILENCE: silence
 * @GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE: white uniform noise
 * @GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE: pink noise
 * @GST_AUDIO_TEST_SRC_WAVE_SINE_TAB: sine wave using a table
 * @GST_AUDIO_TEST_SRC_WAVE_TICKS: periodic ticks
 * @GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE: white (zero mean) Gaussian noise;  volume sets the standard deviation of the noise in units of the range of values of the sample type, e.g. volume=0.1 produces noise with a standard deviation of 0.1*32767=3277 with 16-bit integer samples, or 0.1*1.0=0.1 with floating-point samples.
 * @GST_AUDIO_TEST_SRC_WAVE_RED_NOISE: red (brownian) noise
 * @GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE: spectraly inverted pink noise
 * @GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE: spectraly inverted red (brownian) noise
 *
 * Different types of supported sound waves.
 */
typedef enum {
  GST_AUDIO_TEST_SRC_WAVE_SINE,
  GST_AUDIO_TEST_SRC_WAVE_SQUARE,
  GST_AUDIO_TEST_SRC_WAVE_SAW,
  GST_AUDIO_TEST_SRC_WAVE_TRIANGLE,
  GST_AUDIO_TEST_SRC_WAVE_SILENCE,
  GST_AUDIO_TEST_SRC_WAVE_WHITE_NOISE,
  GST_AUDIO_TEST_SRC_WAVE_PINK_NOISE,
  GST_AUDIO_TEST_SRC_WAVE_SINE_TAB,
  GST_AUDIO_TEST_SRC_WAVE_TICKS,
  GST_AUDIO_TEST_SRC_WAVE_GAUSSIAN_WHITE_NOISE,
  GST_AUDIO_TEST_SRC_WAVE_RED_NOISE,
  GST_AUDIO_TEST_SRC_WAVE_BLUE_NOISE,
  GST_AUDIO_TEST_SRC_WAVE_VIOLET_NOISE
} GstAudioTestSrcWave;

#define PINK_MAX_RANDOM_ROWS   (30)
#define PINK_RANDOM_BITS       (16)
#define PINK_RANDOM_SHIFT      ((sizeof(long)*8)-PINK_RANDOM_BITS)

typedef struct {
  glong      rows[PINK_MAX_RANDOM_ROWS];
  glong      running_sum;   /* Used to optimize summing of generators. */
  gint       index;         /* Incremented each sample. */
  gint       index_mask;    /* Index wrapped by ANDing with this mask. */
  gdouble    scalar;        /* Used to scale within range of -1.0 to +1.0 */
} GstPinkNoise;

typedef struct {
  gdouble    state;         /* noise state */
} GstRedNoise;

typedef struct _GstAudioTestSrc GstAudioTestSrc;
typedef struct _GstAudioTestSrcClass GstAudioTestSrcClass;

typedef void (*ProcessFunc) (GstAudioTestSrc*, guint8 *);

/**
 * GstAudioTestSrc:
 *
 * audiotestsrc object structure.
 */
struct _GstAudioTestSrc {
  GstBaseSrc parent;

  ProcessFunc process;
  GstAudioFormatPack pack_func;
  gint pack_size;
  gpointer tmp;
  gsize tmpsize;

  /* parameters */
  GstAudioTestSrcWave wave;
  gdouble volume;
  gdouble freq;

  /* audio parameters */
  GstAudioInfo info;
  gint samples_per_buffer;

  /*< private >*/
  gboolean tags_pushed;			/* send tags just once ? */
  GstClockTimeDiff timestamp_offset;    /* base offset */
  GstClockTime next_time;               /* next timestamp */
  gint64 next_sample;                   /* next sample to send */
  gint64 next_byte;                     /* next byte to send */
  gint64 sample_stop;
  gboolean check_seek_stop;
  gboolean eos_reached;
  gint generate_samples_per_buffer;	/* used to generate a partial buffer */
  gboolean can_activate_pull;
  gboolean reverse;                  /* play backwards */

  /* waveform specific context data */
  GRand *gen;               /* random number generator */
  gdouble accumulator;			/* phase angle */
  GstPinkNoise pink;
  GstRedNoise red;
  gdouble wave_table[1024];
};

struct _GstAudioTestSrcClass {
  GstBaseSrcClass parent_class;
};

GType gst_audio_test_src_get_type (void);

G_END_DECLS

#endif /* __GST_AUDIO_TEST_SRC_H__ */
