43 lines
1.4 KiB
C++
43 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include "Filter.h"
|
|
#include <cmath>
|
|
#include <mutex>
|
|
#include <fvad.h>
|
|
|
|
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);
|
|
}
|
|
}
|
|
};
|
|
} |