From de658b70d760da7a949d59277e79e3c42152e8d1 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 7 Oct 2016 17:02:36 -0400 Subject: [PATCH] That's thread safety, subject to the async task queue being made to work... --- Machines/Electron/Electron.cpp | 13 +++++++++---- Machines/Electron/Electron.hpp | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Machines/Electron/Electron.cpp b/Machines/Electron/Electron.cpp index d96f4d0da..69917f4f6 100644 --- a/Machines/Electron/Electron.cpp +++ b/Machines/Electron/Electron.cpp @@ -226,10 +226,11 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin // update speaker mode bool new_speaker_is_enabled = (*value & 6) == 2; - if(new_speaker_is_enabled != _speaker->get_is_enabled()) + if(new_speaker_is_enabled != speaker_is_enabled_) { update_audio(); _speaker->set_is_enabled(new_speaker_is_enabled); + speaker_is_enabled_ = new_speaker_is_enabled; } _tape.set_is_enabled((*value & 6) != 6); @@ -958,13 +959,17 @@ void Speaker::skip_samples(unsigned int number_of_samples) void Speaker::set_divider(uint8_t divider) { - _divider = divider * 32 / clock_rate_audio_divider; + enqueue([=]() { + _divider = divider * 32 / clock_rate_audio_divider; + }); } void Speaker::set_is_enabled(bool is_enabled) { - _is_enabled = is_enabled; - _counter = 0; + enqueue([=]() { + _is_enabled = is_enabled; + _counter = 0; + }); } /* diff --git a/Machines/Electron/Electron.hpp b/Machines/Electron/Electron.hpp index 7b88f775a..e2659146e 100644 --- a/Machines/Electron/Electron.hpp +++ b/Machines/Electron/Electron.hpp @@ -121,7 +121,6 @@ class Speaker: public ::Outputs::Filter { void set_divider(uint8_t divider); void set_is_enabled(bool is_enabled); - inline bool get_is_enabled() { return _is_enabled; } void get_samples(unsigned int number_of_samples, int16_t *target); void skip_samples(unsigned int number_of_samples); @@ -238,6 +237,7 @@ class Machine: // Outputs std::shared_ptr _crt; std::shared_ptr _speaker; + bool speaker_is_enabled_; }; }