diff options
author | Robin Gareus <robin@gareus.org> | 2016-02-16 21:25:54 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-02-16 21:25:54 +0100 |
commit | 0ce4113dbb698c72fb5c5fd1fccfafbfb0e539f2 (patch) | |
tree | 48425312dfb11f211eac51c576dab7f4f4beacc7 | |
parent | 31442cd63d6ff311b4fcf65e82d2797c0031ab53 (diff) |
prepare threshold for silence trim
-rw-r--r-- | libs/audiographer/audiographer/general/silence_trimmer.h | 25 |
1 files 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<typename T> struct SilenceTester; + +// this needs to be implemented for every datatype T +// currently Ardour always uses Sample aka float +template <> +struct SilenceTester<float> { + 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<typename T = DefaultSampleType> 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<T>::EndOfInput); @@ -231,7 +250,7 @@ class /*LIBAUDIOGRAPHER_API*/ SilenceTrimmer bool find_first_non_zero_sample (ProcessContext<T> const & c, framecnt_t & result_frame) { for (framecnt_t i = 0; i < c.frames(); ++i) { - if (c.data()[i] != static_cast<T>(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<T> tester; }; } // namespace |