using NAudio.Wave; using Core.Interfaces; using System; namespace Desktop { public class BeeperDevice : IAudioDevice { private WaveOutEvent _waveOut; private BufferedWaveProvider _buffer; private float _lastSample = 0.0f; private float _lastFiltered = 0.0f; public BeeperDevice() { _waveOut = new WaveOutEvent(); _waveOut.DesiredLatency = 50; // 100ms latency to prevent buffer stutter // 44.1kHz, 1 channel (Mono), Float format _buffer = new BufferedWaveProvider(WaveFormat.CreateIeeeFloatWaveFormat(44100, 1)); _buffer.BufferDuration = TimeSpan.FromSeconds(1); _buffer.DiscardOnBufferOverflow = true; _waveOut.Init(_buffer); _waveOut.Play(); } public void AddSample(bool isHigh) { //Buffer overrun check and dump while (_buffer.BufferedDuration.TotalMilliseconds > 80) { Thread.Sleep(1); } // Convert the boolean into a physical sound wave (-0.2 or +0.2) float rawSample = isHigh ? 0.2f : -0.2f; float filteredSample = rawSample - _lastSample + 0.995f * _lastFiltered; _lastSample = rawSample; _lastFiltered = filteredSample; // Convert the float to bytes and drop it in the pipe byte[] bytes = BitConverter.GetBytes(filteredSample); _buffer.AddSamples(bytes, 0, 4); } } }