TeaSpeak-Client/native/serverconnection/src/audio/filter/FilterVad.h

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);
}
}
};
}