Expose methods for some object properties so that subclasses can more easily configure them.

Original commit message from CVS:
* docs/libs/gst-plugins-base-libs-sections.txt:
* gst-libs/gst/audio/gstbaseaudiosink.c: (slave_method_get_type),
(gst_base_audio_sink_set_provide_clock),
(gst_base_audio_sink_get_provide_clock),
(gst_base_audio_sink_set_slave_method),
(gst_base_audio_sink_get_slave_method),
(gst_base_audio_sink_set_property),
(gst_base_audio_sink_get_property), (gst_base_audio_sink_drain),
(gst_base_audio_sink_none_slaving),
(gst_base_audio_sink_handle_slaving):
* gst-libs/gst/audio/gstbaseaudiosink.h:
Expose methods for some object properties so that subclasses can more
easily configure them.
Added slave method none, that completely disables slaving to the
internal clock.
API: gst_base_audio_sink_set_provide_clock()
API: gst_base_audio_sink_get_provide_clock()
API: gst_base_audio_sink_set_slave_method()
API: gst_base_audio_sink_get_slave_method()
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_set_provide_clock),
(gst_base_audio_src_get_provide_clock),
(gst_base_audio_src_set_property),
(gst_base_audio_src_get_property), (gst_base_audio_src_create):
* gst-libs/gst/audio/gstbaseaudiosrc.h:
Expose methods for some object properties so that subclasses can more
easily configure them.
API: gst_base_audio_src_set_provide_clock()
API: gst_base_audio_src_get_provide_clock()
This commit is contained in:
Wim Taymans 2007-11-21 13:04:17 +00:00
parent d834d1cb48
commit 157a65b15e
6 changed files with 222 additions and 14 deletions

View file

@ -1,3 +1,36 @@
2007-11-21 Wim Taymans <wim.taymans@gmail.com>
* docs/libs/gst-plugins-base-libs-sections.txt:
* gst-libs/gst/audio/gstbaseaudiosink.c: (slave_method_get_type),
(gst_base_audio_sink_set_provide_clock),
(gst_base_audio_sink_get_provide_clock),
(gst_base_audio_sink_set_slave_method),
(gst_base_audio_sink_get_slave_method),
(gst_base_audio_sink_set_property),
(gst_base_audio_sink_get_property), (gst_base_audio_sink_drain),
(gst_base_audio_sink_none_slaving),
(gst_base_audio_sink_handle_slaving):
* gst-libs/gst/audio/gstbaseaudiosink.h:
Expose methods for some object properties so that subclasses can more
easily configure them.
Added slave method none, that completely disables slaving to the
internal clock.
API: gst_base_audio_sink_set_provide_clock()
API: gst_base_audio_sink_get_provide_clock()
API: gst_base_audio_sink_set_slave_method()
API: gst_base_audio_sink_get_slave_method()
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_set_provide_clock),
(gst_base_audio_src_get_provide_clock),
(gst_base_audio_src_set_property),
(gst_base_audio_src_get_property), (gst_base_audio_src_create):
* gst-libs/gst/audio/gstbaseaudiosrc.h:
Expose methods for some object properties so that subclasses can more
easily configure them.
API: gst_base_audio_src_set_provide_clock()
API: gst_base_audio_src_get_provide_clock()
2007-11-20 Wim Taymans <wim.taymans@gmail.com> 2007-11-20 Wim Taymans <wim.taymans@gmail.com>
Patch by: Joe Peterson <lavajoe at gentoo dot org> Patch by: Joe Peterson <lavajoe at gentoo dot org>

View file

@ -98,6 +98,10 @@ GstBaseAudioSinkSlaveMethod
GST_BASE_AUDIO_SINK_CLOCK GST_BASE_AUDIO_SINK_CLOCK
GST_BASE_AUDIO_SINK_PAD GST_BASE_AUDIO_SINK_PAD
gst_base_audio_sink_create_ringbuffer gst_base_audio_sink_create_ringbuffer
gst_base_audio_sink_set_provide_clock
gst_base_audio_sink_get_provide_clock
gst_base_audio_sink_set_slave_method
gst_base_audio_sink_get_slave_method
<SUBSECTION Standard> <SUBSECTION Standard>
GST_BASE_AUDIO_SINK GST_BASE_AUDIO_SINK
GST_IS_BASE_AUDIO_SINK GST_IS_BASE_AUDIO_SINK
@ -118,6 +122,8 @@ GstBaseAudioSrcClass
GST_BASE_AUDIO_SRC_CLOCK GST_BASE_AUDIO_SRC_CLOCK
GST_BASE_AUDIO_SRC_PAD GST_BASE_AUDIO_SRC_PAD
gst_base_audio_src_create_ringbuffer gst_base_audio_src_create_ringbuffer
gst_base_audio_src_set_provide_clock
gst_base_audio_src_get_provide_clock
<SUBSECTION Standard> <SUBSECTION Standard>
GST_BASE_AUDIO_SRC GST_BASE_AUDIO_SRC
GST_IS_BASE_AUDIO_SRC GST_IS_BASE_AUDIO_SRC

