X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmix.cc;h=96ae62448703a9d0406cc8e7eee91939a353782a;hb=8b93fb02f38148c25c91ed41a4f12735be38dbf0;hp=c6e234d87bb4997b33e375c89496e6b89328a148;hpb=79986643c0c904f6574bb5323e2233a43a9e622e;p=ardour.git diff --git a/libs/ardour/mix.cc b/libs/ardour/mix.cc index c6e234d87b..96ae624487 100644 --- a/libs/ardour/mix.cc +++ b/libs/ardour/mix.cc @@ -15,48 +15,51 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include -#include -#include -#include +#include "ardour/types.h" +#include "ardour/utils.h" +#include "ardour/mix.h" +#include "ardour/runtime_functions.h" #include -#if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS) +using std::min; +using std::max; +using namespace ARDOUR; +#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 (const ARDOUR::Sample *buf, pframes_t nsamples, float current) { if ( ((intptr_t)buf % 16) != 0) { - cerr << "compute_peak(): buffer unaligned!" << endl; + std::cerr << "compute_peak(): buffer unaligned!" << std::endl; } return x86_sse_compute_peak(buf, nsamples, current); } void -debug_apply_gain_to_buffer (ARDOUR::Sample *buf, jack_nframes_t nframes, float gain) +debug_apply_gain_to_buffer (ARDOUR::Sample *buf, pframes_t nframes, float gain) { if ( ((intptr_t)buf % 16) != 0) { - cerr << "apply_gain_to_buffer(): buffer unaligned!" << endl; + std::cerr << "apply_gain_to_buffer(): buffer unaligned!" << std::endl; } x86_sse_apply_gain_to_buffer(buf, nframes, gain); } 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, const ARDOUR::Sample *src, pframes_t nframes, float gain) { if ( ((intptr_t)dst & 15) != 0) { - cerr << "mix_buffers_with_gain(): dst unaligned!" << endl; + std::cerr << "mix_buffers_with_gain(): dst unaligned!" << std::endl; } if ( ((intptr_t)dst & 15) != ((intptr_t)src & 15) ) { - cerr << "mix_buffers_with_gain(): dst & src don't have the same alignment!" << endl; + std::cerr << "mix_buffers_with_gain(): dst & src don't have the same alignment!" << std::endl; mix_buffers_with_gain(dst, src, nframes, gain); } else { x86_sse_mix_buffers_with_gain(dst, src, nframes, gain); @@ -64,14 +67,14 @@ 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, const ARDOUR::Sample *src, pframes_t nframes) { if ( ((intptr_t)dst & 15) != 0) { - cerr << "mix_buffers_no_gain(): dst unaligned!" << endl; + std::cerr << "mix_buffers_no_gain(): dst unaligned!" << std::endl; } if ( ((intptr_t)dst & 15) != ((intptr_t)src & 15) ) { - cerr << "mix_buffers_no_gain(): dst & src don't have the same alignment!" << endl; + std::cerr << "mix_buffers_no_gain(): dst & src don't have the same alignment!" << std::endl; mix_buffers_no_gain(dst, src, nframes); } else { x86_sse_mix_buffers_no_gain(dst, src, nframes); @@ -82,69 +85,101 @@ 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) +default_compute_peak (const ARDOUR::Sample * buf, pframes_t nsamples, float current) { - for (jack_nframes_t i = 0; i < nsamples; ++i) { + for (pframes_t i = 0; i < nsamples; ++i) { current = f_max (current, fabsf (buf[i])); } return current; -} +} + +void +default_find_peaks (const ARDOUR::Sample * buf, pframes_t nframes, float *minf, float *maxf) +{ + pframes_t i; + float a, b; + + a = *maxf; + b = *minf; + + for (i = 0; i < nframes; i++) + { + a = max (buf[i], a); + b = min (buf[i], b); + } + + *maxf = a; + *minf = b; +} void -apply_gain_to_buffer (ARDOUR::Sample *buf, jack_nframes_t nframes, float gain) -{ - for (jack_nframes_t i=0; i float -veclib_compute_peak (ARDOUR::Sample *buf, jack_nframes_t nsamples, float current) +veclib_compute_peak (const ARDOUR::Sample * buf, pframes_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_apply_gain_to_buffer (ARDOUR::Sample *buf, jack_nframes_t nframes, float gain) +veclib_find_peaks (const ARDOUR::Sample * buf, pframes_t nframes, float *min, float *max) { - vDSP_vsmul(buf, 1, &gain, buf, 1, nframes); + vDSP_maxv (const_cast(buf), 1, max, nframes); + vDSP_minv (const_cast(buf), 1, min, nframes); } void -veclib_mix_buffers_with_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes, float gain) +veclib_apply_gain_to_buffer (ARDOUR::Sample * buf, pframes_t nframes, float gain) { - vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); + vDSP_vsmul(buf, 1, &gain, buf, 1, nframes); } void -veclib_mix_buffers_no_gain (ARDOUR::Sample *dst, ARDOUR::Sample *src, jack_nframes_t nframes) +veclib_mix_buffers_with_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, pframes_t nframes, float gain) { - // 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); + vDSP_vsma(src, 1, &gain, dst, 1, dst, 1, nframes); +} + +void +veclib_mix_buffers_no_gain (ARDOUR::Sample * dst, const ARDOUR::Sample * src, pframes_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); } #endif - +