Sound code clean up

git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@642 a31d4220-a93d-0410-bf67-fe4944624d44
This commit is contained in:
spacy51 2008-08-26 23:45:34 +00:00
parent 54bd8abb82
commit 7141f3197f
9 changed files with 123 additions and 127 deletions

View File

@ -58,9 +58,11 @@ int soundQuality = 2;
int soundInterpolation = 0;
float soundFiltering = 1;
static float soundFiltering_;
int soundVolume = 0;
static int soundVolume_;
int soundEnableFlag = 0x3ff; // emulator channels enabled
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_;
@ -69,7 +71,6 @@ int soundTicks = SOUND_CLOCK_TICKS_;
u16 soundFinalWave [1470];
int soundBufferLen = sizeof soundFinalWave;
int soundDebug = 0;
bool soundPaused = true;
void interp_rate() { /* empty for now */ }
@ -297,20 +298,16 @@ static void apply_volume( bool apu_only = false )
if ( !apu_only )
soundVolume_ = soundVolume;
// Emulator volume
static float const vols [6] = { 1, 2, 3, 4, 0.25, 0.5 };
double const volume = vols [soundVolume_];
if ( gb_apu )
{
static float const apu_vols [4] = { 0.25, 0.5, 1, 0.25 };
gb_apu->volume( volume * apu_vols [ioMem [SGCNT0_H] & 3] );
gb_apu->volume( soundVolume_ * apu_vols [ioMem [SGCNT0_H] & 3] );
}
if ( !apu_only )
{
for ( int i = 0; i < 3; i++ )
pcm_synth [i].volume( 0.66 / 256 * volume );
pcm_synth [i].volume( 0.66 / 256 * soundVolume_ );
}
}
@ -381,13 +378,10 @@ static void flush_samples()
while ( stereo_buffer->samples_avail() >= out_buf_size )
{
stereo_buffer->read_samples( (blip_sample_t*) soundFinalWave, out_buf_size );
if(systemSoundOn)
{
if(soundPaused)
soundResume();
if(soundPaused)
soundResume();
systemWriteDataToSoundBuffer();
}
systemWriteDataToSoundBuffer();
}
}
@ -407,9 +401,9 @@ static void apply_filtering()
}
}
static void soundTick()
void psoundTickfn()
{
if ( systemSoundOn && gb_apu && stereo_buffer )
if ( gb_apu && stereo_buffer )
{
// Run sound hardware to present
end_frame( SOUND_CLOCK_TICKS );
@ -424,8 +418,6 @@ static void soundTick()
}
}
void (*psoundTickfn)() = soundTick;
static void apply_muting()
{
if ( !stereo_buffer || !ioMem )
@ -492,16 +484,6 @@ static void remake_stereo_buffer()
apply_volume();
}
void setsystemSoundOn(bool value)
{
systemSoundOn = value;
}
void setsoundPaused(bool value)
{
soundPaused = value;
}
void soundShutdown()
{
systemSoundShutdown();
@ -509,28 +491,32 @@ void soundShutdown()
void soundPause()
{
soundPaused = true;
systemSoundPause();
setsoundPaused(true);
}
void soundResume()
{
soundPaused = false;
systemSoundResume();
setsoundPaused(false);
}
void soundEnable(int channels)
void soundSetVolume( float volume )
{
soundVolume = volume;
}
float soundGetVolume()
{
return soundVolume;
}
void soundSetEnable(int channels)
{
soundEnableFlag = channels;
apply_muting();
}
void soundDisable(int channels)
{
soundEnableFlag &= ~channels;
apply_muting();
}
int soundGetEnable()
{
return (soundEnableFlag & 0x30f);
@ -543,7 +529,7 @@ void soundReset()
remake_stereo_buffer();
reset_apu();
setsoundPaused(true);
soundPaused = true;
SOUND_CLOCK_TICKS = SOUND_CLOCK_TICKS_;
soundTicks = SOUND_CLOCK_TICKS_;
@ -789,7 +775,7 @@ static void soundReadGameOld( gzFile in, int version )
pcm [0].dac = state.soundDSAValue;
pcm [1].dac = state.soundDSBValue;
int quality = utilReadInt( in ); // ignore this crap
(void) utilReadInt( in ); // ignore quality
}
#include <stdio.h>

View File

@ -1,64 +1,80 @@
// -*- C++ -*-
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
// Copyright (C) 1999-2003 Forgotten
// Copyright (C) 2004 Forgotten and the VBA development team
// Copyright (C) 2004-2006 VBA development team
// Copyright (C) 2007-2008 VBA-M development team
// 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.
// GBA sound emulation
#ifndef VBA_SOUND_H
#define VBA_SOUND_H
#include "System.h"
//// Setup/options
// 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();
// Manages muting bitmask. The bits control the following channels:
// 0x001 Pulse 1
// 0x002 Pulse 2
// 0x004 Wave
// 0x008 Noise
// 0x100 GBA left
// 0x200 GBA right
void soundSetEnable( int mask );
int soundGetEnable();
// Pauses/resumes system sound output
void soundPause();
void soundResume();
extern bool soundPaused; // current paused state
// Cleans up sound. Afterwards, soundInit() can be called again.
void soundShutdown();
// Sound buffering
extern int soundBufferLen; // size of sound buffer in BYTES
extern u16 soundFinalWave[1470];// 16-bit SIGNED stereo sample buffer
// 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 register addresses
#define SGCNT0_H 0x82
#define FIFOA_L 0xa0
#define FIFOA_H 0xa2
#define FIFOB_L 0xa4
#define FIFOB_H 0xa6
extern void (*psoundTickfn)();
extern void soundShutdown();
extern bool soundInit();
extern void soundPause();
extern void soundResume();
extern void soundEnable(int);
extern void soundDisable(int);
extern int soundGetEnable();
extern void soundReset();
extern void soundSaveGame(gzFile);
extern void soundReadGame(gzFile, int);
extern void soundEvent(u32, u8);
extern void soundEvent(u32, u16);
extern void soundTimerOverflow(int);
extern void soundSetQuality(int);
extern void setsystemSoundOn(bool value);
extern void setsoundPaused(bool value);
extern void interp_rate();
// Resets emulated sound hardware
void soundReset();
// Emulates write to sound hardware
void soundEvent( u32 addr, u8 data );
void soundEvent( u32 addr, u16 data ); // TODO: error-prone to overload like this
// Notifies emulator that a timer has overflowed
void soundTimerOverflow( int which );
// Notifies emulator that PCM rate may have changed
void interp_rate();
// Notifies emulator that SOUND_CLOCK_TICKS clocks have passed
void psoundTickfn();
extern int SOUND_CLOCK_TICKS; // Number of 16.8 MHz clocks between calls to soundTick()
extern int soundTicks; // Number of 16.8 MHz clocks until soundTick() will be called
extern int soundQuality; // sample rate = 44100 / soundQuality
extern int soundBufferLen; // size of sound buffer in BYTES
extern u16 soundFinalWave[1470];// 16-bit SIGNED stereo sample buffer
extern int soundVolume; // emulator volume code (not linear)
extern int soundInterpolation; // 1 if PCM should have low-pass filtering
extern float soundFiltering; // 0.0 = none, 1.0 = max (only if soundInterpolation!=0)
// Unknown purpose
extern bool soundPaused;
// Saves/loads emulator state
void soundSaveGame( gzFile );
void soundReadGame( gzFile, int version );
#endif // VBA_SOUND_H

View File

@ -26,11 +26,12 @@
#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 soundVolume;
extern int gbHardware;
@ -82,13 +83,10 @@ static void flush_samples()
while ( stereo_buffer->samples_avail() >= out_buf_size )
{
stereo_buffer->read_samples( (blip_sample_t*) soundFinalWave, out_buf_size );
if(systemSoundOn)
{
if(soundPaused)
soundResume();
if(soundPaused)
soundResume();
systemWriteDataToSoundBuffer();
}
systemWriteDataToSoundBuffer();
}
}
@ -97,8 +95,11 @@ int const chan_count = 4;
gb_effects_config_t gb_effects_config;
static gb_effects_config_t gb_effects_config_current;
static int prevSoundEnable = -1;
static void apply_effects()
{
prevSoundEnable = soundGetEnable();
gb_effects_config_current = gb_effects_config;
stereo_buffer->config().enabled = gb_effects_config_current.enabled;
@ -109,7 +110,9 @@ static void apply_effects()
for ( int i = 0; i < chan_count; i++ )
{
Multi_Buffer::channel_t ch = stereo_buffer->channel( i );
Multi_Buffer::channel_t ch = { 0, 0, 0 };
if ( prevSoundEnable >> i & 1 )
ch = stereo_buffer->channel( i );
gb_apu->set_output( ch.center, ch.left, ch.right, i );
}
}
@ -121,7 +124,7 @@ void gbSoundConfigEffects( gb_effects_config_t const& c )
void gbSoundTick()
{
if ( systemSoundOn && gb_apu && stereo_buffer )
if ( gb_apu && stereo_buffer )
{
// Run sound hardware to present
end_frame( SOUND_CLOCK_TICKS * ticks_to_time );
@ -130,7 +133,7 @@ void gbSoundTick()
// Update effects config if it was changed
if ( memcmp( &gb_effects_config_current, &gb_effects_config,
sizeof gb_effects_config ) )
sizeof gb_effects_config ) || soundGetEnable() != prevSoundEnable )
apply_effects();
}
}

