Files
ParsonsMasterSystem2026/Parsons.Steamdeck/RaylibAudioPlayer.cs
2026-06-04 22:01:45 +01:00

37 lines
1.1 KiB
C#

using Core.Interfaces;
using System.Collections.Concurrent;
namespace Parsons.SteamDeck
{
public class RaylibAudioPlayer : IAudioDevice
{
private ConcurrentQueue<float> _sampleQueue = new ConcurrentQueue<float>();
// 4096 samples provides a perfect ~90ms safety buffer
private const int MaxBufferSamples = 4096;
public void AddSample(float sample)
{
_sampleQueue.Enqueue(sample);
// THE FIX: If the CPU outpaces the soundcard, drop the OLDEST sample!
// This guarantees we never fall behind and the audio stays perfectly synced.
if (_sampleQueue.Count > MaxBufferSamples)
{
_sampleQueue.TryDequeue(out _);
}
}
// Grab absolutely everything we generated this frame
public float[] GetQueuedSamples()
{
int count = _sampleQueue.Count;
float[] buffer = new float[count];
for (int i = 0; i < count; i++)
{
_sampleQueue.TryDequeue(out buffer[i]);
}
return buffer;
}
}
}