diff --git a/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.cpp b/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.cpp index 445036baa..af84345d1 100644 --- a/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.cpp +++ b/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.cpp @@ -60,12 +60,9 @@ void MultiSpeaker::set_output_volume(float volume) { } } -void MultiSpeaker::set_delegate(Outputs::Speaker::Speaker::Delegate *delegate) { - delegate_ = delegate; -} - void MultiSpeaker::speaker_did_complete_samples(Speaker *speaker, const std::vector &buffer) { - if(!delegate_) return; + auto delegate = delegate_.load(std::memory_order::memory_order_relaxed); + if(!delegate) return; { std::lock_guard lock_guard(front_speaker_mutex_); if(speaker != front_speaker_) return; @@ -74,12 +71,13 @@ void MultiSpeaker::speaker_did_complete_samples(Speaker *speaker, const std::vec } void MultiSpeaker::speaker_did_change_input_clock(Speaker *speaker) { - if(!delegate_) return; + auto delegate = delegate_.load(std::memory_order::memory_order_relaxed); + if(!delegate) return; { std::lock_guard lock_guard(front_speaker_mutex_); if(speaker != front_speaker_) return; } - delegate_->speaker_did_change_input_clock(this); + delegate->speaker_did_change_input_clock(this); } void MultiSpeaker::set_new_front_machine(::Machine::DynamicMachine *machine) { @@ -87,7 +85,8 @@ void MultiSpeaker::set_new_front_machine(::Machine::DynamicMachine *machine) { std::lock_guard lock_guard(front_speaker_mutex_); front_speaker_ = machine->audio_producer()->get_speaker(); } - if(delegate_) { - delegate_->speaker_did_change_input_clock(this); + auto delegate = delegate_.load(std::memory_order::memory_order_relaxed); + if(delegate) { + delegate->speaker_did_change_input_clock(this); } } diff --git a/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.hpp b/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.hpp index f48bc639c..e5946da1a 100644 --- a/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.hpp +++ b/Analyser/Dynamic/MultiMachine/Implementation/MultiSpeaker.hpp @@ -40,7 +40,6 @@ class MultiSpeaker: public Outputs::Speaker::Speaker, Outputs::Speaker::Speaker: // Below is the standard Outputs::Speaker::Speaker interface; see there for documentation. float get_ideal_clock_rate_in_range(float minimum, float maximum) override; void set_computed_output_rate(float cycles_per_second, int buffer_size, bool stereo) override; - void set_delegate(Outputs::Speaker::Speaker::Delegate *delegate) override; bool get_is_stereo() override; void set_output_volume(float) override; @@ -51,7 +50,6 @@ class MultiSpeaker: public Outputs::Speaker::Speaker, Outputs::Speaker::Speaker: std::vector speakers_; Outputs::Speaker::Speaker *front_speaker_ = nullptr; - Outputs::Speaker::Speaker::Delegate *delegate_ = nullptr; std::mutex front_speaker_mutex_; bool stereo_output_ = false; diff --git a/Outputs/Speaker/Implementation/LowpassSpeaker.hpp b/Outputs/Speaker/Implementation/LowpassSpeaker.hpp index 8d67c6f13..d446f3f9f 100644 --- a/Outputs/Speaker/Implementation/LowpassSpeaker.hpp +++ b/Outputs/Speaker/Implementation/LowpassSpeaker.hpp @@ -131,7 +131,7 @@ template class LowpassSpeaker: public Speaker { at construction, filtering it and passing it on to the speaker's delegate if there is one. */ void run_for(const Cycles cycles) { - const auto delegate = delegate_.load(); + const auto delegate = delegate_.load(std::memory_order::memory_order_relaxed); if(!delegate) return; const int scale = get_scale(); diff --git a/Outputs/Speaker/Speaker.hpp b/Outputs/Speaker/Speaker.hpp index 875a16032..511b0e337 100644 --- a/Outputs/Speaker/Speaker.hpp +++ b/Outputs/Speaker/Speaker.hpp @@ -89,7 +89,7 @@ class Speaker { virtual void speaker_did_change_input_clock([[maybe_unused]] Speaker *speaker) {} }; virtual void set_delegate(Delegate *delegate) { - delegate_ = delegate; + delegate_.store(delegate, std::memory_order::memory_order_relaxed); } @@ -99,7 +99,7 @@ class Speaker { protected: void did_complete_samples(Speaker *, const std::vector &buffer, bool is_stereo) { // Test the delegate for existence again, as it may have changed. - const auto delegate = delegate_.load(); + const auto delegate = delegate_.load(std::memory_order::memory_order_relaxed); if(!delegate) return; ++completed_sample_sets_;