57 auto * old_cb = callback_.load (std::memory_order_acquire);
58 if (old_cb !=
nullptr)
62 if (callback !=
nullptr)
64 callback_.store (callback, std::memory_order_release);
67 is_running_.store (
true, std::memory_order_release);
68 callback_thread_ = std::jthread ([
this] (std::stop_token stoken) {
69 constexpr int num_channels = 2;
70 std::vector<float> output_buf (
71 static_cast<size_t> (block_length_) * num_channels, 0.f);
72 std::vector<float> input_buf (
73 static_cast<size_t> (block_length_) * num_channels, 0.f);
74 std::vector<float *> output_ptrs (num_channels);
75 std::vector<const float *> input_ptrs (num_channels);
76 for (
int ch = 0; ch < num_channels; ++ch)
79 output_buf.data () +
static_cast<size_t> (ch) * block_length_;
81 input_buf.data () +
static_cast<size_t> (ch) * block_length_;
85 !stoken.stop_requested ()
86 && is_running_.load (std::memory_order_acquire))
88 auto * cb = callback_.load (std::memory_order_acquire);
92 input_ptrs.data (), num_channels, output_ptrs.data (),
93 num_channels,
static_cast<int> (block_length_));
94 process_call_count_.fetch_add (1, std::memory_order_acq_rel);
96 auto sleep_us =
static_cast<int64_t
> (
97 static_cast<double> (block_length_) * 1'000'000.0
98 / sample_rate_.in (units::sample_rate));
99 std::this_thread::sleep_for (std::chrono::microseconds (sleep_us));