From 4a0d4350535ecbf4024fed2989013399027a0598 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 8 Oct 2010 11:49:09 +0200 Subject: [PATCH] volume: Fix unit test failure for the controlled processing functions Going over integer arithmetic will lead to minimal rounding errors, leading to +/-1 changes for volume==1.0. Implement the controlled processing with floating point arithmetic, which was already done for the C versions anyway. --- gst/volume/gstvolume.c | 2 - gst/volume/gstvolumeorc.orc | 112 +++++++++++++++++--------------------------- 2 files changed, 42 insertions(+), 72 deletions(-) diff --git a/gst/volume/gstvolume.c b/gst/volume/gstvolume.c index 6f0ad67..a592707 100644 --- a/gst/volume/gstvolume.c +++ b/gst/volume/gstvolume.c @@ -780,8 +780,6 @@ volume_process_controlled_int8_clamp (GstVolume * self, gpointer bytes, orc_process_controlled_int8_1ch (data, volume, num_samples); } else if (channels == 2) { orc_process_controlled_int8_2ch (data, volume, num_samples); - } else if (channels == 4) { - orc_process_controlled_int8_4ch (data, volume, num_samples); } else { for (i = 0; i < num_samples; i++) { vol = *volume++; diff --git a/gst/volume/gstvolumeorc.orc b/gst/volume/gstvolumeorc.orc index c27389f..aaea6f5 100644 --- a/gst/volume/gstvolumeorc.orc +++ b/gst/volume/gstvolumeorc.orc @@ -112,97 +112,69 @@ x2 mulf d1, d1, t2 .dest 4 d1 gint32 .source 8 s1 gdouble .temp 8 t1 -.temp 4 t2 -muld t1, s1, 0x41E0000000000000L -convdl t2, t1 -mulslq t1, d1, t2 -addq t1, t1, 0x0FFFFFFFL -shrsq t1, t1, 31 -convql d1, t1 +convld t1, d1 +muld t1, t1, s1 +convdl d1, t1 .function orc_process_controlled_int16_1ch .dest 2 d1 gint16 .source 8 s1 gdouble -.temp 8 t1 +.temp 4 t1 .temp 4 t2 -.temp 2 t3 -muld t1, s1, 0x40E0000000000000L -convdl t2, t1 -convssslw t3, t2 -mulswl t2, t3, d1 -addl t2, t2, 0x0FFF -shrsl t2, t2, 15 -convlw d1, t2 +convswl t1, d1 +convlf t1, t1 +convdf t2, s1 +mulf t1, t1, t2 +convfl t1, t1 +convssslw d1, t1 .function orc_process_controlled_int16_2ch .dest 4 d1 gint16 .source 8 s1 gdouble .temp 8 t1 .temp 4 t2 -.temp 2 t3 +.temp 8 t3 -muld t1, s1, 0x40E0000000000000L -convdl t2, t1 -convssslw t3, t2 -mergewl t2, t3, t3 -x2 mulswl t1, t2, d1 -x2 addl t1, t1, 0x0FFF -x2 shrsl t1, t1, 15 -x2 convlw d1, t1 +x2 convswl t1, d1 +x2 convlf t1, t1 +convdf t2, s1 +mergelq t3, t2, t2 +x2 mulf t3, t3, t1 +x2 convfl t3, t3 +x2 convssslw d1, t3 .function orc_process_controlled_int8_1ch .dest 1 d1 gint8 .source 8 s1 gdouble -.temp 8 t1 +.temp 2 t1 .temp 4 t2 -.temp 2 t3 -.temp 1 t4 - -muld t1, s1, 0x4060000000000000L -convdl t2, t1 -convlw t3, t2 -convssswb t4, t3 -mulsbw t3, t4, d1 -addw t3, t3, 0x0F -shrsw t3, t3, 7 -convwb d1, t3 +.temp 4 t3 + +convsbw t1, d1 +convswl t2, t1 +convlf t2, t2 +convdf t3, s1 +mulf t2, t2, t3 +convfl t2, t2 +convlw t1, t2 +convssswb d1, t1 .function orc_process_controlled_int8_2ch .dest 2 d1 gint8 .source 8 s1 gdouble -.temp 8 t1 -.temp 4 t2 -.temp 2 t3 -.temp 1 t4 - -muld t1, s1, 0x4060000000000000L -convdl t2, t1 -convlw t3, t2 -convssswb t4, t3 -mergebw t3, t4, t4 -x2 mulsbw t2, t3, d1 -x2 addw t2, t2, 0x0F -x2 shrsw t2, t2, 7 -x2 convwb d1, t2 - -.function orc_process_controlled_int8_4ch -.dest 4 d1 gint8 -.source 8 s1 gdouble -.temp 8 t1 -.temp 4 t2 -.temp 2 t3 -.temp 1 t4 - -muld t1, s1, 0x4060000000000000L -convdl t2, t1 -convlw t3, t2 -convssswb t4, t3 -mergebw t3, t4, t4 -mergewl t2, t3, t3 -x4 mulsbw t1, t2, d1 -x4 addw t1, t1, 0x0F -x4 shrsw t1, t1, 7 -x4 convwb d1, t1 +.temp 4 t1 +.temp 8 t2 +.temp 8 t3 + +x2 convsbw t1, d1 +x2 convswl t2, t1 +x2 convlf t2, t2 +convdf t1, s1 +mergelq t3, t1, t1 +x2 mulf t2, t2, t3 +x2 convfl t2, t2 +x2 convlw t1, t2 +x2 convssswb d1, t1 -- 2.7.4