View file

@ -94,6 +94,7 @@ slave_method_get_type (void)
static const GEnumValue slave_method[] = { static const GEnumValue slave_method[] = {
{GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE, "Resampling slaving", "resample"}, {GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE, "Resampling slaving", "resample"},
{GST_BASE_AUDIO_SINK_SLAVE_SKEW, "Skew slaving", "skew"}, {GST_BASE_AUDIO_SINK_SLAVE_SKEW, "Skew slaving", "skew"},
{GST_BASE_AUDIO_SINK_SLAVE_NONE, "No slaving", "none"},
{0, NULL, NULL}, {0, NULL, NULL},
}; };
@ -395,6 +396,97 @@ gst_base_audio_sink_get_time (GstClock * clock, GstBaseAudioSink * sink)
return result; return result;
} }
/**
* gst_base_audio_sink_set_provide_clock:
* @sink: a #GstBaseAudioSink
* @provide: new state
*
* Controls whether @sink will provide a clock or not. If @provide is %TRUE,
* gst_element_provide_clock() will return a clock that reflects the datarate
* of @sink. If @provide is %FALSE, gst_element_provide_clock() will return NULL.
*
* Since: 0.10.16
*/
void
gst_base_audio_sink_set_provide_clock (GstBaseAudioSink * sink,
gboolean provide)
{
g_return_if_fail (GST_IS_BASE_AUDIO_SINK (sink));
GST_OBJECT_LOCK (sink);
sink->provide_clock = provide;
GST_OBJECT_UNLOCK (sink);
}
/**
* gst_base_audio_sink_get_provide_clock:
* @sink: a #GstBaseAudioSink
*
* Queries whether @sink will provide a clock or not. See also
* gst_base_audio_sink_set_provide_clock.
*
* Returns: %TRUE if @sink will provide a clock.
*
* Since: 0.10.16
*/
gboolean
gst_base_audio_sink_get_provide_clock (GstBaseAudioSink * sink)
{
gboolean result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_SINK (sink), FALSE);
GST_OBJECT_LOCK (sink);
result = sink->provide_clock;
GST_OBJECT_UNLOCK (sink);
return result;
}
/**
* gst_base_audio_sink_set_slave_method:
* @sink: a #GstBaseAudioSink
* @method: the new slave method
*
* Controls how clock slaving will be performed in @sink.
*
* Since: 0.10.16
*/
void
gst_base_audio_sink_set_slave_method (GstBaseAudioSink * sink,
GstBaseAudioSinkSlaveMethod method)
{
g_return_if_fail (GST_IS_BASE_AUDIO_SINK (sink));
GST_OBJECT_LOCK (sink);
sink->priv->slave_method = method;
GST_OBJECT_UNLOCK (sink);
}
/**
* gst_base_audio_sink_get_slave_method:
* @sink: a #GstBaseAudioSink
*
* Get the current slave method used by @sink.
*
* Returns: The current slave method used by @sink.
*
* Since: 0.10.16
*/
GstBaseAudioSinkSlaveMethod
gst_base_audio_sink_get_slave_method (GstBaseAudioSink * sink)
{
GstBaseAudioSinkSlaveMethod result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_SINK (sink), -1);
GST_OBJECT_LOCK (sink);
result = sink->priv->slave_method;
GST_OBJECT_UNLOCK (sink);
return result;
}
static void static void
gst_base_audio_sink_set_property (GObject * object, guint prop_id, gst_base_audio_sink_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec) const GValue * value, GParamSpec * pspec)
@ -411,12 +503,10 @@ gst_base_audio_sink_set_property (GObject * object, guint prop_id,
sink->latency_time = g_value_get_int64 (value); sink->latency_time = g_value_get_int64 (value);
break; break;
case PROP_PROVIDE_CLOCK: case PROP_PROVIDE_CLOCK:
GST_OBJECT_LOCK (sink); gst_base_audio_sink_set_provide_clock (sink, g_value_get_boolean (value));
sink->provide_clock = g_value_get_boolean (value);
GST_OBJECT_UNLOCK (sink);
break; break;
case PROP_SLAVE_METHOD: case PROP_SLAVE_METHOD:
sink->priv->slave_method = g_value_get_enum (value); gst_base_audio_sink_set_slave_method (sink, g_value_get_enum (value));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -440,12 +530,10 @@ gst_base_audio_sink_get_property (GObject * object, guint prop_id,
g_value_set_int64 (value, sink->latency_time); g_value_set_int64 (value, sink->latency_time);
break; break;
case PROP_PROVIDE_CLOCK: case PROP_PROVIDE_CLOCK:
GST_OBJECT_LOCK (sink); g_value_set_boolean (value, gst_base_audio_sink_get_provide_clock (sink));
g_value_set_boolean (value, sink->provide_clock);
GST_OBJECT_UNLOCK (sink);
break; break;
case PROP_SLAVE_METHOD: case PROP_SLAVE_METHOD:
g_value_set_enum (value, sink->priv->slave_method); g_value_set_enum (value, gst_base_audio_sink_get_slave_method (sink));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -842,6 +930,28 @@ gst_base_audio_sink_skew_slaving (GstBaseAudioSink * sink,
*srender_stop = render_stop; *srender_stop = render_stop;
} }
/* apply the clock offset but do no slaving otherwise */
static void
gst_base_audio_sink_none_slaving (GstBaseAudioSink * sink,
GstClockTime render_start, GstClockTime render_stop,
GstClockTime * srender_start, GstClockTime * srender_stop)
{
GstClockTime cinternal, cexternal, crate_num, crate_denom;
/* get calibration parameters to compensate for offsets */
gst_clock_get_calibration (sink->provided_clock, &cinternal, &cexternal,
&crate_num, &crate_denom);
/* convert, ignoring speed */
render_start = clock_convert_external (render_start, cinternal, cexternal,
crate_num, crate_denom, sink->priv->us_latency);
render_stop = clock_convert_external (render_stop, cinternal, cexternal,
crate_num, crate_denom, sink->priv->us_latency);
*srender_start = render_start;
*srender_stop = render_stop;
}
/* converts render_start and render_stop to their slaved values */ /* converts render_start and render_stop to their slaved values */
static void static void
gst_base_audio_sink_handle_slaving (GstBaseAudioSink * sink, gst_base_audio_sink_handle_slaving (GstBaseAudioSink * sink,
@ -857,6 +967,10 @@ gst_base_audio_sink_handle_slaving (GstBaseAudioSink * sink,
gst_base_audio_sink_skew_slaving (sink, render_start, render_stop, gst_base_audio_sink_skew_slaving (sink, render_start, render_stop,
srender_start, srender_stop); srender_start, srender_stop);
break; break;
case GST_BASE_AUDIO_SINK_SLAVE_NONE:
gst_base_audio_sink_none_slaving (sink, render_start, render_stop,
srender_start, srender_stop);
break;
default: default:
g_warning ("unknown slaving method %d", sink->priv->slave_method); g_warning ("unknown slaving method %d", sink->priv->slave_method);
break; break;

View file

@ -83,6 +83,7 @@ G_BEGIN_DECLS
* @GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE: Resample to match the master clock * @GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE: Resample to match the master clock
* @GST_BASE_AUDIO_SINK_SLAVE_SKEW: Adjust playout pointer when master clock * @GST_BASE_AUDIO_SINK_SLAVE_SKEW: Adjust playout pointer when master clock
* drifts too much. * drifts too much.
* @GST_BASE_AUDIO_SINK_SLAVE_NONE: No adjustment is done.
* *
* Different possible clock slaving algorithms * Different possible clock slaving algorithms
*/ */
@ -90,6 +91,7 @@ typedef enum
{ {
GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE, GST_BASE_AUDIO_SINK_SLAVE_RESAMPLE,
GST_BASE_AUDIO_SINK_SLAVE_SKEW, GST_BASE_AUDIO_SINK_SLAVE_SKEW,
GST_BASE_AUDIO_SINK_SLAVE_NONE
} GstBaseAudioSinkSlaveMethod; } GstBaseAudioSinkSlaveMethod;
typedef struct _GstBaseAudioSink GstBaseAudioSink; typedef struct _GstBaseAudioSink GstBaseAudioSink;
@ -147,6 +149,14 @@ GType gst_base_audio_sink_get_type(void);
GstRingBuffer *gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink *sink); GstRingBuffer *gst_base_audio_sink_create_ringbuffer (GstBaseAudioSink *sink);
void gst_base_audio_sink_set_provide_clock (GstBaseAudioSink *sink, gboolean provide);
gboolean gst_base_audio_sink_get_provide_clock (GstBaseAudioSink *sink);
void gst_base_audio_sink_set_slave_method (GstBaseAudioSink *sink,
GstBaseAudioSinkSlaveMethod method);
GstBaseAudioSinkSlaveMethod
gst_base_audio_sink_get_slave_method (GstBaseAudioSink *sink);
G_END_DECLS G_END_DECLS
#endif /* __GST_BASE_AUDIO_SINK_H__ */ #endif /* __GST_BASE_AUDIO_SINK_H__ */

View file

@ -288,6 +288,52 @@ gst_base_audio_src_check_get_range (GstBaseSrc * bsrc)
return TRUE; return TRUE;
} }
/**
* gst_base_audio_src_set_provide_clock:
* @src: a #GstBaseAudioSrc
* @provide: new state
*
* Controls whether @src will provide a clock or not. If @provide is %TRUE,
* gst_element_provide_clock() will return a clock that reflects the datarate
* of @src. If @provide is %FALSE, gst_element_provide_clock() will return NULL.
*
* Since: 0.10.16
*/
void
gst_base_audio_src_set_provide_clock (GstBaseAudioSrc * src, gboolean provide)
{
g_return_if_fail (GST_IS_BASE_AUDIO_SRC (src));
GST_OBJECT_LOCK (src);
src->priv->provide_clock = provide;
GST_OBJECT_UNLOCK (src);
}
/**
* gst_base_audio_src_get_provide_clock:
* @src: a #GstBaseAudioSrc
*
* Queries whether @src will provide a clock or not. See also
* gst_base_audio_src_set_provide_clock.
*
* Returns: %TRUE if @src will provide a clock.
*
* Since: 0.10.16
*/
gboolean
gst_base_audio_src_get_provide_clock (GstBaseAudioSrc * src)
{
gboolean result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_SRC (src), FALSE);
GST_OBJECT_LOCK (src);
result = src->priv->provide_clock;
GST_OBJECT_UNLOCK (src);
return result;
}
static void static void
gst_base_audio_src_set_property (GObject * object, guint prop_id, gst_base_audio_src_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec) const GValue * value, GParamSpec * pspec)
@ -304,9 +350,7 @@ gst_base_audio_src_set_property (GObject * object, guint prop_id,
src->latency_time = g_value_get_int64 (value); src->latency_time = g_value_get_int64 (value);
break; break;
case PROP_PROVIDE_CLOCK: case PROP_PROVIDE_CLOCK:
GST_OBJECT_LOCK (src); gst_base_audio_src_set_provide_clock (src, g_value_get_boolean (value));
src->priv->provide_clock = g_value_get_boolean (value);
GST_OBJECT_UNLOCK (src);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -330,9 +374,7 @@ gst_base_audio_src_get_property (GObject * object, guint prop_id,
g_value_set_int64 (value, src->latency_time); g_value_set_int64 (value, src->latency_time);
break; break;
case PROP_PROVIDE_CLOCK: case PROP_PROVIDE_CLOCK:
GST_OBJECT_LOCK (src); g_value_set_boolean (value, gst_base_audio_src_get_provide_clock (src));
g_value_set_boolean (value, src->priv->provide_clock);
GST_OBJECT_UNLOCK (src);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);

View file

@ -109,6 +109,9 @@ GType gst_base_audio_src_get_type(void);
GstRingBuffer *gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc *src); GstRingBuffer *gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc *src);
void gst_base_audio_src_set_provide_clock (GstBaseAudioSrc *src, gboolean provide);
gboolean gst_base_audio_src_get_provide_clock (GstBaseAudioSrc *src);
G_END_DECLS G_END_DECLS
#endif /* __GST_BASE_AUDIO_SRC_H__ */ #endif /* __GST_BASE_AUDIO_SRC_H__ */