X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmix.cc;h=726d3754530fc0c765806424a7a79feed968f0c8;hb=8e73c9ee80c260c58698894332f08769e9f1ac22;hp=6b7755e4989be051f6538978e123e1a6138cf875;hpb=93c7aeba048f19df5abee5e4325ef8b0ef62c279;p=ardour.git diff --git a/libs/ardour/mix.cc b/libs/ardour/mix.cc index 6b7755e498..726d375453 100644 --- a/libs/ardour/mix.cc +++ b/libs/ardour/mix.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -24,8 +23,9 @@ #include #include -#if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS) +using namespace ARDOUR; +#if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS) // Debug wrappers float @@ -82,7 +82,7 @@ debug_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t n float -compute_peak (ARDOUR::Sample *buf, nframes_t nsamples, float current) +default_compute_peak (const ARDOUR::Sample * buf, nframes_t nsamples, float current) { for (nframes_t i = 0; i < nsamples; ++i) { current = f_max (current, fabsf (buf[i])); @@ -92,14 +92,33 @@ compute_peak (ARDOUR::Sample *buf, nframes_t nsamples, float current) } void -apply_gain_to_buffer (ARDOUR::Sample *buf, nframes_t nframes, float gain) +default_find_peaks (const 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 +default_apply_gain_to_buffer (ARDOUR::Sample * buf, nframes_t nframes, float gain) { for (nframes_t i=0; i float -veclib_compute_peak (ARDOUR::Sample *buf, nframes_t nsamples, float current) +veclib_compute_peak (const ARDOUR::Sample * buf, nframes_t nsamples, float current) { float tmpmax = 0.0f; - vDSP_maxmgv(buf, 1, &tmpmax, nsamples); - return f_max(current, tmpmax); + vDSP_maxmgv(buf, 1, &tmpmax, nsamples); + return f_max(current, tmpmax); +} + +void +veclib_find_peaks (const ARDOUR::Sample * buf, nframes_t nframes, float *min, float *max) +{ + vDSP_maxv (const_cast(buf), 1, max, nframes); + vDSP_minv (const_cast(buf), 1, min, nframes); } void -veclib_apply_gain_to_buffer (ARDOUR::Sample *buf, 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); + vDSP_vsmul(buf, 1, &gain, buf, 1, nframes); } void -veclib_mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes, float gain) +veclib_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, nframes_t nframes, float gain) { - vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); + vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); } void -veclib_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, nframes_t nframes) +veclib_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, nframes_t nframes) { - // It seems that a vector mult only operation does not exist... - float gain = 1.0f; - vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); + // It seems that a vector mult only operation does not exist... + float gain = 1.0f; + vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); } #endif