2008-03-21 Sebastian Dröge <slomo@circular-chaos.org>
+ * gst/volume/gstvolume.c: (gst_volume_interface_supported),
+ (gst_volume_base_init), (gst_volume_class_init),
+ (volume_process_double), (volume_process_float),
+ (volume_transform_ip), (plugin_init):
+ memset buffers to zero if we get a GAP buffer. We usually see a
+ buffer as one unit so let's handle it as one and don't care about
+ volume changes while processing one buffer.
+ Also clean up some stuff a bit.
+
+2008-03-21 Sebastian Dröge <slomo@circular-chaos.org>
+
* gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_init),
(gst_audio_convert_create_silence_buffer),
(gst_audio_convert_transform):
#define GST_CAT_DEFAULT gst_volume_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
-static const GstElementDetails volume_details = GST_ELEMENT_DETAILS ("Volume",
- "Filter/Effect/Audio",
- "Set volume on audio/raw streams",
- "Andy Wingo <wingo@pobox.com>");
-
/* Filter signals and args */
enum
{
static gboolean
gst_volume_interface_supported (GstImplementsInterface * iface, GType type)
{
- g_assert (type == GST_TYPE_MIXER);
+ g_return_val_if_fail (type == GST_TYPE_MIXER, FALSE);
return TRUE;
}
GstAudioFilterClass *filter_class = GST_AUDIO_FILTER_CLASS (g_class);
GstCaps *caps;
- gst_element_class_set_details (element_class, &volume_details);
+ gst_element_class_set_details_simple (element_class, "Volume",
+ "Filter/Effect/Audio",
+ "Set volume on audio/raw streams", "Andy Wingo <wingo@pobox.com>");
caps = gst_caps_from_string (ALLOWED_CAPS);
gst_audio_filter_class_add_pad_templates (filter_class, caps);
0.0, VOLUME_MAX_DOUBLE, 1.0,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
- GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "volume", 0, "Volume gain");
-
trans_class->transform_ip = GST_DEBUG_FUNCPTR (volume_transform_ip);
filter_class->setup = GST_DEBUG_FUNCPTR (volume_setup);
}
gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (this), TRUE);
}
-/* NOTE: although it might be tempting to have volume_process_mute() which uses
- * memset(bytes, 0, nbytes) for the vol=0 case, this has the downside that
- * unmuting would only take place after processing a buffer.
- */
-
static void
volume_process_double (GstVolume * this, gpointer bytes, guint n_bytes)
{
oil_scalarmultiply_f64_ns (data, data, &vol, num_samples);
#else
+ gint i;
+
for (i = 0; i < num_samples; i++) {
*data++ *= this->real_vol_f;
}
gfloat *data = (gfloat *) bytes;
guint num_samples = n_bytes / sizeof (gfloat);
- /*
- guint i;
- for (i = 0; i < num_samples; i++) {
- *data++ *= this->real_vol_f;
- }
- */
- /* time gst-launch 2>/dev/null audiotestsrc wave=7 num-buffers=10000 ! audio/x-raw-float ! volume volume=1.5 ! fakesink
- * goes from 0m0.850s -> 0m0.717s with liboil
+#if 0
+ guint i;
+
+ for (i = 0; i < num_samples; i++) {
+ *data++ *= this->real_vol_f;
+ }
+ /* time "gst-launch 2>/dev/null audiotestsrc wave=7 num-buffers=10000 ! audio/x-raw-float !
+ * volume volume=1.5 ! fakesink" goes from 0m0.850s -> 0m0.717s with liboil
*/
+#endif
oil_scalarmultiply_f32_ns (data, data, &this->real_vol_f, num_samples);
}
#if (G_BYTE_ORDER == G_LITTLE_ENDIAN)
#define get_unaligned_i24(_x) ( (((guint8*)_x)[0]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[2]) << 16) )
-#define write_unaligned_u24(_x,samp) do { *(_x)++ = samp & 0xFF; *(_x)++ = (samp >> 8) & 0xFF; *(_x)++ = (samp >> 16) & 0xFF; } while (0)
+
+#define write_unaligned_u24(_x,samp) \
+G_STMT_START { \
+ *(_x)++ = samp & 0xFF; \
+ *(_x)++ = (samp >> 8) & 0xFF; \
+ *(_x)++ = (samp >> 16) & 0xFF; \
+} G_STMT_END
+
#else /* BIG ENDIAN */
#define get_unaligned_i24(_x) ( (((guint8*)_x)[2]) | ((((guint8*)_x)[1]) << 8) | ((((gint8*)_x)[0]) << 16) )
-#define write_unaligned_u24(_x,samp) do { *(_x)++ = (samp >> 16) & 0xFF; *(_x)++ = (samp >> 8) & 0xFF; *(_x)++ = samp & 0xFF; } while (0)
+#define write_unaligned_u24(_x,samp) \
+G_STMT_START { \
+ *(_x)++ = (samp >> 16) & 0xFF; \
+ *(_x)++ = (samp >> 8) & 0xFF; \
+ *(_x)++ = samp & 0xFF; \
+} G_STMT_END
#endif
static void
GST_BUFFER_FLAG_IS_SET (outbuf, GST_BUFFER_FLAG_GAP))
return GST_FLOW_OK;
- if (this->real_vol_f == 0.0)
+ if (this->real_vol_f == 0.0) {
this->silent_buffer = TRUE;
-
- this->process (this, GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf));
+ memset (GST_BUFFER_DATA (outbuf), 0, GST_BUFFER_SIZE (outbuf));
+ } else if (this->real_vol_f != 1.0) {
+ this->process (this, GST_BUFFER_DATA (outbuf), GST_BUFFER_SIZE (outbuf));
+ }
if (this->silent_buffer)
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_GAP);
/* initialize gst controller library */
gst_controller_init (NULL, NULL);
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "volume", 0, "Volume gain");
+
return gst_element_register (plugin, "volume", GST_RANK_NONE,
GST_TYPE_VOLUME);
}