- dparams api changes

Original commit message from CVS:
- dparams api changes
- use a bufferpool
- reinstate freq and volume as element properties
This commit is contained in:
Steve Baker 2002-04-14 10:29:35 +00:00
parent c5dbaef236
commit 434bc836ce
3 changed files with 22 additions and 15 deletions

View File

@ -68,7 +68,9 @@ int main(int argc,char *argv[]) {
gst_bin_add(GST_BIN(thread),sinesrc); gst_bin_add(GST_BIN(thread),sinesrc);
gst_bin_add(GST_BIN(thread),osssink); gst_bin_add(GST_BIN(thread),osssink);
gst_element_connect(sinesrc,osssink); gst_element_connect(sinesrc,osssink);
g_object_set(G_OBJECT(osssink),"fragment",0x00180008,NULL); /* this breaks with current alsa oss compat lib
g_object_set(G_OBJECT(osssink),"fragment",0x00180008,NULL);*/
g_object_set(G_OBJECT(sinesrc),"buffersize",64,NULL); g_object_set(G_OBJECT(sinesrc),"buffersize",64,NULL);
dpman = gst_dpman_get_manager (sinesrc); dpman = gst_dpman_get_manager (sinesrc);

View File

@ -85,7 +85,7 @@ static void gst_sinesrc_get_property (GObject *object, guint prop_id,
/*static void gst_sinesrc_close_audio(GstSineSrc *src); */ /*static void gst_sinesrc_close_audio(GstSineSrc *src); */
/*static gboolean gst_sinesrc_open_audio(GstSineSrc *src); */ /*static gboolean gst_sinesrc_open_audio(GstSineSrc *src); */
static void gst_sinesrc_update_freq(GValue *value, gpointer data); static void gst_sinesrc_update_freq(const GValue *value, gpointer data);
static void gst_sinesrc_populate_sinetable (GstSineSrc *src); static void gst_sinesrc_populate_sinetable (GstSineSrc *src);
static inline void gst_sinesrc_update_table_inc (GstSineSrc *src); static inline void gst_sinesrc_update_table_inc (GstSineSrc *src);
static void gst_sinesrc_force_caps (GstSineSrc *src); static void gst_sinesrc_force_caps (GstSineSrc *src);
@ -143,7 +143,7 @@ gst_sinesrc_class_init (GstSineSrcClass *klass)
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FREQ, g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FREQ,
g_param_spec_float("freq","freq","freq", g_param_spec_float("freq","freq","freq",
0.0, 20000.0, 440.0, G_PARAM_READWRITE)); 0.0, 20000.0, 440.0, G_PARAM_READWRITE));
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FREQ, g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_VOLUME,
g_param_spec_float("volume","volume","volume", g_param_spec_float("volume","volume","volume",
0.0, 1.0, 0.8, G_PARAM_READWRITE)); 0.0, 1.0, 0.8, G_PARAM_READWRITE));
@ -172,6 +172,7 @@ gst_sinesrc_init (GstSineSrc *src)
src->table_size = 1024; src->table_size = 1024;
src->buffer_size=1024; src->buffer_size=1024;
src->timestamp=0LL; src->timestamp=0LL;
src->bufpool=NULL;
src->seq = 0; src->seq = 0;
@ -181,8 +182,7 @@ gst_sinesrc_init (GstSineSrc *src)
src->dpman, src->dpman,
g_param_spec_float("freq","Frequency (Hz)","Frequency of the tone", g_param_spec_float("freq","Frequency (Hz)","Frequency of the tone",
10.0, 10000.0, 350.0, G_PARAM_READWRITE), 10.0, 10000.0, 350.0, G_PARAM_READWRITE),
TRUE, "hertz",
FALSE,
gst_sinesrc_update_freq, gst_sinesrc_update_freq,
src src
); );
@ -191,8 +191,7 @@ gst_sinesrc_init (GstSineSrc *src)
src->dpman, src->dpman,
g_param_spec_float("volume","Volume","Volume of the tone", g_param_spec_float("volume","Volume","Volume of the tone",
0.0, 1.0, 0.8, G_PARAM_READWRITE), 0.0, 1.0, 0.8, G_PARAM_READWRITE),
FALSE, "scalar",
FALSE,
&(src->volume) &(src->volume)
); );
@ -215,16 +214,20 @@ gst_sinesrc_get(GstPad *pad)
g_return_val_if_fail (pad != NULL, NULL); g_return_val_if_fail (pad != NULL, NULL);
src = GST_SINESRC(gst_pad_get_parent (pad)); src = GST_SINESRC(gst_pad_get_parent (pad));
buf = gst_buffer_new(); if (src->bufpool == NULL) {
g_return_val_if_fail (buf, NULL); src->bufpool = gst_buffer_pool_get_default (2 * src->buffer_size, 8);
samples = g_new(gint16, src->buffer_size); }
buf = (GstBuffer *) gst_buffer_new_from_pool (src->bufpool, 0, 0);
GST_BUFFER_TIMESTAMP(buf) = src->timestamp;
samples = (gint16*)GST_BUFFER_DATA(buf);
GST_BUFFER_DATA(buf) = (gpointer) samples; GST_BUFFER_DATA(buf) = (gpointer) samples;
GST_BUFFER_SIZE(buf) = 2 * src->buffer_size;
frame_countdown = GST_DPMAN_PREPROCESS(src->dpman, src->buffer_size, src->timestamp); frame_countdown = GST_DPMAN_PREPROCESS(src->dpman, src->buffer_size, src->timestamp);
src->timestamp += (gint64)src->buffer_size * 1000000000LL / (gint64)src->samplerate; src->timestamp += src->buffer_size * 10^9 / src->samplerate;
while(GST_DPMAN_PROCESS_COUNTDOWN(src->dpman, frame_countdown, i)) { while(GST_DPMAN_PROCESS_COUNTDOWN(src->dpman, frame_countdown, i)) {
src->table_lookup = (gint)(src->table_pos); src->table_lookup = (gint)(src->table_pos);
@ -255,6 +258,7 @@ gst_sinesrc_get(GstPad *pad)
)* src->volume * 32767.0; )* src->volume * 32767.0;
} }
if (src->newcaps) { if (src->newcaps) {
gst_sinesrc_force_caps(src); gst_sinesrc_force_caps(src);
} }
@ -290,7 +294,7 @@ gst_sinesrc_set_property (GObject *object, guint prop_id, const GValue *value, G
break; break;
case ARG_FREQ: case ARG_FREQ:
gst_dpman_bypass_dparam(src->dpman, "freq"); gst_dpman_bypass_dparam(src->dpman, "freq");
src->freq = g_value_get_float (value); gst_sinesrc_update_freq(value, src);
break; break;
case ARG_VOLUME: case ARG_VOLUME:
gst_dpman_bypass_dparam(src->dpman, "volume"); gst_dpman_bypass_dparam(src->dpman, "volume");
@ -374,7 +378,7 @@ gst_sinesrc_populate_sinetable (GstSineSrc *src)
} }
static void static void
gst_sinesrc_update_freq(GValue *value, gpointer data) gst_sinesrc_update_freq(const GValue *value, gpointer data)
{ {
GstSineSrc *src = (GstSineSrc*)data; GstSineSrc *src = (GstSineSrc*)data;
g_return_if_fail(GST_IS_SINESRC(src)); g_return_if_fail(GST_IS_SINESRC(src));

View File

@ -78,6 +78,7 @@ struct _GstSineSrc {
gulong seq; gulong seq;
gint64 timestamp; gint64 timestamp;
GstBufferPool *bufpool;
gboolean newcaps; gboolean newcaps;