View File

@ -17,9 +17,6 @@
// along with this program; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef GBSOUND_H
#define GBSOUND_H
#define NR10 0xff10
#define NR11 0xff11
#define NR12 0xff12
@ -75,5 +72,3 @@ struct gb_effects_config_t
// Changes effects configuration
void gbSoundConfigEffects( gb_effects_config_t const& );
extern gb_effects_config_t gb_effects_config; // current configuration
#endif

View File

@ -35,7 +35,6 @@
#include <dsound.h>
extern bool soundBufferLow;
extern void setsystemSoundOn(bool value);
class DirectSound : public ISound
{
@ -206,7 +205,6 @@ bool DirectSound::init()
return false;
}
setsystemSoundOn(true);
return true;
}
@ -279,9 +277,10 @@ void DirectSound::write()
}
}
}
} else {
}/* else {
// TODO: remove?
setsoundPaused(true);
}
}*/
}

View File

@ -802,13 +802,16 @@ void MainWnd::OnUpdateOptionsEmulatorBmpformat(CCmdUI* pCmdUI)
void MainWnd::OnOptionsSoundMute()
{
soundDisable(0x30f);
if( 0 == soundGetEnable() ) {
soundSetEnable( 0x30f );
} else {
soundSetEnable( 0x000 );
}
}
void MainWnd::OnUpdateOptionsSoundMute(CCmdUI* pCmdUI)
{
int active = soundGetEnable() & 0x30f;
pCmdUI->SetCheck(active == 0);
pCmdUI->SetCheck( 0 == soundGetEnable() );
}
void MainWnd::OnAudioEffects()
@ -876,34 +879,35 @@ void MainWnd::OnUpdateOptionsSound44khz(CCmdUI* pCmdUI)
BOOL MainWnd::OnOptionsSoundVolume(UINT nID)
{
soundVolume = nID - ID_OPTIONS_SOUND_VOLUME_1X;
return TRUE;
UINT soundVolume = nID - ID_OPTIONS_SOUND_VOLUME_1X;
soundSetVolume( (float)soundVolume );
return TRUE;
}
void MainWnd::OnUpdateOptionsSoundVolume(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(soundVolume == (int)(pCmdUI->m_nID - ID_OPTIONS_SOUND_VOLUME_1X));
pCmdUI->SetCheck( soundGetVolume() == (float)(pCmdUI->m_nID - ID_OPTIONS_SOUND_VOLUME_1X) );
}
void MainWnd::OnOptionsSoundVolume25x()
{
soundVolume = 4;
soundSetVolume( 0.25f );
}
void MainWnd::OnUpdateOptionsSoundVolume25x(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(soundVolume == 4);
pCmdUI->SetCheck( 0.25f == soundGetVolume() );
}
void MainWnd::OnOptionsSoundVolume5x()
{
soundVolume = 5;
soundSetVolume( 0.5f );
}
void MainWnd::OnUpdateOptionsSoundVolume5x(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(soundVolume == 5);
pCmdUI->SetCheck( 0.5f == soundGetVolume() );
}
void MainWnd::updateSoundChannels(UINT id)
@ -935,8 +939,7 @@ void MainWnd::updateSoundChannels(UINT id)
else
active |= flag;
soundEnable(active);
soundDisable((~active)&0x30f);
soundSetEnable(active);
}
void MainWnd::OnOptionsSoundChannel1()

