BizHawk/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS_SoundProvider.cs

53 lines
1.3 KiB
C#

using System;
using System.Runtime.InteropServices;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS
{
unsafe partial class MelonDS : ISoundProvider
{
private readonly SpeexResampler _resampler;
public bool CanProvideAsync => false;
public SyncSoundMode SyncMode => SyncSoundMode.Sync;
public void DiscardSamples()
{
_DiscardSamples();
}
public void GetSamplesAsync(short[] samples)
{
throw new InvalidOperationException();
}
public void GetSamplesSync(out short[] samples, out int nsamp)
{
nsamp = GetSampleCount();
samples = new short[nsamp * 2]; //*2 for stereo sound
fixed (short* data = samples)
{
GetSamples(data, nsamp);
}
// BizHawk requires a sample rate of 44100 Hz.
_resampler.EnqueueSamples(samples, nsamp);
_resampler.GetSamplesSync(out samples, out nsamp);
}
public void SetSyncMode(SyncSoundMode mode)
{
if (mode == SyncSoundMode.Async)
throw new InvalidOperationException();
}
[DllImport(dllPath)]
private static extern int GetSampleCount();
[DllImport(dllPath)]
private static extern void GetSamples(short* data, int count);
[DllImport(dllPath, EntryPoint = "DiscardSamples")]
private static extern void _DiscardSamples();
}
}