#include 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(); } }