#pragma once #include "Filter.h" #include #include #include namespace tc::audio::filter { class VadFilter : public Filter { public: VadFilter(size_t /* channel count */, size_t /* sample rate */, size_t /* frame size */); virtual ~VadFilter(); bool initialize(std::string& /* error */, size_t /* mode */, size_t /* margin frames */); bool process(const void* /* buffer */) override; inline float margin_release_time() { return (float) this->_margin_samples / (float) this->_sample_rate; } inline void set_margin_release_time(float value) { this->_margin_samples = (size_t) ceil((float) this->_sample_rate * value); } inline size_t mode() { return this->_mode; } private: Fvad* _vad_handle = nullptr; size_t _mode = 0; size_t _margin_samples = 0; size_t _margin_processed_samples = 0; std::mutex _buffer_lock; void* _buffer = nullptr; size_t _buffer_size = 0; void cleanup_buffer(); inline void ensure_buffer(size_t length) { if(this->_buffer_size < length) { if(this->_buffer) free(this->_buffer); this->_buffer_size = length; this->_buffer = malloc(this->_buffer_size); } } }; }