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 block_length_.in (units::samples) *num_channels, 0.f);
72 std::vector<float> input_buf (
73 block_length_.in (units::samples) *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)
80 + (
static_cast<size_t> (ch) * block_length_.in (units::samples));
83 + (
static_cast<size_t> (ch) * block_length_.in (units::samples));
87 !stoken.stop_requested ()
88 && is_running_.load (std::memory_order_acquire))
90 auto * cb = callback_.load (std::memory_order_acquire);
94 input_ptrs.data (), num_channels, output_ptrs.data (),
95 num_channels, block_length_.in<
int> (units::samples));
96 process_call_count_.fetch_add (1, std::memory_order_acq_rel);
98 auto sleep_us =
static_cast<int64_t
> (
99 block_length_.in<
double> (units::samples) * 1'000'000.0
100 / sample_rate_.in (units::sample_rate));
101 std::this_thread::sleep_for (std::chrono::microseconds (sleep_us));