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) 2004 Forgotten and the 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
// it under the terms of the GNU General Public License as published by
// 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,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <memory.h>
#include <string.h>
#include "Sound.h"
@ -54,24 +55,22 @@
extern bool stopState; // TODO: silence sound when true
int soundQuality = 2;
int soundInterpolation = 0;
float soundFiltering = 1;
static float soundFiltering_;
float soundVolume = 1;
static float soundVolume_ = -1;
bool soundEcho = false;
int const SOUND_CLOCK_TICKS_ = 167772; // 1/100 second
static int soundEnableFlag = 0x3ff; // emulator channels enabled
u16 soundFinalWave [1470];
int soundBufferLen = sizeof soundFinalWave;
int soundQuality = 2;
int soundInterpolation = 0;
bool soundPaused = true;
float soundFiltering = 1;
float soundVolume = 1;
bool soundEcho = false;
int SOUND_CLOCK_TICKS = SOUND_CLOCK_TICKS_;
int soundTicks = SOUND_CLOCK_TICKS_;
int const SOUND_CLOCK_TICKS_ = 167772;
int SOUND_CLOCK_TICKS = SOUND_CLOCK_TICKS_;
int soundTicks = SOUND_CLOCK_TICKS_;
u16 soundFinalWave [1470];
int soundBufferLen = sizeof soundFinalWave;
bool soundPaused = true;
static int soundEnableFlag = 0x3ff; // emulator channels enabled
static float soundFiltering_ = -1;
static float soundVolume_ = -1;
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
#define VBA_SOUND_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
// current value in soundQuality global.
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
void soundSetVolume( float );
float soundGetVolume();
@ -24,8 +20,8 @@ float soundGetVolume();
// 0x002 Pulse 2
// 0x004 Wave
// 0x008 Noise
// 0x100 GBA left
// 0x200 GBA right
// 0x100 PCM 1
// 0x200 PCM 2
void soundSetEnable( int mask );
int soundGetEnable();
@ -41,14 +37,21 @@ void soundShutdown();
extern int soundBufferLen; // size of sound buffer in BYTES
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
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)
//// Emulation
//// GBA sound emulation
// GBA register addresses
// GBA sound registers
#define SGCNT0_H 0x82
#define FIFOA_L 0xa0
#define FIFOA_H 0xa2

View File

@ -2,6 +2,8 @@
// Copyright (C) 1999-2003 Forgotten
// Copyright (C) 2005-2006 Forgotten and the VBA 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
// it under the terms of the GNU General Public License as published by
// 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,
// 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 "gbGlobals.h"
#include "gbSound.h"
@ -26,23 +28,18 @@
#include "gb_apu/Gb_Apu.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 void soundResume();
gb_effects_config_t gb_effects_config = { false, 0.20f, 0.15f, false };
extern int soundBufferLen;
extern int soundQuality;
extern bool soundPaused;
extern int soundTicks;
extern int SOUND_CLOCK_TICKS;
static gb_effects_config_t gb_effects_config_current;
static Simple_Effects_Buffer* stereo_buffer;
static Gb_Apu* gb_apu;
static float soundVolume_ = -1;
static int prevSoundEnable = -1;
int const chan_count = 4;
int const ticks_to_time = 2 * GB_APU_OVERCLOCK;
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()
{
prevSoundEnable = soundGetEnable();
@ -122,6 +112,14 @@ void gbSoundConfigEffects( gb_effects_config_t const& c )
gb_effects_config = c;
}
static void apply_volume()
{
soundVolume_ = soundGetVolume();
if ( gb_apu )
gb_apu->volume( soundVolume_ );
}
void gbSoundTick()
{
if ( gb_apu && stereo_buffer )
@ -135,6 +133,9 @@ void gbSoundTick()
if ( memcmp( &gb_effects_config_current, &gb_effects_config,
sizeof gb_effects_config ) || soundGetEnable() != prevSoundEnable )
apply_effects();
if ( soundVolume_ != soundGetVolume() )
apply_volume();
}
}
@ -160,7 +161,7 @@ static void remake_stereo_buffer()
stereo_buffer = 0;
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 );
// APU
@ -168,20 +169,21 @@ static void remake_stereo_buffer()
Multi_Buffer::wave_type+1, Multi_Buffer::wave_type+2,
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 )
{
gb_apu = new Gb_Apu;
gb_apu = new Gb_Apu; // TODO: handle errors
reset_apu();
}
apply_effects();
apply_volume();
}
void gbSoundReset()
{
SOUND_CLOCK_TICKS = 20000;
SOUND_CLOCK_TICKS = 20000; // 1/100 second
remake_stereo_buffer();
reset_apu();
@ -221,9 +223,6 @@ void gbSoundReset()
}
}
extern bool soundInit();
extern void soundShutdown();
void gbSoundSetQuality(int quality)
{
if ( soundQuality != quality )
@ -364,7 +363,7 @@ static void gbSoundReadGameOld(int version,gzFile gzFile)
// Load state
utilReadData( gzFile, gbsound_format );
if ( version >= 11 )
if ( version >= 11 ) // TODO: never executed; remove?
utilReadData( gzFile, gbsound_format2 );
utilReadData( gzFile, gbsound_format3 );

View File

@ -1,22 +1,34 @@
// -*- C++ -*-
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
// Copyright (C) 1999-2003 Forgotten
// Copyright (C) 2004 Forgotten and the VBA development team
// GB sound emulation
// 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, 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.
#ifndef VBA_GBSOUND_H
#define VBA_GBSOUND_H
// 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 NR11 0xff11
#define NR12 0xff12
@ -39,36 +51,23 @@
#define NR51 0xff25
#define NR52 0xff26
#define SOUND_EVENT(address,value) \
gbSoundEvent(address,value)
// Resets emulated sound hardware
void gbSoundReset();
extern void gbSoundTick();
extern void gbSoundPause();
extern void gbSoundResume();
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);
// Emulates write to sound hardware
void gbSoundEvent( u16 address, int data );
#define SOUND_EVENT gbSoundEvent
extern u8 gbSoundRead(u16 address);
// Emulates read from sound hardware
u8 gbSoundRead( u16 address );
extern int soundTicks;
extern int soundQuality;
extern int SOUND_CLOCK_TICKS;
// Notifies emulator that SOUND_CLOCK_TICKS clocks have passed
void gbSoundTick();
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
{
bool enabled; // false = disable all effects
// Saves/loads emulator state
void gbSoundSaveGame( gzFile out );
void gbSoundReadGame( int version, gzFile in );
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
#endif