From 40f4daffd12b84dceb23942a992815e11b5a0839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 5 Mar 2015 12:31:06 +0100 Subject: [PATCH] volume: Explicitly cast integers to doubles and then back to integers after multiplication gcc 4.9.1 on ARM seems to have a bug that causes it to cast the float to an integer first, resulting in a 0 scale factor for volume < 1.0. As a side effect this change here will also improve accuracy of the result a bit because we go via doubles instead of floats. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65325 https://bugzilla.gnome.org/show_bug.cgi?id=745667 --- gst/volume/gstvolume.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/gst/volume/gstvolume.c b/gst/volume/gstvolume.c index 0f5b362ddd..94d03a316f 100644 --- a/gst/volume/gstvolume.c +++ b/gst/volume/gstvolume.c @@ -250,10 +250,14 @@ volume_update_volume (GstVolume * self, const GstAudioInfo * info, self->current_mute = FALSE; self->current_volume = volume; - self->current_vol_i8 = volume * VOLUME_UNITY_INT8; - self->current_vol_i16 = volume * VOLUME_UNITY_INT16; - self->current_vol_i24 = volume * VOLUME_UNITY_INT24; - self->current_vol_i32 = volume * VOLUME_UNITY_INT32; + self->current_vol_i8 = + (gint) ((gdouble) volume * (gdouble) VOLUME_UNITY_INT8); + self->current_vol_i16 = + (gint) ((gdouble) volume * (gdouble) VOLUME_UNITY_INT16); + self->current_vol_i24 = + (gint) ((gdouble) volume * (gdouble) VOLUME_UNITY_INT24); + self->current_vol_i32 = + (gint) ((gdouble) volume * (gdouble) VOLUME_UNITY_INT32); passthrough = (self->current_vol_i16 == VOLUME_UNITY_INT16); }