Merged with trunk R1612.
[ardour.git] / libs / ardour / mix.cc
index 6d268dfeba34f30d71fe9392486f745aeee3c9f9..2d31c8ccc89fa0b5ab433d384c05b792a2dc9f05 100644 (file)
@@ -1,6 +1,5 @@
 /*
-    Copyright (C) 2000-2005 Paul Davis,
-       Copyright (C) 2005 Sampo Savolainen
+    Copyright (C) 2000-2005 Paul Davis
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <cmath>
 #include <ardour/types.h>
 #include <ardour/utils.h>
 #include <ardour/mix.h>
+#include <stdint.h>
 
 #if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS)
-
 // Debug wrappers
 
 float
-debug_compute_peak (ARDOUR::Sample *buf, jack_nframes_t nsamples, float current) 
+debug_compute_peak (ARDOUR::Sample *buf, nframes_t nsamples, float current) 
 {
-       if ( ((int)buf % 16) != 0) {
+       if ( ((intptr_t)buf % 16) != 0) {
                cerr << "compute_peak(): buffer unaligned!" << endl;
        }
 
@@ -39,9 +37,9 @@ debug_compute_peak (ARDOUR::Sample *buf, jack_nframes_t nsamples, float current)
 }
 
 void
-debug_apply_gain_to_buffer (ARDOUR::Sample *buf, jack_nframes_t nframes, float gain)
+debug_apply_gain_to_buffer (ARDOUR::Sample *buf, nframes_t nframes, float gain)
 {
-       if ( ((int)buf % 16) != 0) {
+       if ( ((intptr_t)buf % 16) != 0) {
                cerr << "apply_gain_to_buffer(): buffer unaligned!" << endl;
        }
 
@@ -49,13 +47,13 @@ debug_apply_gain_to_buffer (ARDOUR::Sample *buf, jack_nframes_t nframes, float g
 }
 
 void
-debug_mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes, float gain)
+debug_mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes, float gain)
 {
-       if ( ((int)dst & 15) != 0) {
+       if ( ((intptr_t)dst & 15) != 0) {
                cerr << "mix_buffers_with_gain(): dst unaligned!" << endl;
        }
 
-       if ( ((int)dst & 15) != ((int)src & 15) ) {
+       if ( ((intptr_t)dst & 15) != ((intptr_t)src & 15) ) {
                cerr << "mix_buffers_with_gain(): dst & src don't have the same alignment!" << endl;
                mix_buffers_with_gain(dst, src, nframes, gain);
        } else {
@@ -64,13 +62,13 @@ debug_mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nfra
 }
 
 void
-debug_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes)
+debug_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes)
 {
-       if ( ((int)dst & 15) != 0) {
+       if ( ((intptr_t)dst & 15) != 0) {
                cerr << "mix_buffers_no_gain(): dst unaligned!" << endl;
        }
 
-       if ( ((int)dst & 15) != ((int)src & 15) ) {
+       if ( ((intptr_t)dst & 15) != ((intptr_t)src & 15) ) {
                cerr << "mix_buffers_no_gain(): dst & src don't have the same alignment!" << endl;
                mix_buffers_no_gain(dst, src, nframes);
        } else {
@@ -82,9 +80,9 @@ debug_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframe
 
 
 float
-compute_peak (ARDOUR::Sample *buf, jack_nframes_t nsamples, float current) 
+compute_peak (ARDOUR::Sample *buf, nframes_t nsamples, float current) 
 {
-       for (jack_nframes_t i = 0; i < nsamples; ++i) {
+       for (nframes_t i = 0; i < nsamples; ++i) {
                current = f_max (current, fabsf (buf[i]));
        }
 
@@ -92,52 +90,79 @@ compute_peak (ARDOUR::Sample *buf, jack_nframes_t nsamples, float current)
 }      
 
 void
-apply_gain_to_buffer (ARDOUR::Sample *buf, jack_nframes_t nframes, float gain)
+find_peaks (ARDOUR::Sample *buf, nframes_t nframes, float *min, float *max)
+{
+       nframes_t i;
+       float a, b;
+
+       a = *max;
+       b = *min;
+
+       for (i = 0; i < nframes; i++) 
+       {
+               a = fmax (buf[i], a);
+               b = fmin (buf[i], b);
+       }
+
+       *max = a;
+       *min = b;
+}
+
+void
+apply_gain_to_buffer (ARDOUR::Sample *buf, nframes_t nframes, float gain)
 {              
-       for (jack_nframes_t i=0; i<nframes; i++)
+       for (nframes_t i=0; i<nframes; i++)
                buf[i] *= gain;
 }
 
 void
-mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes, float gain)
+mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes, float gain)
 {
-       for (jack_nframes_t i = 0; i < nframes; i++) {
+       for (nframes_t i = 0; i < nframes; i++) {
                dst[i] += src[i] * gain;
        }
 }
 
 void
-mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes)
+mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes)
 {
-       for (jack_nframes_t i=0; i < nframes; i++) {
+       for (nframes_t i=0; i < nframes; i++) {
                dst[i] += src[i];
        }
 }
 
-#if defined (__APPLE__)
+#if defined (__APPLE__) && defined (BUILD_VECLIB_OPTIMIZATIONS)
 #include <Accelerate/Accelerate.h>
 
 float
-veclib_compute_peak (ARDOUR::Sample *buf, jack_nframes_t nsamples, float current)
+veclib_compute_peak (ARDOUR::Sample *buf, nframes_t nsamples, float current)
+{
+       float tmpmax = 0.0f;
+        vDSP_maxmgv(buf, 1, &tmpmax, nsamples);
+        return f_max(current, tmpmax);
+}
+
+void
+veclib_find_peaks (ARDOUR::Sample *buf, nframes_t nframes, float *min, float *max)
 {
-        vDSP_maxv(buf, 1, &current, nsamples);
-        return current;
+       vDSP_maxv (buf, 1, max, nframes);
+       vDSP_minv (buf, 1, min, nframes);
 }
 
 void
-veclib_apply_gain_to_buffer (ARDOUR::Sample *buf, jack_nframes_t nframes, float gain)
+veclib_apply_gain_to_buffer (ARDOUR::Sample *buf, nframes_t nframes, float gain)
 {
         vDSP_vsmul(buf, 1, &gain, buf, 1, nframes);
 }
 
 void
-veclib_mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes, float gain)
+veclib_mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes, float gain)
 {
         vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes);
 }
 
 void
-veclib_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes)
+veclib_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes)
 {
         // It seems that a vector mult only operation does not exist...
         float gain = 1.0f;