2009-05-21 17:48:31 +02:00
|
|
|
/* 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
|
|
|
|
|
2014-12-09 05:36:30 +01:00
|
|
|
#define BUFFER_SIZE (1 << 16)
|
|
|
|
#define BUFFER_SIZE_MASK (BUFFER_SIZE - 1)
|
|
|
|
|
|
|
|
#define GBA_SOUND_FREQUENCY (64 * 1024)
|
|
|
|
|
2009-05-21 17:48:31 +02:00
|
|
|
|
2011-09-06 19:18:34 +02:00
|
|
|
#define GBA_XTAL 16777216.0f
|
2009-05-21 17:48:31 +02:00
|
|
|
|
2014-12-09 00:17:28 +01:00
|
|
|
#define GBC_BASE_RATE GBA_XTAL
|
2009-05-21 17:48:31 +02:00
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
2014-12-09 00:17:28 +01:00
|
|
|
DIRECT_SOUND_INACTIVE,
|
|
|
|
DIRECT_SOUND_RIGHT,
|
|
|
|
DIRECT_SOUND_LEFT,
|
|
|
|
DIRECT_SOUND_LEFTRIGHT
|
2009-05-21 17:48:31 +02:00
|
|
|
} direct_sound_status_type;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
2014-12-09 00:17:28 +01:00
|
|
|
DIRECT_SOUND_VOLUME_50,
|
|
|
|
DIRECT_SOUND_VOLUME_100
|
2009-05-21 17:48:31 +02:00
|
|
|
} direct_sound_volume_type;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
2014-12-09 00:17:28 +01:00
|
|
|
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;
|
|
|
|
direct_sound_status_type status;
|
|
|
|
direct_sound_volume_type volume;
|
|
|
|
u32 last_cpu_ticks;
|
2009-05-21 17:48:31 +02:00
|
|
|
} direct_sound_struct;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
2014-12-09 00:17:28 +01:00
|
|
|
GBC_SOUND_INACTIVE,
|
|
|
|
GBC_SOUND_RIGHT,
|
|
|
|
GBC_SOUND_LEFT,
|
|
|
|
GBC_SOUND_LEFTRIGHT
|
2009-05-21 17:48:31 +02:00
|
|
|
} gbc_sound_status_type;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
2014-12-09 00:17:28 +01:00
|
|
|
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_step;
|
|
|
|
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;
|
|
|
|
gbc_sound_status_type status;
|
|
|
|
u32 active_flag;
|
|
|
|
u32 master_enable;
|
|
|
|
s8* sample_data;
|
2009-05-21 17:48:31 +02:00
|
|
|
} gbc_sound_struct;
|
|
|
|
|
|
|
|
extern direct_sound_struct direct_sound_channel[2];
|
|
|
|
extern gbc_sound_struct gbc_sound_channel[4];
|
|
|
|
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;
|
2011-09-06 19:18:34 +02:00
|
|
|
extern u32 gbc_sound_buffer_index;
|
|
|
|
extern u32 gbc_sound_last_cpu_ticks;
|
2009-05-21 17:48:31 +02:00
|
|
|
|
|
|
|
extern u32 sound_frequency;
|
|
|
|
extern u32 sound_on;
|
|
|
|
|
|
|
|
extern u32 global_enable_audio;
|
|
|
|
extern u32 enable_low_pass_filter;
|
|
|
|
|
|
|
|
void sound_timer_queue8(u32 channel, u8 value);
|
|
|
|
void sound_timer_queue16(u32 channel, u16 value);
|
|
|
|
void sound_timer_queue32(u32 channel, u32 value);
|
2011-09-06 19:18:34 +02:00
|
|
|
void sound_timer(fixed8_24 frequency_step, u32 channel);
|
2009-05-21 17:48:31 +02:00
|
|
|
void sound_reset_fifo(u32 channel);
|
|
|
|
void update_gbc_sound(u32 cpu_ticks);
|
2012-10-05 01:00:26 +02:00
|
|
|
void init_sound(int need_reset);
|
2009-05-21 17:48:31 +02:00
|
|
|
void sound_write_mem_savestate(file_tag_type savestate_file);
|
|
|
|
void sound_read_savestate(file_tag_type savestate_file);
|
|
|
|
|
2014-12-09 00:17:28 +01:00
|
|
|
void render_audio(void);
|
|
|
|
|
2009-05-21 17:48:31 +02:00
|
|
|
void reset_sound();
|
|
|
|
void sound_exit();
|
|
|
|
|
|
|
|
#endif
|