48 lines
1.5 KiB
C#
48 lines
1.5 KiB
C#
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);
|
|
}
|
|
}
|
|
} |