X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=gpsp.git;a=blobdiff_plain;f=sound.h;h=f3c1a8a9225d167b774f259b91dc9ed4e9347661;hp=d71c7330c9aff413b520e0bae454c8ebff7d1362;hb=HEAD;hpb=bbba320911a86c0ee373f8297f80a2b82de22039 diff --git a/sound.h b/sound.h index d71c733..f3c1a8a 100644 --- a/sound.h +++ b/sound.h @@ -22,17 +22,14 @@ #define BUFFER_SIZE 65536 -// A lot of sound cards on PC can't handle such small buffers but this -// seems to work well on PSP. - -#ifdef PSP_BUILD - -#define SOUND_BUFFER_SIZE 4096 +#define GBA_XTAL 16777216.0f +#define GBA_60HZ_RATE 16853760.0f /* 228*(272+960)*60 */ +#if !defined(PSP_BUILD) && !defined(POLLUX_BUILD) + // run GBA at 60Hz (~0.5% faster) to better match host display + #define GBC_BASE_RATE GBA_60HZ_RATE #else - -#define SOUND_BUFFER_SIZE 16384 - + #define GBC_BASE_RATE GBA_XTAL #endif typedef enum @@ -54,7 +51,7 @@ typedef struct s8 fifo[32]; u32 fifo_base; u32 fifo_top; - fixed16_16 fifo_fractional; + fixed8_24 fifo_fractional; // The + 1 is to give some extra room for linear interpolation // when wrapping around. u32 buffer_index; @@ -109,6 +106,8 @@ extern s8 square_pattern_duty[4][8]; extern u32 gbc_sound_master_volume_left; extern u32 gbc_sound_master_volume_right; extern u32 gbc_sound_master_volume; +extern u32 gbc_sound_buffer_index; +extern u32 gbc_sound_last_cpu_ticks; extern u32 sound_frequency; extern u32 sound_on; @@ -122,10 +121,10 @@ extern SDL_mutex *sound_mutex; void sound_timer_queue8(u32 channel, u8 value); void sound_timer_queue16(u32 channel, u16 value); void sound_timer_queue32(u32 channel, u32 value); -void sound_timer(fixed16_16 frequency_step, u32 channel); +void sound_timer(fixed8_24 frequency_step, u32 channel); void sound_reset_fifo(u32 channel); void update_gbc_sound(u32 cpu_ticks); -void init_sound(); +void init_sound(int need_reset); void sound_write_mem_savestate(file_tag_type savestate_file); void sound_read_savestate(file_tag_type savestate_file); @@ -320,7 +319,7 @@ static u32 gbc_sound_wave_volume[4] = { 0, 16384, 8192, 4096 }; #define sound_update_frequency_step(timer_number) \ timer[timer_number].frequency_step = \ - float_to_fp16_16(16777216.0 / (timer_reload * sound_frequency)) \ + float_to_fp8_24(GBC_BASE_RATE / (timer_reload * sound_frequency)) \ #endif // IN_MEMORY_C