APU fully implemented and working but approx 0.25s latency to fix
This commit is contained in:
49
Desktop/NAudioPlayer.cs
Normal file
49
Desktop/NAudioPlayer.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using Core.Interfaces;
|
||||
using Microsoft.VisualBasic;
|
||||
using NAudio.Wave;
|
||||
|
||||
namespace Desktop.Audio // Change this to match your project's namespace
|
||||
{
|
||||
public class NAudioPlayer : IAudioDevice
|
||||
{
|
||||
private WaveOutEvent _waveOut;
|
||||
private BufferedWaveProvider _buffer;
|
||||
|
||||
public NAudioPlayer()
|
||||
{
|
||||
// Set up the audio format: 44100 Hz, 32-bit IEEE float, 1 channel (Mono)
|
||||
WaveFormat format = WaveFormat.CreateIeeeFloatWaveFormat(44100, 1);
|
||||
|
||||
_buffer = new BufferedWaveProvider(format);
|
||||
|
||||
// CRITICAL FOR EMULATORS:
|
||||
// If the emulator runs slightly too fast, the audio buffer will fill up
|
||||
// and the sound will lag behind the gameplay. Discarding overflow keeps it synced!
|
||||
_buffer.DiscardOnBufferOverflow = true;
|
||||
|
||||
_waveOut = new WaveOutEvent();
|
||||
|
||||
// 100ms latency is a great sweet spot for WinForms emulators.
|
||||
// Too low = crackling audio. Too high = delayed sound effects.
|
||||
_waveOut.DesiredLatency = 100;
|
||||
_waveOut.Init(_buffer);
|
||||
_waveOut.Play();
|
||||
}
|
||||
|
||||
public void AddSample(float sample)
|
||||
{
|
||||
// Convert the float (-1.0f to 1.0f) into 4 raw bytes
|
||||
byte[] sampleBytes = BitConverter.GetBytes(sample);
|
||||
|
||||
// Push the 4 bytes to the sound card buffer!
|
||||
_buffer.AddSamples(sampleBytes, 0, 4);
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
_waveOut?.Stop();
|
||||
_waveOut?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user