int MDFNGBSOUND_StateAction(StateMem *sm, int load, int data_only) { gb_apu_state_t gb_state; int ret = 1; //if(!load) // always save state, in case there is none to load { gb_apu.save_state(&gb_state); } SFORMAT StateRegs[] = { SFVARN(gb_state, "apu_state"), SFEND }; if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, "APU")) ret = 0; else if(load) { // TODO: set hardware mode to mode_dmg, mode_cgb, or mode_agb // (latter if you're running classic GB game on Game Boy Advance) gb_apu.reset(); gb_apu.load_state(gb_state); } return(ret); }
uint8_t read_apu(uint16_t addr) { #if !defined(PSP) && !defined(EMSCRIPTEN) return apu.read_register(cycles, addr); #else return 0x0; #endif }
void init_apu() { #if !defined(PSP) && !defined(EMSCRIPTEN) if ( SDL_Init( SDL_INIT_AUDIO ) < 0 ) { atexit( SDL_Quit ); } stereo_buf.clock_rate(CLOCK_RATE); stereo_buf.set_sample_rate(SAMPLE_RATE); apu.treble_eq(-15.0); stereo_buf.bass_freq(100); apu.set_output( stereo_buf.center(), stereo_buf.left(), stereo_buf.right() ); sound.start(SAMPLE_RATE, 2); #endif }
uint32 MDFNGBSOUND_Read(int ts, uint32 addr) { uint32 ret; ret = gb_apu.read_register(ts*GB_APU_OVERCLOCK, addr); return(ret); }
void end_frame() { #if !defined(PSP) && !defined(EMSCRIPTEN) apu.end_frame(MAX_CYCLES); stereo_buf.end_frame(MAX_CYCLES); if (stereo_buf.samples_avail() >= BUF_SIZE) { size_t count = stereo_buf.read_samples(sample_buffer, BUF_SIZE ); sound.write(sample_buffer, count ); } #endif }
static bool RedoBuffer(uint32 rate) { if(gb_buf) { delete gb_buf; gb_buf = NULL; } gb_apu.set_output(NULL, NULL, NULL); if(rate) { gb_buf = new Stereo_Buffer(); gb_buf->set_sample_rate(rate, 40); gb_buf->clock_rate((long)(4194304 * GB_APU_OVERCLOCK * 1)); gb_apu.set_output(gb_buf->center(), gb_buf->left(), gb_buf->right()); } return(TRUE); }
int32 MDFNGBSOUND_Flush(int ts, int16 *SoundBuf, const int32 MaxSoundFrames) { int32 SoundFrames = 0; gb_apu.end_frame(ts * GB_APU_OVERCLOCK); if(SoundBuf && gb_buf) { gb_buf->end_frame(ts * GB_APU_OVERCLOCK); SoundFrames = gb_buf->read_samples(SoundBuf, MaxSoundFrames * 2) / 2; } else if(gb_buf) exit(1); return(SoundFrames); }
void write_apu(uint16_t addr, uint8_t val) { #if !defined(PSP) && !defined(EMSCRIPTEN) apu.write_register(cycles, addr, val); #endif }
void MDFNGBSOUND_Write(int ts, uint32 addr, uint8 val) { //if(addr == 0xFF26) // printf("%04x %02x\n", addr, val); gb_apu.write_register(ts * GB_APU_OVERCLOCK, addr, val); }
void MDFNGBSOUND_Reset(void) { // TODO: set hardware mode to mode_dmg, mode_cgb, or mode_agb // (latter if you're running classic GB game on Game Boy Advance) gb_apu.reset(); }
void MDFNGBSOUND_Init(void) { gb_apu.volume(0.5); RedoBuffer(0); }