diff --git a/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs b/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs index 19a7c001af..a4484202f8 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/SNES/LibsnesCore.cs @@ -414,18 +414,20 @@ namespace BizHawk.Emulation.Consoles.Nintendo.SNES int nsamples = brPipe.ReadInt32(); bwPipe.Write(0); //location to store audio buffer in brPipe.ReadInt32(); //dummy synchronization - bwPipe.Write(0); //dummy synchronization - brPipe.ReadInt32(); //dummy synchronization + if (audio_sample != null) { ushort* audiobuffer = ((ushort*)mmvaPtr); - for (int i = 0; i < nsamples; i++) + for (int i = 0; i < nsamples;) { ushort left = audiobuffer[i++]; ushort right = audiobuffer[i++]; audio_sample(left, right); } } + + bwPipe.Write(0); //dummy synchronization + brPipe.ReadInt32(); //dummy synchronization break; } case eMessage.eMessage_snes_cb_scanlineStart: diff --git a/BizHawk.MultiClient/output/dll/libsnes_pwrap.exe b/BizHawk.MultiClient/output/dll/libsnes_pwrap.exe index fb6fac596e..a11d776e9a 100644 Binary files a/BizHawk.MultiClient/output/dll/libsnes_pwrap.exe and b/BizHawk.MultiClient/output/dll/libsnes_pwrap.exe differ diff --git a/libsnes/libsnes_pwrap/libsnes_pwrap.cpp b/libsnes/libsnes_pwrap/libsnes_pwrap.cpp index ef7ea216da..ccbe99475b 100644 --- a/libsnes/libsnes_pwrap/libsnes_pwrap.cpp +++ b/libsnes/libsnes_pwrap/libsnes_pwrap.cpp @@ -164,13 +164,15 @@ void FlushAudio() WritePipe(eMessage_snes_cb_audio_sample); - int nsamples = audiobuffer_idx/2; + int nsamples = audiobuffer_idx; WritePipe(nsamples); - int destOfs = ReadPipe(); - char* buf = (char*)hMapFilePtr + destOfs; - memcpy(buf,audiobuffer,nsamples*4); + char* buf = ReadPipeSharedPtr(); + memcpy(buf,audiobuffer,nsamples*2); //extra just in case we had to unexpectedly flush audio and then carry on with some other process... yeah, its rickety. WritePipe(0); //dummy synchronization + + //wait for frontend to consume data + ReadPipe(); //dummy synchronization WritePipe(0); //dummy synchronization audiobuffer_idx = 0;