ADDED volume control to GB core [blargg]
CLEANUP gbSound.h [blargg] git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@658 a31d4220-a93d-0410-bf67-fe4944624d44
This commit is contained in:
parent
f76a2165ef
commit
cc32c6b12f
|
@ -2,8 +2,9 @@
|
||||||
// Copyright (C) 1999-2003 Forgotten
|
// Copyright (C) 1999-2003 Forgotten
|
||||||
// Copyright (C) 2004 Forgotten and the VBA development team
|
// Copyright (C) 2004 Forgotten and the VBA development team
|
||||||
// Copyright (C) 2004-2006 VBA development team
|
// Copyright (C) 2004-2006 VBA development team
|
||||||
// Copyright (C) 2007 Shay Green (blargg)
|
// Copyright (C) 2007-2008 VBA-M development team
|
||||||
|
// Copyright (C) 2007-2008 Shay Green (blargg)
|
||||||
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// 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
|
// it under the terms of the GNU General Public License as published by
|
||||||
// the Free Software Foundation; either version 2, or(at your option)
|
// the Free Software Foundation; either version 2, or(at your option)
|
||||||
|
@ -18,7 +19,7 @@
|
||||||
// along with this program; if not, write to the Free Software Foundation,
|
// along with this program; if not, write to the Free Software Foundation,
|
||||||
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include <memory.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "Sound.h"
|
#include "Sound.h"
|
||||||
|
|
||||||
|
@ -54,24 +55,22 @@
|
||||||
|
|
||||||
extern bool stopState; // TODO: silence sound when true
|
extern bool stopState; // TODO: silence sound when true
|
||||||
|
|
||||||
int soundQuality = 2;
|
int const SOUND_CLOCK_TICKS_ = 167772; // 1/100 second
|
||||||
int soundInterpolation = 0;
|
|
||||||
float soundFiltering = 1;
|
|
||||||
static float soundFiltering_;
|
|
||||||
float soundVolume = 1;
|
|
||||||
static float soundVolume_ = -1;
|
|
||||||
bool soundEcho = false;
|
|
||||||
|
|
||||||
static int soundEnableFlag = 0x3ff; // emulator channels enabled
|
|
||||||
|
|
||||||
int const SOUND_CLOCK_TICKS_ = 167772;
|
|
||||||
int SOUND_CLOCK_TICKS = SOUND_CLOCK_TICKS_;
|
|
||||||
int soundTicks = SOUND_CLOCK_TICKS_;
|
|
||||||
|
|
||||||
u16 soundFinalWave [1470];
|
u16 soundFinalWave [1470];
|
||||||
int soundBufferLen = sizeof soundFinalWave;
|
int soundBufferLen = sizeof soundFinalWave;
|
||||||
|
int soundQuality = 2;
|
||||||
|
int soundInterpolation = 0;
|
||||||
bool soundPaused = true;
|
bool soundPaused = true;
|
||||||
|
float soundFiltering = 1;
|
||||||
|
float soundVolume = 1;
|
||||||
|
bool soundEcho = false;
|
||||||
|
int SOUND_CLOCK_TICKS = SOUND_CLOCK_TICKS_;
|
||||||
|
int soundTicks = SOUND_CLOCK_TICKS_;
|
||||||
|
|
||||||
|
static int soundEnableFlag = 0x3ff; // emulator channels enabled
|
||||||
|
static float soundFiltering_ = -1;
|
||||||
|
static float soundVolume_ = -1;
|
||||||
|
|
||||||
void interp_rate() { /* empty for now */ }
|
void interp_rate() { /* empty for now */ }
|
||||||
|
|
||||||
|
|
23
src/Sound.h
23
src/Sound.h
|
@ -1,20 +1,16 @@
|
||||||
// GBA sound emulation
|
// Sound emulation setup/options and GBA sound emulation
|
||||||
|
|
||||||
#ifndef VBA_SOUND_H
|
#ifndef VBA_SOUND_H
|
||||||
#define VBA_SOUND_H
|
#define VBA_SOUND_H
|
||||||
|
|
||||||
#include "System.h"
|
#include "System.h"
|
||||||
|
|
||||||
//// Setup/options
|
//// Setup/options (these affect GBA and GB sound)
|
||||||
|
|
||||||
// Initializes sound and returns true if successful. Sets sound quality to
|
// Initializes sound and returns true if successful. Sets sound quality to
|
||||||
// current value in soundQuality global.
|
// current value in soundQuality global.
|
||||||
bool soundInit();
|
bool soundInit();
|
||||||
|
|
||||||
// Sets sample rate to 44100 / quality
|
|
||||||
void soundSetQuality( int quality );
|
|
||||||
extern int soundQuality; // current sound quality
|
|
||||||
|
|
||||||
// Manages sound volume, where 1.0 is normal
|
// Manages sound volume, where 1.0 is normal
|
||||||
void soundSetVolume( float );
|
void soundSetVolume( float );
|
||||||
float soundGetVolume();
|
float soundGetVolume();
|
||||||
|
@ -24,8 +20,8 @@ float soundGetVolume();
|
||||||
// 0x002 Pulse 2
|
// 0x002 Pulse 2
|
||||||
// 0x004 Wave
|
// 0x004 Wave
|
||||||
// 0x008 Noise
|
// 0x008 Noise
|
||||||
// 0x100 GBA left
|
// 0x100 PCM 1
|
||||||
// 0x200 GBA right
|
// 0x200 PCM 2
|
||||||
void soundSetEnable( int mask );
|
void soundSetEnable( int mask );
|
||||||
int soundGetEnable();
|
int soundGetEnable();
|
||||||
|
|
||||||
|
@ -41,14 +37,21 @@ void soundShutdown();
|
||||||
extern int soundBufferLen; // size of sound buffer in BYTES
|
extern int soundBufferLen; // size of sound buffer in BYTES
|
||||||
extern u16 soundFinalWave[1470];// 16-bit SIGNED stereo sample buffer
|
extern u16 soundFinalWave[1470];// 16-bit SIGNED stereo sample buffer
|
||||||
|
|
||||||
|
|
||||||
|
//// GBA sound options
|
||||||
|
|
||||||
|
// Sets sample rate to 44100 / quality
|
||||||
|
void soundSetQuality( int quality );
|
||||||
|
extern int soundQuality; // current sound quality
|
||||||
|
|
||||||
// Sound settings
|
// Sound settings
|
||||||
extern int soundInterpolation; // 1 if PCM should have low-pass filtering
|
extern int soundInterpolation; // 1 if PCM should have low-pass filtering
|
||||||
extern float soundFiltering; // 0.0 = none, 1.0 = max (only if soundInterpolation is 1)
|
extern float soundFiltering; // 0.0 = none, 1.0 = max (only if soundInterpolation is 1)
|
||||||
|
|
||||||
|
|
||||||
//// Emulation
|
//// GBA sound emulation
|
||||||
|
|
||||||
// GBA register addresses
|
// GBA sound registers
|
||||||
#define SGCNT0_H 0x82
|
#define SGCNT0_H 0x82
|
||||||
#define FIFOA_L 0xa0
|
#define FIFOA_L 0xa0
|
||||||
#define FIFOA_H 0xa2
|
#define FIFOA_H 0xa2
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
// Copyright (C) 1999-2003 Forgotten
|
// Copyright (C) 1999-2003 Forgotten
|
||||||
// Copyright (C) 2005-2006 Forgotten and the VBA development team
|
// Copyright (C) 2005-2006 Forgotten and the VBA development team
|
||||||
// Copyright (C) 2007-2008 VBA-M development team
|
// Copyright (C) 2007-2008 VBA-M development team
|
||||||
|
// Copyright (C) 2007-2008 Shay Green (blargg)
|
||||||
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// 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
|
// it under the terms of the GNU General Public License as published by
|
||||||
// the Free Software Foundation; either version 2, or(at your option)
|
// the Free Software Foundation; either version 2, or(at your option)
|
||||||
|
@ -16,9 +18,9 @@
|
||||||
// along with this program; if not, write to the Free Software Foundation,
|
// along with this program; if not, write to the Free Software Foundation,
|
||||||
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include <memory.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "../System.h"
|
#include "../Sound.h"
|
||||||
#include "../Util.h"
|
#include "../Util.h"
|
||||||
#include "gbGlobals.h"
|
#include "gbGlobals.h"
|
||||||
#include "gbSound.h"
|
#include "gbSound.h"
|
||||||
|
@ -26,23 +28,18 @@
|
||||||
#include "gb_apu/Gb_Apu.h"
|
#include "gb_apu/Gb_Apu.h"
|
||||||
#include "gb_apu/Effects_Buffer.h"
|
#include "gb_apu/Effects_Buffer.h"
|
||||||
|
|
||||||
extern int soundGetEnable();
|
|
||||||
|
|
||||||
static Gb_Apu* gb_apu;
|
|
||||||
static Simple_Effects_Buffer* stereo_buffer;
|
|
||||||
|
|
||||||
extern u16 soundFinalWave[1470];
|
|
||||||
|
|
||||||
extern int gbHardware;
|
extern int gbHardware;
|
||||||
|
|
||||||
extern void soundResume();
|
gb_effects_config_t gb_effects_config = { false, 0.20f, 0.15f, false };
|
||||||
|
|
||||||
extern int soundBufferLen;
|
static gb_effects_config_t gb_effects_config_current;
|
||||||
extern int soundQuality;
|
static Simple_Effects_Buffer* stereo_buffer;
|
||||||
extern bool soundPaused;
|
static Gb_Apu* gb_apu;
|
||||||
extern int soundTicks;
|
|
||||||
extern int SOUND_CLOCK_TICKS;
|
|
||||||
|
|
||||||
|
static float soundVolume_ = -1;
|
||||||
|
static int prevSoundEnable = -1;
|
||||||
|
|
||||||
|
int const chan_count = 4;
|
||||||
int const ticks_to_time = 2 * GB_APU_OVERCLOCK;
|
int const ticks_to_time = 2 * GB_APU_OVERCLOCK;
|
||||||
|
|
||||||
static inline blip_time_t blip_time()
|
static inline blip_time_t blip_time()
|
||||||
|
@ -90,13 +87,6 @@ static void flush_samples()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int const chan_count = 4;
|
|
||||||
|
|
||||||
gb_effects_config_t gb_effects_config = { false, 0.2f, 0.15f, false };
|
|
||||||
static gb_effects_config_t gb_effects_config_current;
|
|
||||||
|
|
||||||
static int prevSoundEnable = -1;
|
|
||||||
|
|
||||||
static void apply_effects()
|
static void apply_effects()
|
||||||
{
|
{
|
||||||
prevSoundEnable = soundGetEnable();
|
prevSoundEnable = soundGetEnable();
|
||||||
|
@ -122,6 +112,14 @@ void gbSoundConfigEffects( gb_effects_config_t const& c )
|
||||||
gb_effects_config = c;
|
gb_effects_config = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void apply_volume()
|
||||||
|
{
|
||||||
|
soundVolume_ = soundGetVolume();
|
||||||
|
|
||||||
|
if ( gb_apu )
|
||||||
|
gb_apu->volume( soundVolume_ );
|
||||||
|
}
|
||||||
|
|
||||||
void gbSoundTick()
|
void gbSoundTick()
|
||||||
{
|
{
|
||||||
if ( gb_apu && stereo_buffer )
|
if ( gb_apu && stereo_buffer )
|
||||||
|
@ -135,6 +133,9 @@ void gbSoundTick()
|
||||||
if ( memcmp( &gb_effects_config_current, &gb_effects_config,
|
if ( memcmp( &gb_effects_config_current, &gb_effects_config,
|
||||||
sizeof gb_effects_config ) || soundGetEnable() != prevSoundEnable )
|
sizeof gb_effects_config ) || soundGetEnable() != prevSoundEnable )
|
||||||
apply_effects();
|
apply_effects();
|
||||||
|
|
||||||
|
if ( soundVolume_ != soundGetVolume() )
|
||||||
|
apply_volume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,7 +161,7 @@ static void remake_stereo_buffer()
|
||||||
stereo_buffer = 0;
|
stereo_buffer = 0;
|
||||||
|
|
||||||
stereo_buffer = new Simple_Effects_Buffer; // TODO: handle out of memory
|
stereo_buffer = new Simple_Effects_Buffer; // TODO: handle out of memory
|
||||||
stereo_buffer->set_sample_rate( 44100 / soundQuality ); // TODO: handle out of memory
|
if ( stereo_buffer->set_sample_rate( 44100 / soundQuality ) ) { } // TODO: handle out of memory
|
||||||
stereo_buffer->clock_rate( gb_apu->clock_rate );
|
stereo_buffer->clock_rate( gb_apu->clock_rate );
|
||||||
|
|
||||||
// APU
|
// APU
|
||||||
|
@ -168,20 +169,21 @@ static void remake_stereo_buffer()
|
||||||
Multi_Buffer::wave_type+1, Multi_Buffer::wave_type+2,
|
Multi_Buffer::wave_type+1, Multi_Buffer::wave_type+2,
|
||||||
Multi_Buffer::wave_type+3, Multi_Buffer::mixed_type+1
|
Multi_Buffer::wave_type+3, Multi_Buffer::mixed_type+1
|
||||||
};
|
};
|
||||||
stereo_buffer->set_channel_count( chan_count, chan_types );
|
if ( stereo_buffer->set_channel_count( chan_count, chan_types ) ) { } // TODO: handle errors
|
||||||
|
|
||||||
if ( !gb_apu )
|
if ( !gb_apu )
|
||||||
{
|
{
|
||||||
gb_apu = new Gb_Apu;
|
gb_apu = new Gb_Apu; // TODO: handle errors
|
||||||
reset_apu();
|
reset_apu();
|
||||||
}
|
}
|
||||||
|
|
||||||
apply_effects();
|
apply_effects();
|
||||||
|
apply_volume();
|
||||||
}
|
}
|
||||||
|
|
||||||
void gbSoundReset()
|
void gbSoundReset()
|
||||||
{
|
{
|
||||||
SOUND_CLOCK_TICKS = 20000;
|
SOUND_CLOCK_TICKS = 20000; // 1/100 second
|
||||||
|
|
||||||
remake_stereo_buffer();
|
remake_stereo_buffer();
|
||||||
reset_apu();
|
reset_apu();
|
||||||
|
@ -221,9 +223,6 @@ void gbSoundReset()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool soundInit();
|
|
||||||
extern void soundShutdown();
|
|
||||||
|
|
||||||
void gbSoundSetQuality(int quality)
|
void gbSoundSetQuality(int quality)
|
||||||
{
|
{
|
||||||
if ( soundQuality != quality )
|
if ( soundQuality != quality )
|
||||||
|
@ -364,7 +363,7 @@ static void gbSoundReadGameOld(int version,gzFile gzFile)
|
||||||
// Load state
|
// Load state
|
||||||
utilReadData( gzFile, gbsound_format );
|
utilReadData( gzFile, gbsound_format );
|
||||||
|
|
||||||
if ( version >= 11 )
|
if ( version >= 11 ) // TODO: never executed; remove?
|
||||||
utilReadData( gzFile, gbsound_format2 );
|
utilReadData( gzFile, gbsound_format2 );
|
||||||
|
|
||||||
utilReadData( gzFile, gbsound_format3 );
|
utilReadData( gzFile, gbsound_format3 );
|
||||||
|
|
|
@ -1,22 +1,34 @@
|
||||||
// -*- C++ -*-
|
// GB sound emulation
|
||||||
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
|
|
||||||
// Copyright (C) 1999-2003 Forgotten
|
|
||||||
// Copyright (C) 2004 Forgotten and the VBA development team
|
|
||||||
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
#ifndef VBA_GBSOUND_H
|
||||||
// it under the terms of the GNU General Public License as published by
|
#define VBA_GBSOUND_H
|
||||||
// the Free Software Foundation; either version 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
|
// See Sound.h for sound setup/options
|
||||||
|
|
||||||
|
//// GB sound options
|
||||||
|
|
||||||
|
// Sets sample rate to 44100 / quality
|
||||||
|
void gbSoundSetQuality( int quality );
|
||||||
|
extern int soundQuality; // current sound quality
|
||||||
|
|
||||||
|
// Effects configuration
|
||||||
|
struct gb_effects_config_t
|
||||||
|
{
|
||||||
|
bool enabled; // false = disable all effects
|
||||||
|
|
||||||
|
float echo; // 0.0 = none, 1.0 = lots
|
||||||
|
float stereo; // 0.0 = channels in center, 1.0 = channels on left/right
|
||||||
|
bool surround; // true = put some channels in back
|
||||||
|
};
|
||||||
|
|
||||||
|
// Changes effects configuration
|
||||||
|
void gbSoundConfigEffects( gb_effects_config_t const& );
|
||||||
|
extern gb_effects_config_t gb_effects_config; // current configuration
|
||||||
|
|
||||||
|
|
||||||
|
//// GB sound emulation
|
||||||
|
|
||||||
|
// GB sound registers
|
||||||
#define NR10 0xff10
|
#define NR10 0xff10
|
||||||
#define NR11 0xff11
|
#define NR11 0xff11
|
||||||
#define NR12 0xff12
|
#define NR12 0xff12
|
||||||
|
@ -39,36 +51,23 @@
|
||||||
#define NR51 0xff25
|
#define NR51 0xff25
|
||||||
#define NR52 0xff26
|
#define NR52 0xff26
|
||||||
|
|
||||||
#define SOUND_EVENT(address,value) \
|
// Resets emulated sound hardware
|
||||||
gbSoundEvent(address,value)
|
void gbSoundReset();
|
||||||
|
|
||||||
extern void gbSoundTick();
|
// Emulates write to sound hardware
|
||||||
extern void gbSoundPause();
|
void gbSoundEvent( u16 address, int data );
|
||||||
extern void gbSoundResume();
|
#define SOUND_EVENT gbSoundEvent
|
||||||
extern void gbSoundEnable(int);
|
|
||||||
extern void gbSoundDisable(int);
|
|
||||||
extern int gbSoundGetEnable();
|
|
||||||
extern void gbSoundReset();
|
|
||||||
extern void gbSoundSaveGame(gzFile);
|
|
||||||
extern void gbSoundReadGame(int,gzFile);
|
|
||||||
extern void gbSoundEvent(register u16, register int);
|
|
||||||
extern void gbSoundSetQuality(int);
|
|
||||||
|
|
||||||
extern u8 gbSoundRead(u16 address);
|
// Emulates read from sound hardware
|
||||||
|
u8 gbSoundRead( u16 address );
|
||||||
|
|
||||||
extern int soundTicks;
|
// Notifies emulator that SOUND_CLOCK_TICKS clocks have passed
|
||||||
extern int soundQuality;
|
void gbSoundTick();
|
||||||
extern int SOUND_CLOCK_TICKS;
|
extern int SOUND_CLOCK_TICKS; // Number of 16.8 MHz clocks between calls to gbSoundTick()
|
||||||
|
extern int soundTicks; // Number of 16.8 MHz clocks until gbSoundTick() will be called
|
||||||
|
|
||||||
struct gb_effects_config_t
|
// Saves/loads emulator state
|
||||||
{
|
void gbSoundSaveGame( gzFile out );
|
||||||
bool enabled; // false = disable all effects
|
void gbSoundReadGame( int version, gzFile in );
|
||||||
|
|
||||||
float echo; // 0.0 = none, 1.0 = lots
|
#endif
|
||||||
float stereo; // 0.0 = channels in center, 1.0 = channels on left/right
|
|
||||||
bool surround; // true = put some channels in back
|
|
||||||
};
|
|
||||||
|
|
||||||
// Changes effects configuration
|
|
||||||
void gbSoundConfigEffects( gb_effects_config_t const& );
|
|
||||||
extern gb_effects_config_t gb_effects_config; // current configuration
|
|
||||||
|
|
Loading…
Reference in New Issue