From d0be122fc67f7da7899f439b88c9b788e9010dc9 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max.kellermann@gmail.com>
Date: Mon, 23 Jan 2023 13:40:49 +0100
Subject: [PATCH] output/osx: use class RingBuffer instead of
 boost::lockfree::spsc_queue

---
 src/output/plugins/OSXOutputPlugin.cxx | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/output/plugins/OSXOutputPlugin.cxx b/src/output/plugins/OSXOutputPlugin.cxx
index 17f3dd04c..1cd614784 100644
--- a/src/output/plugins/OSXOutputPlugin.cxx
+++ b/src/output/plugins/OSXOutputPlugin.cxx
@@ -33,6 +33,7 @@
 #include "thread/Cond.hxx"
 #include "util/ByteOrder.hxx"
 #include "util/CharUtil.hxx"
+#include "util/RingBuffer.hxx"
 #include "util/StringAPI.hxx"
 #include "util/StringBuffer.hxx"
 #include "util/StringFormat.hxx"
@@ -42,7 +43,6 @@
 #include <AudioUnit/AudioUnit.h>
 #include <AudioToolbox/AudioToolbox.h>
 #include <CoreServices/CoreServices.h>
-#include <boost/lockfree/spsc_queue.hpp>
 
 #include <memory>
 #include <span>
@@ -105,7 +105,8 @@ struct OSXOutput final : AudioOutput {
 	AudioComponentInstance au;
 	AudioStreamBasicDescription asbd;
 
-	boost::lockfree::spsc_queue<std::byte> *ring_buffer;
+	using RingBuffer = ::RingBuffer<std::byte>;
+	RingBuffer ring_buffer;
 
 	OSXOutput(const ConfigBlock &block);
 
@@ -628,8 +629,7 @@ osx_render(void *vdata,
 
 	int count = in_number_frames * od->asbd.mBytesPerFrame;
 	buffer_list->mBuffers[0].mDataByteSize =
-		od->ring_buffer->pop((std::byte *)buffer_list->mBuffers[0].mData,
-				     count);
+		od->ring_buffer.ReadTo({(std::byte *)buffer_list->mBuffers[0].mData, count});
 	return noErr;
 }
 
@@ -687,7 +687,7 @@ OSXOutput::Close() noexcept
 	if (started)
 		AudioOutputUnitStop(au);
 	AudioUnitUninitialize(au);
-	delete ring_buffer;
+	ring_buffer = {};
 }
 
 void
@@ -772,7 +772,7 @@ OSXOutput::Open(AudioFormat &audio_format)
 						   MPD_OSX_BUFFER_TIME_MS * pcm_export->GetOutputFrameSize() * asbd.mSampleRate / 1000);
 	}
 #endif
-	ring_buffer = new boost::lockfree::spsc_queue<std::byte>(ring_buffer_size);
+	ring_buffer = RingBuffer{ring_buffer_size};
 
 	pause = false;
 	started = false;
@@ -793,7 +793,7 @@ OSXOutput::Play(std::span<const std::byte> input)
 	}
 #endif
 
-	size_t bytes_written = ring_buffer->push(input.data(), input.size());
+	size_t bytes_written = ring_buffer->WriteFrom(input);
 
 	if (!started) {
 		OSStatus status = AudioOutputUnitStart(au);
@@ -814,7 +814,7 @@ OSXOutput::Play(std::span<const std::byte> input)
 std::chrono::steady_clock::duration
 OSXOutput::Delay() const noexcept
 {
-	return ring_buffer->write_available() && !pause
+	return !ring_buffer.IsFull() && !pause
 		? std::chrono::steady_clock::duration::zero()
 		: std::chrono::milliseconds(MPD_OSX_BUFFER_TIME_MS / 4);
 }
@@ -839,7 +839,7 @@ OSXOutput::Cancel() noexcept
 		started = false;
 	}
 
-	ring_buffer->reset();
+	ring_buffer.Clear();
 #ifdef ENABLE_DSD
 	pcm_export->Reset();
 #endif