diff --git a/Machines/Apple/Macintosh/Audio.cpp b/Machines/Apple/Macintosh/Audio.cpp index a6dac5cd6..fba2c11ea 100644 --- a/Machines/Apple/Macintosh/Audio.cpp +++ b/Machines/Apple/Macintosh/Audio.cpp @@ -25,7 +25,7 @@ Audio::Audio(Concurrency::DeferringAsyncTaskQueue &task_queue) : task_queue_(tas void Audio::post_sample(uint8_t sample) { // Store sample directly indexed by current write pointer; this ensures that collected samples // directly map to volume and enabled/disabled states. - sample_queue_.buffer[sample_queue_.write_pointer] = sample; + sample_queue_.buffer[sample_queue_.write_pointer].store(sample, std::memory_order::memory_order_relaxed); sample_queue_.write_pointer = (sample_queue_.write_pointer + 1) % sample_queue_.buffer.size(); } @@ -80,7 +80,7 @@ void Audio::get_samples(std::size_t number_of_samples, int16_t *target) { // Determine the output level, and output that many samples. // (Hoping that the copiler substitutes an effective memset16-type operation here). - const int16_t output_level = volume_multiplier_ * (int16_t(sample_queue_.buffer[sample_queue_.read_pointer]) - 128); + const int16_t output_level = volume_multiplier_ * (int16_t(sample_queue_.buffer[sample_queue_.read_pointer].load(std::memory_order::memory_order_relaxed)) - 128); for(size_t c = 0; c < cycles_left_in_sample; ++c) { target[c] = output_level; } diff --git a/Machines/Apple/Macintosh/Audio.hpp b/Machines/Apple/Macintosh/Audio.hpp index 3d8f5835d..a0ae25a80 100644 --- a/Machines/Apple/Macintosh/Audio.hpp +++ b/Machines/Apple/Macintosh/Audio.hpp @@ -63,7 +63,7 @@ class Audio: public ::Outputs::Speaker::SampleSource { // A queue of fetched samples; read from by one thread, // written to by another. struct { - std::array buffer; + std::array, 740> buffer; size_t read_pointer = 0, write_pointer = 0; } sample_queue_;