using System;
namespace BizHawk.Emulation.Common
{
public static class Metaspu
{
public static ISynchronizingAudioBuffer MetaspuConstruct(ESynchMethod method)
{
switch (method)
{
case ESynchMethod.Zeromus:
return new ZeromusSynchronizer();
case ESynchMethod.Nitsuja:
return new NitsujaSynchronizer();
case ESynchMethod.Vecna:
return new VecnaSynchronizer();
default:
return new NitsujaSynchronizer();
}
}
}
///
/// uses to provide async sound to an that does not provide its own async implementation
///
public class MetaspuAsyncSoundProvider : ISoundProvider
{
private readonly ISynchronizingAudioBuffer _buffer;
private readonly ISoundProvider _input;
public MetaspuAsyncSoundProvider(ISoundProvider input, ESynchMethod method)
{
input.SetSyncMode(SyncSoundMode.Sync);
_buffer = Metaspu.MetaspuConstruct(method);
_input = input;
}
public void GetSamplesAsync(short[] samples)
{
short[] sampin;
int numsamp;
_input.GetSamplesSync(out sampin, out numsamp);
_buffer.EnqueueSamples(sampin, numsamp);
_buffer.OutputSamples(samples, samples.Length / 2);
}
public void DiscardSamples()
{
_input.DiscardSamples();
_buffer.Clear();
}
public bool CanProvideAsync => true;
public SyncSoundMode SyncMode => SyncSoundMode.Async;
/// is not
public void SetSyncMode(SyncSoundMode mode)
{
if (mode != SyncSoundMode.Async)
{
throw new NotSupportedException("Only Async mode is supported");
}
}
/// always
public void GetSamplesSync(out short[] samples, out int nsamp)
{
throw new InvalidOperationException("Sync mode not supported");
}
}
public enum ESynchMethod
{
Nitsuja, // nitsuja's
Zeromus, // zero's
////PCSX2, //PCSX2 spu2-x //ohno! not available yet in c#
Vecna // vecna
}
}