View File

@ -197,7 +197,6 @@ bool OpenAL::init()
soundBufferLen = ( freq / 60 ) * 4;
setsystemSoundOn( true );
initialized = true;
return true;
}

View File

@ -1585,15 +1585,11 @@ void VBA::loadSettings()
}
int res = regQueryDwordValue("soundEnable", 0x30f);
soundEnable(res);
soundDisable(~res);
soundSetEnable(res);
soundQuality = regQueryDwordValue("soundQuality", 1);
soundVolume = regQueryDwordValue("soundVolume", 0);
if(soundVolume < 0 || soundVolume > 5)
soundVolume = 0;
soundSetVolume( (float)(regQueryDwordValue("soundVolume", 100)) / 100.0f );
soundInterpolation = regQueryDwordValue("soundInterpolation", 0);
if(soundInterpolation < 0 || soundInterpolation > 1)
@ -2585,7 +2581,7 @@ void VBA::saveSettings()
regSetDwordValue("soundQuality", soundQuality);
regSetDwordValue("soundVolume", soundVolume);
regSetDwordValue("soundVolume", (DWORD)(soundGetVolume() * 100.0f));
regSetDwordValue("soundInterpolation", soundInterpolation);
regSetDwordValue("tripleBuffering", tripleBuffering);

View File

@ -289,7 +289,6 @@ bool XAudio2_Output::init()
playing = true;
setsystemSoundOn( true );
initialized = true;
return true;
}