gpsp/sound.h
David Guillen Fandos 2352adcc50 Improve savestate loading to avoid corrupting the current state
It should not happen since the magic value and version would normally
discard incompatible savestates, however it's preferrable to check
before loading the state (it's just some minor sanity check).
2023-09-07 20:26:44 +02:00

114 lines
3 KiB
C

/* gameplaySP
*
* Copyright (C) 2006 Exophase <exophase@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef SOUND_H
#define SOUND_H
#define BUFFER_SIZE (1 << 16)
#define BUFFER_SIZE_MASK (BUFFER_SIZE - 1)
#define GBA_SOUND_FREQUENCY (64 * 1024)
#ifdef OVERCLOCK_60FPS
#define GBC_BASE_RATE ((float)(60 * 228 * (272+960)))
#else
#define GBC_BASE_RATE ((float)(16 * 1024 * 1024))
#endif
#define DIRECT_SOUND_INACTIVE 0
#define DIRECT_SOUND_RIGHT 1
#define DIRECT_SOUND_LEFT 2
#define DIRECT_SOUND_LEFTRIGHT 3
typedef struct
{
s8 fifo[32];
u32 fifo_base;
u32 fifo_top;
fixed8_24 fifo_fractional;
// The + 1 is to give some extra room for linear interpolation
// when wrapping around.
u32 buffer_index;
u32 status;
u32 volume_halve;
} direct_sound_struct;
#define GBC_SOUND_INACTIVE 0
#define GBC_SOUND_RIGHT 1
#define GBC_SOUND_LEFT 2
#define GBC_SOUND_LEFTRIGHT 3
typedef struct
{
u32 rate;
fixed16_16 frequency_step;
fixed16_16 sample_index;
fixed16_16 tick_counter;
u32 total_volume;
u32 envelope_initial_volume;
u32 envelope_volume;
u32 envelope_direction;
u32 envelope_status;
u32 envelope_ticks;
u32 envelope_initial_ticks;
u32 sweep_status;
u32 sweep_direction;
u32 sweep_ticks;
u32 sweep_initial_ticks;
u32 sweep_shift;
u32 length_status;
u32 length_ticks;
u32 noise_type;
u32 wave_type;
u32 wave_bank;
u32 wave_volume;
u32 status;
u32 active_flag;
u32 master_enable;
u32 sample_table_idx;
} gbc_sound_struct;
const extern s8 square_pattern_duty[4][8];
extern direct_sound_struct direct_sound_channel[2];
extern gbc_sound_struct gbc_sound_channel[4];
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 const u32 sound_frequency;
extern u32 sound_on;
void sound_timer_queue32(u32 channel, u32 value);
unsigned sound_timer(fixed8_24 frequency_step, u32 channel);
void sound_reset_fifo(u32 channel);
void render_gbc_sound();
void init_sound();
bool sound_check_savestate(const u8 *src);
unsigned sound_write_savestate(u8 *dst);
bool sound_read_savestate(const u8 *src);
u32 sound_read_samples(s16 *out, u32 frames);
void reset_sound(void);
#endif