BizHawk/waterbox/bsnescore/bsnes/sfc/dsp/dsp.cpp

81 lines
1.8 KiB
C++

#include <sfc/sfc.hpp>
namespace SuperFamicom {
DSP dsp;
#include "serialization.cpp"
#include "SPC_DSP.cpp"
auto DSP::main() -> void {
if(!configuration.hacks.dsp.fast) {
spc_dsp.run(1);
clock += 2;
} else {
spc_dsp.run(32);
clock += 2 * 32;
}
int count = spc_dsp.sample_count();
if(count > 0) {
if(!system.runAhead && system.renderAudio && !scheduler.StepOnce)
for(uint n = 0; n < count; n += 2) {
float left = samplebuffer[n + 0] / 32768.0f;
float right = samplebuffer[n + 1] / 32768.0f;
stream->sample(left, right);
}
spc_dsp.set_output(samplebuffer, 8192);
}
}
auto DSP::read(uint8 address) -> uint8 {
return spc_dsp.read(address);
}
auto DSP::write(uint8 address, uint8 data) -> void {
if(configuration.hacks.dsp.echoShadow) {
if(address == 0x6c && (data & 0x20)) {
memset(echoram, 0x00, 65536);
}
}
spc_dsp.write(address, data);
}
auto DSP::load() -> bool {
return true;
}
auto DSP::power(bool reset) -> void {
clock = 0;
stream = Emulator::audio.createStream(2, system.apuFrequency() / 768.0);
if(!reset) {
if(!configuration.hacks.dsp.echoShadow) {
spc_dsp.init(apuram, apuram);
} else {
memset(echoram, 0x00, 65536);
spc_dsp.init(apuram, echoram);
}
spc_dsp.reset();
spc_dsp.set_output(samplebuffer, 8192);
} else {
spc_dsp.soft_reset();
spc_dsp.set_output(samplebuffer, 8192);
}
if(configuration.hacks.hotfixes) {
//Magical Drop (Japan) does not initialize the DSP registers at startup:
//tokoton mode will hang forever in some instances even on real hardware.
if(cartridge.headerTitle() == "MAGICAL DROP") {
for(uint address : range(0x80)) spc_dsp.write(address, 0xff);
}
}
}
auto DSP::mute() -> bool {
return spc_dsp.mute();
}
}