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:
spacy51 2008-08-28 22:06:48 +00:00
parent f76a2165ef
commit cc32c6b12f
4 changed files with 104 additions and 104 deletions

View File

@ -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 */ }

View File

@ -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

View File

@ -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 );

View File

@ -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