mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-18 16:30:29 +00:00
Merge pull request #830 from TomHarte/MSXCrash
Restores audio to multimachines
This commit is contained in:
commit
671f48dc10
@ -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<int16_t> &buffer) {
|
void MultiSpeaker::speaker_did_complete_samples(Speaker *speaker, const std::vector<int16_t> &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_);
|
std::lock_guard lock_guard(front_speaker_mutex_);
|
||||||
if(speaker != front_speaker_) return;
|
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) {
|
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_);
|
std::lock_guard lock_guard(front_speaker_mutex_);
|
||||||
if(speaker != front_speaker_) return;
|
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) {
|
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_);
|
std::lock_guard lock_guard(front_speaker_mutex_);
|
||||||
front_speaker_ = machine->audio_producer()->get_speaker();
|
front_speaker_ = machine->audio_producer()->get_speaker();
|
||||||
}
|
}
|
||||||
if(delegate_) {
|
auto delegate = delegate_.load(std::memory_order::memory_order_relaxed);
|
||||||
delegate_->speaker_did_change_input_clock(this);
|
if(delegate) {
|
||||||
|
delegate->speaker_did_change_input_clock(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.
|
// Below is the standard Outputs::Speaker::Speaker interface; see there for documentation.
|
||||||
float get_ideal_clock_rate_in_range(float minimum, float maximum) override;
|
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_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;
|
bool get_is_stereo() override;
|
||||||
void set_output_volume(float) override;
|
void set_output_volume(float) override;
|
||||||
|
|
||||||
@ -51,7 +50,6 @@ class MultiSpeaker: public Outputs::Speaker::Speaker, Outputs::Speaker::Speaker:
|
|||||||
|
|
||||||
std::vector<Outputs::Speaker::Speaker *> speakers_;
|
std::vector<Outputs::Speaker::Speaker *> speakers_;
|
||||||
Outputs::Speaker::Speaker *front_speaker_ = nullptr;
|
Outputs::Speaker::Speaker *front_speaker_ = nullptr;
|
||||||
Outputs::Speaker::Speaker::Delegate *delegate_ = nullptr;
|
|
||||||
std::mutex front_speaker_mutex_;
|
std::mutex front_speaker_mutex_;
|
||||||
|
|
||||||
bool stereo_output_ = false;
|
bool stereo_output_ = false;
|
||||||
|
@ -131,7 +131,7 @@ template <typename SampleSource> class LowpassSpeaker: public Speaker {
|
|||||||
at construction, filtering it and passing it on to the speaker's delegate if there is one.
|
at construction, filtering it and passing it on to the speaker's delegate if there is one.
|
||||||
*/
|
*/
|
||||||
void run_for(const Cycles cycles) {
|
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;
|
if(!delegate) return;
|
||||||
|
|
||||||
const int scale = get_scale();
|
const int scale = get_scale();
|
||||||
|
@ -89,7 +89,7 @@ class Speaker {
|
|||||||
virtual void speaker_did_change_input_clock([[maybe_unused]] Speaker *speaker) {}
|
virtual void speaker_did_change_input_clock([[maybe_unused]] Speaker *speaker) {}
|
||||||
};
|
};
|
||||||
virtual void set_delegate(Delegate *delegate) {
|
virtual void set_delegate(Delegate *delegate) {
|
||||||
delegate_ = delegate;
|
delegate_.store(delegate, std::memory_order::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ class Speaker {
|
|||||||
protected:
|
protected:
|
||||||
void did_complete_samples(Speaker *, const std::vector<int16_t> &buffer, bool is_stereo) {
|
void did_complete_samples(Speaker *, const std::vector<int16_t> &buffer, bool is_stereo) {
|
||||||
// Test the delegate for existence again, as it may have changed.
|
// 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;
|
if(!delegate) return;
|
||||||
|
|
||||||
++completed_sample_sets_;
|
++completed_sample_sets_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user