summaryrefslogtreecommitdiff
path: root/libs/audiographer
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-02-16 21:25:54 +0100
committerRobin Gareus <robin@gareus.org>2016-02-16 21:25:54 +0100
commit0ce4113dbb698c72fb5c5fd1fccfafbfb0e539f2 (patch)
tree48425312dfb11f211eac51c576dab7f4f4beacc7 /libs/audiographer
parent31442cd63d6ff311b4fcf65e82d2797c0031ab53 (diff)
prepare threshold for silence trim
Diffstat (limited to 'libs/audiographer')
-rw-r--r--libs/audiographer/audiographer/general/silence_trimmer.h25
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