Make sound control deterministic by having proper reset
This commit is contained in:
parent
34eb7a3bf3
commit
7f07da9ade
14
gba_memory.c
14
gba_memory.c
|
@ -2447,7 +2447,19 @@ bool gamepak_must_swap(void)
|
|||
|
||||
void init_memory(void)
|
||||
{
|
||||
u32 map_offset = 0;
|
||||
u32 map_offset = 0, i;
|
||||
|
||||
for (i = 0; i < DMA_CHAN_CNT; i++)
|
||||
{
|
||||
dma[i].start_type = DMA_INACTIVE;
|
||||
dma[i].irq = DMA_NO_IRQ;
|
||||
dma[i].source_address = dma[i].dest_address = 0;
|
||||
dma[i].source_direction = dma[i].dest_direction = 0;
|
||||
dma[i].length = 0;
|
||||
dma[i].length_type = DMA_16BIT;
|
||||
dma[i].repeat_type = DMA_NO_REPEAT;
|
||||
dma[i].direct_sound_channel = DMA_NO_DIRECT_SOUND;
|
||||
}
|
||||
|
||||
// Fill memory map regions, areas marked as NULL must be checked directly
|
||||
map_region(read, 0x0000000, 0x1000000, 1, bios_rom);
|
||||
|
|
|
@ -566,7 +566,7 @@ void retro_init(void)
|
|||
#endif
|
||||
|
||||
init_gamepak_buffer();
|
||||
init_sound(1);
|
||||
init_sound();
|
||||
|
||||
if(!gba_screen_pixels)
|
||||
#ifdef _3DS
|
||||
|
|
9
main.c
9
main.c
|
@ -82,13 +82,14 @@ static unsigned update_timers(irq_type *irq_raised, unsigned completed_cycles)
|
|||
void init_main(void)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for(i = 0; i < 4; i++)
|
||||
{
|
||||
dma[i].start_type = DMA_INACTIVE;
|
||||
dma[i].direct_sound_channel = DMA_NO_DIRECT_SOUND;
|
||||
timer[i].status = TIMER_INACTIVE;
|
||||
timer[i].reload = 0x10000;
|
||||
timer[i].prescale = 0;
|
||||
timer[i].irq = 0;
|
||||
timer[i].reload = timer[i].count = 0x10000;
|
||||
timer[i].direct_sound_channels = TIMER_DS_CHANNEL_NONE;
|
||||
timer[i].frequency_step = 0;
|
||||
}
|
||||
|
||||
timer[0].direct_sound_channels = TIMER_DS_CHANNEL_BOTH;
|
||||
|
|
12
sound.c
12
sound.c
|
@ -549,6 +549,7 @@ void reset_sound(void)
|
|||
ds->fifo_top = 0;
|
||||
ds->fifo_base = 0;
|
||||
ds->fifo_fractional = 0;
|
||||
ds->volume_halve = 1;
|
||||
memset(ds->fifo, 0, 32);
|
||||
}
|
||||
|
||||
|
@ -561,6 +562,7 @@ void reset_sound(void)
|
|||
gbc_sound_master_volume = 0;
|
||||
memset(wave_samples, 0, 64);
|
||||
|
||||
memset(&gbc_sound_channel[0], 0, sizeof(gbc_sound_channel));
|
||||
for(i = 0; i < 4; i++, gs++)
|
||||
{
|
||||
gs->status = GBC_SOUND_INACTIVE;
|
||||
|
@ -569,7 +571,7 @@ void reset_sound(void)
|
|||
}
|
||||
}
|
||||
|
||||
void init_sound(int need_reset)
|
||||
void init_sound()
|
||||
{
|
||||
gbc_sound_tick_step =
|
||||
float_to_fp16_16(256.0f / sound_frequency);
|
||||
|
@ -577,8 +579,7 @@ void init_sound(int need_reset)
|
|||
init_noise_table(noise_table15, 32767, 14);
|
||||
init_noise_table(noise_table7, 127, 6);
|
||||
|
||||
if (need_reset)
|
||||
reset_sound();
|
||||
reset_sound();
|
||||
}
|
||||
|
||||
bool sound_read_savestate(const u8 *src)
|
||||
|
@ -633,7 +634,6 @@ bool sound_read_savestate(const u8 *src)
|
|||
bson_read_int32(sndchan, "env-vol", &gs->envelope_volume) &&
|
||||
bson_read_int32(sndchan, "env-dir", &gs->envelope_direction) &&
|
||||
bson_read_int32(sndchan, "env-status", &gs->envelope_status) &&
|
||||
bson_read_int32(sndchan, "env-step", &gs->envelope_step) &&
|
||||
bson_read_int32(sndchan, "env-ticks0", &gs->envelope_initial_ticks) &&
|
||||
bson_read_int32(sndchan, "env-ticks", &gs->envelope_ticks) &&
|
||||
bson_read_int32(sndchan, "sweep-status", &gs->sweep_status) &&
|
||||
|
@ -705,7 +705,6 @@ unsigned sound_write_savestate(u8 *dst)
|
|||
bson_write_int32(dst, "env-vol", gs->envelope_volume);
|
||||
bson_write_int32(dst, "env-dir", gs->envelope_direction);
|
||||
bson_write_int32(dst, "env-status", gs->envelope_status);
|
||||
bson_write_int32(dst, "env-step", gs->envelope_step);
|
||||
bson_write_int32(dst, "env-ticks0", gs->envelope_initial_ticks);
|
||||
bson_write_int32(dst, "env-ticks", gs->envelope_ticks);
|
||||
bson_write_int32(dst, "sweep-status", gs->sweep_status);
|
||||
|
@ -721,6 +720,9 @@ unsigned sound_write_savestate(u8 *dst)
|
|||
bson_write_int32(dst, "len-ticks", gs->length_ticks);
|
||||
bson_write_int32(dst, "noise-type", gs->noise_type);
|
||||
bson_write_int32(dst, "sample-tbl", gs->sample_table_idx);
|
||||
|
||||
// No longer used fields, keep for backwards compatibility.
|
||||
bson_write_int32(dst, "env-step", 0);
|
||||
bson_finish_document(dst, wbptr2);
|
||||
}
|
||||
|
||||
|
|
3
sound.h
3
sound.h
|
@ -66,7 +66,6 @@ typedef struct
|
|||
u32 envelope_volume;
|
||||
u32 envelope_direction;
|
||||
u32 envelope_status;
|
||||
u32 envelope_step;
|
||||
u32 envelope_ticks;
|
||||
u32 envelope_initial_ticks;
|
||||
u32 sweep_status;
|
||||
|
@ -102,7 +101,7 @@ void sound_timer_queue32(u32 channel, u32 value);
|
|||
unsigned sound_timer(fixed8_24 frequency_step, u32 channel);
|
||||
void sound_reset_fifo(u32 channel);
|
||||
void update_gbc_sound(u32 cpu_ticks);
|
||||
void init_sound(int need_reset);
|
||||
void init_sound();
|
||||
unsigned sound_write_savestate(u8 *dst);
|
||||
bool sound_read_savestate(const u8 *src);
|
||||
|
||||
|
|
Loading…
Reference in New Issue