From 0ce4113dbb698c72fb5c5fd1fccfafbfb0e539f2 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 16 Feb 2016 21:25:54 +0100 Subject: prepare threshold for silence trim --- .../audiographer/general/silence_trimmer.h | 25 ++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/libs/audiographer/audiographer/general/silence_trimmer.h b/libs/audiographer/audiographer/general/silence_trimmer.h index 7e8d3c485c..889b891737 100644 --- a/libs/audiographer/audiographer/general/silence_trimmer.h +++ b/libs/audiographer/audiographer/general/silence_trimmer.h @@ -12,6 +12,24 @@ namespace AudioGrapher { +template struct SilenceTester; + +// this needs to be implemented for every datatype T +// currently Ardour always uses Sample aka float +template <> +struct SilenceTester { + public: + SilenceTester (const float dB) { + threshold = dB > -318.8f ? pow (10.0f, dB * 0.05f) : 0.0f; + } + bool is_silent (const float d) { + return fabsf (d) <= threshold; + } + private: + float threshold; +}; + + /// Removes and adds silent frames to beginning and/or end of stream template class /*LIBAUDIOGRAPHER_API*/ SilenceTrimmer @@ -23,9 +41,10 @@ class /*LIBAUDIOGRAPHER_API*/ SilenceTrimmer public: /// Constructor, \see reset() \n Not RT safe - SilenceTrimmer(framecnt_t silence_buffer_size_ = 1024) + SilenceTrimmer(framecnt_t silence_buffer_size_ = 1024, float thresh_dB = -INFINITY) : silence_buffer_size (0) , silence_buffer (0) + , tester (thresh_dB) { reset (silence_buffer_size_); add_supported_flag (ProcessContext::EndOfInput); @@ -231,7 +250,7 @@ class /*LIBAUDIOGRAPHER_API*/ SilenceTrimmer bool find_first_non_zero_sample (ProcessContext const & c, framecnt_t & result_frame) { for (framecnt_t i = 0; i < c.frames(); ++i) { - if (c.data()[i] != static_cast(0.0)) { + if (!tester.is_silent (c.data()[i])) { result_frame = i; // Round down to nearest interleaved "frame" beginning result_frame -= result_frame % c.channels(); @@ -284,6 +303,8 @@ class /*LIBAUDIOGRAPHER_API*/ SilenceTrimmer framecnt_t silence_buffer_size; T * silence_buffer; + + SilenceTester tester; }; } // namespace -- cgit v1.2.3