#pragma once #include #include #include #include #include "../AudioInput.h" #include "../AudioReframer.h" namespace tc::audio { class AudioInput; namespace filter { class Filter; } struct AudioInputBufferInfo; namespace recorder { class AudioFilterWrapper; class AudioRecorderWrapper; enum FilterMode { BYPASS, FILTER, BLOCK }; /* FIXME: Rechunk audio data to 20ms with the input frame rate (that's what we need for networking stuff) */ class AudioConsumerWrapper : public Nan::ObjectWrap { friend class AudioRecorderWrapper; public: static NAN_MODULE_INIT(Init); static NAN_METHOD(NewInstance); static inline Nan::Persistent & constructor() { static Nan::Persistent my_constructor; return my_constructor; } static inline Nan::Persistent & constructor_template() { static Nan::Persistent my_constructor_template; return my_constructor_template; } AudioConsumerWrapper(const std::shared_ptr& /* input */); ~AudioConsumerWrapper() override; static NAN_METHOD(_get_filters); static NAN_METHOD(_unregister_filter); static NAN_METHOD(_create_filter_vad); static NAN_METHOD(_create_filter_threshold); static NAN_METHOD(_create_filter_state); static NAN_METHOD(_get_filter_mode); static NAN_METHOD(_set_filter_mode); std::shared_ptr create_filter(const std::string& /* name */, const std::shared_ptr& /* filter impl */); void delete_filter(const AudioFilterWrapper*); inline std::deque> filters() { std::lock_guard lock(this->filter_mutex_); return this->filter_; } [[nodiscard]] inline auto channel_count() const { return this->channel_count_; }; [[nodiscard]] inline auto sample_rate() const { return this->sample_rate_; }; [[nodiscard]] inline FilterMode filter_mode() const { return this->filter_mode_; } std::mutex native_read_callback_lock; std::function native_read_callback; private: struct InputConsumer : public AudioInputConsumer { std::mutex wrapper_mutex{}; AudioConsumerWrapper* wrapper{nullptr}; void handle_buffer(const AudioInputBufferInfo &, const float *) override; }; std::shared_ptr consumer_handle{}; size_t const channel_count_; size_t const sample_rate_; Nan::JavaScriptQueue js_queue; std::mutex filter_mutex_; std::deque> filter_; FilterMode filter_mode_{FilterMode::FILTER}; bool last_consumed = false; void do_wrap(const v8::Local& /* object */); void delete_consumer(); void handle_buffer(const AudioInputBufferInfo& /* info */, const float* /* buffer */); Nan::callback_t<> _call_ended; Nan::callback_t<> _call_started; }; } }