Encapsulate PCEHawk in new service for Sound Debugger
This commit is contained in:
parent
04d3fe707c
commit
b31e973a8a
|
@ -6,7 +6,7 @@ using System.Windows.Forms;
|
||||||
|
|
||||||
using BizHawk.Client.Common;
|
using BizHawk.Client.Common;
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
using BizHawk.Emulation.Cores.PCEngine;
|
using BizHawk.Emulation.Cores.Components;
|
||||||
using BizHawk.Emulation.Common;
|
using BizHawk.Emulation.Common;
|
||||||
|
|
||||||
namespace BizHawk.Client.EmuHawk
|
namespace BizHawk.Client.EmuHawk
|
||||||
|
@ -18,7 +18,10 @@ namespace BizHawk.Client.EmuHawk
|
||||||
=> Properties.Resources.BugIcon;
|
=> Properties.Resources.BugIcon;
|
||||||
|
|
||||||
[RequiredService]
|
[RequiredService]
|
||||||
private PCEngine PCE { get; set; }
|
private IPCEngineSoundDebuggable/*?*/ _maybeSoundDebug { get; set; }
|
||||||
|
|
||||||
|
private IPCEngineSoundDebuggable SoundDebugImpl
|
||||||
|
=> _maybeSoundDebug!;
|
||||||
|
|
||||||
protected override string WindowTitleStatic => "Sound Debugger";
|
protected override string WindowTitleStatic => "Sound Debugger";
|
||||||
|
|
||||||
|
@ -46,6 +49,8 @@ namespace BizHawk.Client.EmuHawk
|
||||||
|
|
||||||
protected override void UpdateAfter()
|
protected override void UpdateAfter()
|
||||||
{
|
{
|
||||||
|
var channelData = SoundDebugImpl.GetPSGChannelData();
|
||||||
|
|
||||||
foreach (var entry in _psgEntries)
|
foreach (var entry in _psgEntries)
|
||||||
{
|
{
|
||||||
entry.WasActive = entry.Active;
|
entry.WasActive = entry.Active;
|
||||||
|
@ -58,7 +63,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
|
|
||||||
for (int i = 0; i < 6; i++)
|
for (int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
var ch = PCE.PSG.Channels[i];
|
var ch = channelData[i];
|
||||||
|
|
||||||
// these conditions mean a sample isn't playing
|
// these conditions mean a sample isn't playing
|
||||||
if (!ch.Enabled)
|
if (!ch.Enabled)
|
||||||
|
@ -95,7 +100,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
lvChannels.Items[i].SubItems[3].Text = "-";
|
lvChannels.Items[i].SubItems[3].Text = "-";
|
||||||
|
|
||||||
// ok, a sample is playing. copy out the waveform
|
// ok, a sample is playing. copy out the waveform
|
||||||
short[] waveform = (short[])ch.Wave.Clone();
|
var waveform = ch.CloneWaveform();
|
||||||
|
|
||||||
// hash it
|
// hash it
|
||||||
var ms = new MemoryStream(_waveformTemp);
|
var ms = new MemoryStream(_waveformTemp);
|
||||||
|
@ -244,6 +249,6 @@ namespace BizHawk.Client.EmuHawk
|
||||||
}
|
}
|
||||||
|
|
||||||
private void lvChEn_ItemChecked(object sender, ItemCheckedEventArgs e)
|
private void lvChEn_ItemChecked(object sender, ItemCheckedEventArgs e)
|
||||||
=> PCE.PSG.UserMute[e.Item.Index] = !e.Item.Checked;
|
=> SoundDebugImpl.SetChannelMuted(e.Item.Index, newIsMuted: !e.Item.Checked);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
using BizHawk.Emulation.Common;
|
||||||
|
|
||||||
|
namespace BizHawk.Emulation.Cores.Components
|
||||||
|
{
|
||||||
|
public interface IPCEngineSoundDebuggable : ISpecializedEmulatorService
|
||||||
|
{
|
||||||
|
public interface ChannelData
|
||||||
|
{
|
||||||
|
bool DDA { get; }
|
||||||
|
|
||||||
|
bool Enabled { get; }
|
||||||
|
|
||||||
|
ushort Frequency { get; }
|
||||||
|
|
||||||
|
bool NoiseChannel { get; }
|
||||||
|
|
||||||
|
byte Volume { get; }
|
||||||
|
|
||||||
|
short[] CloneWaveform();
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadOnlySpan<ChannelData> GetPSGChannelData();
|
||||||
|
|
||||||
|
void SetChannelMuted(int channelIndex, bool newIsMuted);
|
||||||
|
}
|
||||||
|
}
|
|
@ -321,6 +321,7 @@ namespace BizHawk.Emulation.Cores.PCEngine
|
||||||
ser.Register<IDisassemblable>(Cpu);
|
ser.Register<IDisassemblable>(Cpu);
|
||||||
ser.Register<IVideoProvider>((IVideoProvider)VPC ?? VDC1);
|
ser.Register<IVideoProvider>((IVideoProvider)VPC ?? VDC1);
|
||||||
ser.Register<ISoundProvider>(_soundProvider);
|
ser.Register<ISoundProvider>(_soundProvider);
|
||||||
|
ser.Register<IPCEngineSoundDebuggable>(PSG);
|
||||||
ser.Register<IStatable>(new StateSerializer(SyncState));
|
ser.Register<IStatable>(new StateSerializer(SyncState));
|
||||||
SetupMemoryDomains();
|
SetupMemoryDomains();
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,10 +11,11 @@ namespace BizHawk.Emulation.Cores.Components
|
||||||
|
|
||||||
// Sound refactor TODO: IMixedSoundProvider must inherit ISoundProvider
|
// Sound refactor TODO: IMixedSoundProvider must inherit ISoundProvider
|
||||||
// TODo: this provides "fake" sync sound by hardcoding the number of samples
|
// TODo: this provides "fake" sync sound by hardcoding the number of samples
|
||||||
public sealed class HuC6280PSG : ISoundProvider, IMixedSoundProvider
|
public sealed class HuC6280PSG : ISoundProvider, IMixedSoundProvider, IPCEngineSoundDebuggable
|
||||||
{
|
{
|
||||||
private readonly int _spf;
|
private readonly int _spf;
|
||||||
public class PSGChannel
|
|
||||||
|
public sealed class PSGChannel : IPCEngineSoundDebuggable.ChannelData
|
||||||
{
|
{
|
||||||
public ushort Frequency;
|
public ushort Frequency;
|
||||||
public byte Panning;
|
public byte Panning;
|
||||||
|
@ -26,6 +27,24 @@ namespace BizHawk.Emulation.Cores.Components
|
||||||
public short DDAValue;
|
public short DDAValue;
|
||||||
public short[] Wave = new short[32];
|
public short[] Wave = new short[32];
|
||||||
public float SampleOffset;
|
public float SampleOffset;
|
||||||
|
|
||||||
|
bool IPCEngineSoundDebuggable.ChannelData.DDA
|
||||||
|
=> DDA;
|
||||||
|
|
||||||
|
bool IPCEngineSoundDebuggable.ChannelData.Enabled
|
||||||
|
=> Enabled;
|
||||||
|
|
||||||
|
ushort IPCEngineSoundDebuggable.ChannelData.Frequency
|
||||||
|
=> Frequency;
|
||||||
|
|
||||||
|
bool IPCEngineSoundDebuggable.ChannelData.NoiseChannel
|
||||||
|
=> NoiseChannel;
|
||||||
|
|
||||||
|
byte IPCEngineSoundDebuggable.ChannelData.Volume
|
||||||
|
=> Volume;
|
||||||
|
|
||||||
|
public short[] CloneWaveform()
|
||||||
|
=> (short[]) Wave.Clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PSGChannel[] Channels = new PSGChannel[8];
|
public PSGChannel[] Channels = new PSGChannel[8];
|
||||||
|
@ -73,6 +92,12 @@ namespace BizHawk.Emulation.Cores.Components
|
||||||
frameStopTime = cycles;
|
frameStopTime = cycles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ReadOnlySpan<IPCEngineSoundDebuggable.ChannelData> GetPSGChannelData()
|
||||||
|
=> Channels;
|
||||||
|
|
||||||
|
public void SetChannelMuted(int channelIndex, bool newIsMuted)
|
||||||
|
=> UserMute[channelIndex] = newIsMuted;
|
||||||
|
|
||||||
internal void WritePSG(byte register, byte value, long cycles)
|
internal void WritePSG(byte register, byte value, long cycles)
|
||||||
{
|
{
|
||||||
commands.Enqueue(new QueuedCommand { Register = register, Value = value, Time = cycles - frameStartTime });
|
commands.Enqueue(new QueuedCommand { Register = register, Value = value, Time = cycles - frameStartTime });
|
||||||
|
|
Loading…
Reference in New Issue