Fixed the throttle selection on the SDL and XAudio2 backends. On the other backends, the throttle is a switch (selects between no throttle and throttling at 100% speed). Sync game to audio is now always enabled and the menu option has been removed.
git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@1418 a31d4220-a93d-0410-bf67-fe4944624d44
This commit is contained in:
parent
8b90328cdb
commit
1e13164dcc
|
@ -221,7 +221,6 @@ int speedupToggle;
|
||||||
int sunBars;
|
int sunBars;
|
||||||
int surfaceSizeX;
|
int surfaceSizeX;
|
||||||
int surfaceSizeY;
|
int surfaceSizeY;
|
||||||
int synchronize = false;
|
|
||||||
int threadPriority;
|
int threadPriority;
|
||||||
int tripleBuffering;
|
int tripleBuffering;
|
||||||
int useBios = 0;
|
int useBios = 0;
|
||||||
|
@ -524,7 +523,6 @@ void LoadConfig()
|
||||||
soundFiltering = (float)ReadPref("gbaSoundFiltering", 50) / 100.0f;
|
soundFiltering = (float)ReadPref("gbaSoundFiltering", 50) / 100.0f;
|
||||||
soundInterpolation = ReadPref("gbaSoundInterpolation", 1);
|
soundInterpolation = ReadPref("gbaSoundInterpolation", 1);
|
||||||
soundRecordDir = ReadPrefString("soundRecordDir");
|
soundRecordDir = ReadPrefString("soundRecordDir");
|
||||||
synchronize = ReadPref("synchronize", 1);
|
|
||||||
threadPriority = ReadPref("priority", 2);
|
threadPriority = ReadPref("priority", 2);
|
||||||
throttle = ReadPref("throttle", 0);
|
throttle = ReadPref("throttle", 0);
|
||||||
tripleBuffering = ReadPref("tripleBuffering", 0);
|
tripleBuffering = ReadPref("tripleBuffering", 0);
|
||||||
|
@ -1038,13 +1036,6 @@ int ReadOpts(int argc, char ** argv)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPT_SYNCHRONIZE:
|
|
||||||
// --synchronize
|
|
||||||
if (optarg) {
|
|
||||||
synchronize = atoi(optarg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_VIDEO_OPTION:
|
case OPT_VIDEO_OPTION:
|
||||||
// --video-option
|
// --video-option
|
||||||
if (optarg) {
|
if (optarg) {
|
||||||
|
|
|
@ -117,7 +117,6 @@ extern int speedupToggle;
|
||||||
extern int sunBars;
|
extern int sunBars;
|
||||||
extern int surfaceSizeX;
|
extern int surfaceSizeX;
|
||||||
extern int surfaceSizeY;
|
extern int surfaceSizeY;
|
||||||
extern int synchronize;
|
|
||||||
extern int threadPriority;
|
extern int threadPriority;
|
||||||
extern int tripleBuffering;
|
extern int tripleBuffering;
|
||||||
extern int useBios;
|
extern int useBios;
|
||||||
|
|
|
@ -18,15 +18,17 @@
|
||||||
#include "SoundSDL.h"
|
#include "SoundSDL.h"
|
||||||
#include "ConfigManager.h"
|
#include "ConfigManager.h"
|
||||||
#include "../gba/Globals.h"
|
#include "../gba/Globals.h"
|
||||||
|
#include "../gba/Sound.h"
|
||||||
|
|
||||||
extern int emulating;
|
extern int emulating;
|
||||||
|
|
||||||
// Hold up to 100 ms of data in the ring buffer
|
// Hold up to 32 ms of data in the ring buffer
|
||||||
const float SoundSDL::_delay = 0.1f;
|
const float SoundSDL::_delay = 0.032f;
|
||||||
|
|
||||||
SoundSDL::SoundSDL():
|
SoundSDL::SoundSDL():
|
||||||
_rbuf(0),
|
_rbuf(0),
|
||||||
_initialized(false)
|
_initialized(false),
|
||||||
|
current_rate(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -45,7 +47,7 @@ void SoundSDL::read(u16 * stream, int length)
|
||||||
/* since this is running in a different thread, speedup and
|
/* since this is running in a different thread, speedup and
|
||||||
* throttle can change at any time; save the value so locks
|
* throttle can change at any time; save the value so locks
|
||||||
* stay in sync */
|
* stay in sync */
|
||||||
bool lock = (emulating && !speedup && synchronize && !gba_joybus_active) ? true : false;
|
bool lock = (emulating && !speedup && throttle && !gba_joybus_active) ? true : false;
|
||||||
|
|
||||||
if (lock)
|
if (lock)
|
||||||
SDL_SemWait (_semBufferFull);
|
SDL_SemWait (_semBufferFull);
|
||||||
|
@ -74,7 +76,7 @@ void SoundSDL::write(u16 * finalWave, int length)
|
||||||
std::size_t avail;
|
std::size_t avail;
|
||||||
while ((avail = _rbuf.avail() / 2) < samples)
|
while ((avail = _rbuf.avail() / 2) < samples)
|
||||||
{
|
{
|
||||||
bool lock = (emulating && !speedup && synchronize && !gba_joybus_active) ? true : false;
|
bool lock = (emulating && !speedup && throttle && !gba_joybus_active) ? true : false;
|
||||||
|
|
||||||
_rbuf.write(finalWave, avail * 2);
|
_rbuf.write(finalWave, avail * 2);
|
||||||
|
|
||||||
|
@ -86,6 +88,12 @@ void SoundSDL::write(u16 * finalWave, int length)
|
||||||
if (lock)
|
if (lock)
|
||||||
{
|
{
|
||||||
SDL_SemWait(_semBufferEmpty);
|
SDL_SemWait(_semBufferEmpty);
|
||||||
|
if (throttle > 0 && throttle != current_rate)
|
||||||
|
{
|
||||||
|
SDL_CloseAudio();
|
||||||
|
init(soundGetSampleRate() * throttle / 100);
|
||||||
|
current_rate = throttle;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -119,10 +127,13 @@ bool SoundSDL::init(long sampleRate)
|
||||||
|
|
||||||
_rbuf.reset(_delay * sampleRate * 2);
|
_rbuf.reset(_delay * sampleRate * 2);
|
||||||
|
|
||||||
_mutex = SDL_CreateMutex();
|
if (!_initialized)
|
||||||
_semBufferFull = SDL_CreateSemaphore (0);
|
{
|
||||||
_semBufferEmpty = SDL_CreateSemaphore (1);
|
_mutex = SDL_CreateMutex();
|
||||||
_initialized = true;
|
_semBufferFull = SDL_CreateSemaphore (0);
|
||||||
|
_semBufferEmpty = SDL_CreateSemaphore (1);
|
||||||
|
_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -132,24 +143,9 @@ SoundSDL::~SoundSDL()
|
||||||
if (!_initialized)
|
if (!_initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SDL_mutexP(_mutex);
|
reset();
|
||||||
int iSave = emulating;
|
|
||||||
emulating = 0;
|
|
||||||
SDL_SemPost(_semBufferFull);
|
|
||||||
SDL_SemPost(_semBufferEmpty);
|
|
||||||
SDL_mutexV(_mutex);
|
|
||||||
|
|
||||||
SDL_DestroySemaphore(_semBufferFull);
|
_initialized = false;
|
||||||
SDL_DestroySemaphore(_semBufferEmpty);
|
|
||||||
_semBufferFull = NULL;
|
|
||||||
_semBufferEmpty = NULL;
|
|
||||||
|
|
||||||
SDL_DestroyMutex(_mutex);
|
|
||||||
_mutex = NULL;
|
|
||||||
|
|
||||||
SDL_CloseAudio();
|
|
||||||
|
|
||||||
emulating = iSave;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundSDL::pause()
|
void SoundSDL::pause()
|
||||||
|
@ -170,4 +166,22 @@ void SoundSDL::resume()
|
||||||
|
|
||||||
void SoundSDL::reset()
|
void SoundSDL::reset()
|
||||||
{
|
{
|
||||||
|
SDL_mutexP(_mutex);
|
||||||
|
int iSave = emulating;
|
||||||
|
emulating = 0;
|
||||||
|
SDL_SemPost(_semBufferFull);
|
||||||
|
SDL_SemPost(_semBufferEmpty);
|
||||||
|
SDL_mutexV(_mutex);
|
||||||
|
|
||||||
|
SDL_DestroySemaphore(_semBufferFull);
|
||||||
|
SDL_DestroySemaphore(_semBufferEmpty);
|
||||||
|
_semBufferFull = NULL;
|
||||||
|
_semBufferEmpty = NULL;
|
||||||
|
|
||||||
|
SDL_DestroyMutex(_mutex);
|
||||||
|
_mutex = NULL;
|
||||||
|
|
||||||
|
SDL_CloseAudio();
|
||||||
|
|
||||||
|
emulating = iSave;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ private:
|
||||||
SDL_sem *_semBufferFull;
|
SDL_sem *_semBufferFull;
|
||||||
SDL_sem *_semBufferEmpty;
|
SDL_sem *_semBufferEmpty;
|
||||||
|
|
||||||
|
int current_rate;
|
||||||
|
|
||||||
bool _initialized;
|
bool _initialized;
|
||||||
|
|
||||||
// Defines what delay in seconds we keep in the sound buffer
|
// Defines what delay in seconds we keep in the sound buffer
|
||||||
|
|
|
@ -240,7 +240,7 @@ void DirectSound::write(u16 * finalWave, int length)
|
||||||
LPVOID lpvPtr2;
|
LPVOID lpvPtr2;
|
||||||
DWORD dwBytes2 = 0;
|
DWORD dwBytes2 = 0;
|
||||||
|
|
||||||
if( !speedup && synchronize && !throttle && !gba_joybus_active) {
|
if( !speedup && throttle && !gba_joybus_active) {
|
||||||
hr = dsbSecondary->GetStatus(&status);
|
hr = dsbSecondary->GetStatus(&status);
|
||||||
if( status & DSBSTATUS_PLAYING ) {
|
if( status & DSBSTATUS_PLAYING ) {
|
||||||
if( !soundPaused ) {
|
if( !soundPaused ) {
|
||||||
|
|
|
@ -160,8 +160,6 @@ BEGIN_MESSAGE_MAP(MainWnd, CWnd)
|
||||||
ON_COMMAND(ID_OPTIONS_EMULATOR_DIRECTORIES, OnOptionsEmulatorDirectories)
|
ON_COMMAND(ID_OPTIONS_EMULATOR_DIRECTORIES, OnOptionsEmulatorDirectories)
|
||||||
ON_COMMAND(ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES, OnOptionsEmulatorDisablestatusmessages)
|
ON_COMMAND(ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES, OnOptionsEmulatorDisablestatusmessages)
|
||||||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES, OnUpdateOptionsEmulatorDisablestatusmessages)
|
ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_DISABLESTATUSMESSAGES, OnUpdateOptionsEmulatorDisablestatusmessages)
|
||||||
ON_COMMAND(ID_OPTIONS_EMULATOR_SYNCHRONIZE, OnOptionsEmulatorSynchronize)
|
|
||||||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_SYNCHRONIZE, OnUpdateOptionsEmulatorSynchronize)
|
|
||||||
ON_COMMAND(ID_OPTIONS_EMULATOR_PAUSEWHENINACTIVE, OnOptionsEmulatorPausewheninactive)
|
ON_COMMAND(ID_OPTIONS_EMULATOR_PAUSEWHENINACTIVE, OnOptionsEmulatorPausewheninactive)
|
||||||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_PAUSEWHENINACTIVE, OnUpdateOptionsEmulatorPausewheninactive)
|
ON_UPDATE_COMMAND_UI(ID_OPTIONS_EMULATOR_PAUSEWHENINACTIVE, OnUpdateOptionsEmulatorPausewheninactive)
|
||||||
ON_COMMAND(ID_OPTIONS_EMULATOR_SPEEDUPTOGGLE, OnOptionsEmulatorSpeeduptoggle)
|
ON_COMMAND(ID_OPTIONS_EMULATOR_SPEEDUPTOGGLE, OnOptionsEmulatorSpeeduptoggle)
|
||||||
|
|
|
@ -164,8 +164,6 @@ protected:
|
||||||
afx_msg void OnOptionsEmulatorDirectories();
|
afx_msg void OnOptionsEmulatorDirectories();
|
||||||
afx_msg void OnOptionsEmulatorDisablestatusmessages();
|
afx_msg void OnOptionsEmulatorDisablestatusmessages();
|
||||||
afx_msg void OnUpdateOptionsEmulatorDisablestatusmessages(CCmdUI* pCmdUI);
|
afx_msg void OnUpdateOptionsEmulatorDisablestatusmessages(CCmdUI* pCmdUI);
|
||||||
afx_msg void OnOptionsEmulatorSynchronize();
|
|
||||||
afx_msg void OnUpdateOptionsEmulatorSynchronize(CCmdUI* pCmdUI);
|
|
||||||
afx_msg void OnOptionsEmulatorPausewheninactive();
|
afx_msg void OnOptionsEmulatorPausewheninactive();
|
||||||
afx_msg void OnUpdateOptionsEmulatorPausewheninactive(CCmdUI* pCmdUI);
|
afx_msg void OnUpdateOptionsEmulatorPausewheninactive(CCmdUI* pCmdUI);
|
||||||
afx_msg void OnOptionsEmulatorSpeeduptoggle();
|
afx_msg void OnOptionsEmulatorSpeeduptoggle();
|
||||||
|
|
|
@ -581,18 +581,6 @@ void MainWnd::OnUpdateOptionsEmulatorDisablestatusmessages(CCmdUI* pCmdUI)
|
||||||
pCmdUI->SetCheck(disableStatusMessages);
|
pCmdUI->SetCheck(disableStatusMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWnd::OnOptionsEmulatorSynchronize()
|
|
||||||
{
|
|
||||||
synchronize = !synchronize;
|
|
||||||
if (synchronize)
|
|
||||||
throttle = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWnd::OnUpdateOptionsEmulatorSynchronize(CCmdUI* pCmdUI)
|
|
||||||
{
|
|
||||||
pCmdUI->SetCheck(synchronize);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWnd::OnOptionsEmulatorPausewheninactive()
|
void MainWnd::OnOptionsEmulatorPausewheninactive()
|
||||||
{
|
{
|
||||||
pauseWhenInactive = !pauseWhenInactive;
|
pauseWhenInactive = !pauseWhenInactive;
|
||||||
|
|
|
@ -281,7 +281,7 @@ void OpenAL::write(u16 * finalWave, int length)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !speedup && synchronize && !throttle && !gba_joybus_active) {
|
if( !speedup && throttle && !gba_joybus_active) {
|
||||||
// wait until at least one buffer has finished
|
// wait until at least one buffer has finished
|
||||||
while( nBuffersProcessed == 0 ) {
|
while( nBuffersProcessed == 0 ) {
|
||||||
winlog( " waiting...\n" );
|
winlog( " waiting...\n" );
|
||||||
|
|
|
@ -1403,7 +1403,6 @@ void VBA::loadSettings()
|
||||||
autoFrameSkip = regQueryDwordValue("autoFrameSkip", FALSE) ? TRUE : FALSE;
|
autoFrameSkip = regQueryDwordValue("autoFrameSkip", FALSE) ? TRUE : FALSE;
|
||||||
|
|
||||||
vsync = regQueryDwordValue("vsync", false) ? true : false ;
|
vsync = regQueryDwordValue("vsync", false) ? true : false ;
|
||||||
synchronize = regQueryDwordValue("synchronize", 1) ? true : false;
|
|
||||||
fullScreenStretch = regQueryDwordValue("stretch", 0) ? true : false;
|
fullScreenStretch = regQueryDwordValue("stretch", 0) ? true : false;
|
||||||
|
|
||||||
videoOption = regQueryDwordValue("video", VIDEO_3X);
|
videoOption = regQueryDwordValue("video", VIDEO_3X);
|
||||||
|
@ -2487,7 +2486,6 @@ void VBA::saveSettings()
|
||||||
|
|
||||||
regSetDwordValue("autoFrameSkip", autoFrameSkip);
|
regSetDwordValue("autoFrameSkip", autoFrameSkip);
|
||||||
regSetDwordValue("vsync", vsync);
|
regSetDwordValue("vsync", vsync);
|
||||||
regSetDwordValue("synchronize", synchronize);
|
|
||||||
regSetDwordValue("stretch", fullScreenStretch);
|
regSetDwordValue("stretch", fullScreenStretch);
|
||||||
|
|
||||||
regSetDwordValue("video", videoOption);
|
regSetDwordValue("video", videoOption);
|
||||||
|
|
|
@ -1760,8 +1760,6 @@ BEGIN
|
||||||
MENUITEM " Configuration...", ID_OUTPUTAPI_OALCONFIGURATION
|
MENUITEM " Configuration...", ID_OUTPUTAPI_OALCONFIGURATION
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "DirectSound 8", ID_OUTPUTAPI_DIRECTSOUND
|
MENUITEM "DirectSound 8", ID_OUTPUTAPI_DIRECTSOUND
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "&Sync game to audio", ID_OPTIONS_EMULATOR_SYNCHRONIZE
|
|
||||||
END
|
END
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Core Settings...", ID_AUDIO_CORE_SETTINGS
|
MENUITEM "Core Settings...", ID_AUDIO_CORE_SETTINGS
|
||||||
|
|
|
@ -451,7 +451,7 @@ void XAudio2_Output::write(u16 * finalWave, int length)
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// the maximum number of buffers is currently queued
|
// the maximum number of buffers is currently queued
|
||||||
if( synchronize && !speedup && !throttle && !gba_joybus_active ) {
|
if( !speedup && throttle && !gba_joybus_active ) {
|
||||||
// wait for one buffer to finish playing
|
// wait for one buffer to finish playing
|
||||||
if (WaitForSingleObject( notify.hBufferEndEvent, 10000 ) == WAIT_TIMEOUT) {
|
if (WaitForSingleObject( notify.hBufferEndEvent, 10000 ) == WAIT_TIMEOUT) {
|
||||||
device_changed = true;
|
device_changed = true;
|
||||||
|
|
|
@ -733,7 +733,6 @@
|
||||||
#define ID_OPTIONS_VIDEO_X5 40014
|
#define ID_OPTIONS_VIDEO_X5 40014
|
||||||
#define ID_OPTIONS_VIDEO_X6 40015
|
#define ID_OPTIONS_VIDEO_X6 40015
|
||||||
#define ID_OPTIONS_JOYPAD 40016
|
#define ID_OPTIONS_JOYPAD 40016
|
||||||
#define ID_OPTIONS_EMULATOR_SYNCHRONIZE 40017
|
|
||||||
#define ID_FILE_RESET 40018
|
#define ID_FILE_RESET 40018
|
||||||
#define ID_FILE_LOAD 40019
|
#define ID_FILE_LOAD 40019
|
||||||
#define ID_OPTIONS_SOUND_DIRECTSOUNDA 40020
|
#define ID_OPTIONS_SOUND_DIRECTSOUNDA 40020
|
||||||
|
|
|
@ -2323,12 +2323,6 @@ EVT_HANDLER(SkipIntro, "Skip BIOS initialization")
|
||||||
update_opts();
|
update_opts();
|
||||||
}
|
}
|
||||||
|
|
||||||
EVT_HANDLER(SyncGameAudio, "Synchronize game to audio")
|
|
||||||
{
|
|
||||||
GetMenuOptionInt("SyncGameAudio", synchronize, 1);
|
|
||||||
update_opts();
|
|
||||||
}
|
|
||||||
|
|
||||||
EVT_HANDLER(BootRomEn, "Use the specified BIOS file for GBA")
|
EVT_HANDLER(BootRomEn, "Use the specified BIOS file for GBA")
|
||||||
{
|
{
|
||||||
GetMenuOptionInt("BootRomEn", useBiosFileGBA, 1);
|
GetMenuOptionInt("BootRomEn", useBiosFileGBA, 1);
|
||||||
|
|
|
@ -239,7 +239,7 @@ void DirectSound::write(u16 * finalWave, int length)
|
||||||
LPVOID lpvPtr2;
|
LPVOID lpvPtr2;
|
||||||
DWORD dwBytes2 = 0;
|
DWORD dwBytes2 = 0;
|
||||||
|
|
||||||
if (!speedup && synchronize && !throttle && !gba_joybus_active) {
|
if (!speedup && throttle && !gba_joybus_active) {
|
||||||
hr = dsbSecondary->GetStatus(&status);
|
hr = dsbSecondary->GetStatus(&status);
|
||||||
if( status & DSBSTATUS_PLAYING ) {
|
if( status & DSBSTATUS_PLAYING ) {
|
||||||
if( !soundPaused ) {
|
if( !soundPaused ) {
|
||||||
|
|
|
@ -290,7 +290,7 @@ void OpenAL::write(u16 * finalWave, int length)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!speedup && synchronize && !throttle && !gba_joybus_active) {
|
if (!speedup && throttle && !gba_joybus_active) {
|
||||||
// wait until at least one buffer has finished
|
// wait until at least one buffer has finished
|
||||||
while( nBuffersProcessed == 0 ) {
|
while( nBuffersProcessed == 0 ) {
|
||||||
winlog( " waiting...\n" );
|
winlog( " waiting...\n" );
|
||||||
|
|
|
@ -225,7 +225,6 @@ opt_desc opts[] = {
|
||||||
INTOPT ("preferences/skipBios", "SkipIntro", wxTRANSLATE("Skip BIOS initialization"), skipBios, 0, 1),
|
INTOPT ("preferences/skipBios", "SkipIntro", wxTRANSLATE("Skip BIOS initialization"), skipBios, 0, 1),
|
||||||
INTOPT ("preferences/skipSaveGameCheats", "", wxTRANSLATE("Do not overwrite cheat list when loading state"), skipSaveGameCheats, 0, 1),
|
INTOPT ("preferences/skipSaveGameCheats", "", wxTRANSLATE("Do not overwrite cheat list when loading state"), skipSaveGameCheats, 0, 1),
|
||||||
INTOPT ("preferences/skipSaveGameBattery", "", wxTRANSLATE("Do not overwrite native (battery) save when loading state"), skipSaveGameBattery, 0, 1),
|
INTOPT ("preferences/skipSaveGameBattery", "", wxTRANSLATE("Do not overwrite native (battery) save when loading state"), skipSaveGameBattery, 0, 1),
|
||||||
INTOPT ("preferences/synchronize", "SyncGameAudio", wxTRANSLATE("Synchronize game to audio"), synchronize, 0, 1),
|
|
||||||
INTOPT ("preferences/throttle", "", wxTRANSLATE("Throttle game speed, even when accelerated (0-1000%, 0 = disabled)"), throttle, 0, 1000),
|
INTOPT ("preferences/throttle", "", wxTRANSLATE("Throttle game speed, even when accelerated (0-1000%, 0 = disabled)"), throttle, 0, 1000),
|
||||||
INTOPT ("preferences/useBiosGB", "BootRomGB", wxTRANSLATE("Use the specified BIOS file for GB"), useBiosFileGB, 0, 1),
|
INTOPT ("preferences/useBiosGB", "BootRomGB", wxTRANSLATE("Use the specified BIOS file for GB"), useBiosFileGB, 0, 1),
|
||||||
INTOPT ("preferences/useBiosGBA", "BootRomEn", wxTRANSLATE("Use the specified BIOS file"), useBiosFileGBA, 0, 1),
|
INTOPT ("preferences/useBiosGBA", "BootRomEn", wxTRANSLATE("Use the specified BIOS file"), useBiosFileGBA, 0, 1),
|
||||||
|
|
|
@ -506,7 +506,7 @@ void XAudio2_Output::write(u16 * finalWave, int length)
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// the maximum number of buffers is currently queued
|
// the maximum number of buffers is currently queued
|
||||||
if( synchronize && !speedup && !throttle && !gba_joybus_active ) {
|
if( !speedup && throttle && !gba_joybus_active ) {
|
||||||
// wait for one buffer to finish playing
|
// wait for one buffer to finish playing
|
||||||
if (WaitForSingleObject( notify.hBufferEndEvent, 10000 ) == WAIT_TIMEOUT) {
|
if (WaitForSingleObject( notify.hBufferEndEvent, 10000 ) == WAIT_TIMEOUT) {
|
||||||
device_changed = true;
|
device_changed = true;
|
||||||
|
|
|
@ -235,10 +235,6 @@
|
||||||
<label>_VSync</label>
|
<label>_VSync</label>
|
||||||
<checkable>1</checkable>
|
<checkable>1</checkable>
|
||||||
</object>
|
</object>
|
||||||
<object class="wxMenuItem" name="SyncGameAudio">
|
|
||||||
<label>_Audio sync</label>
|
|
||||||
<checkable>1</checkable>
|
|
||||||
</object>
|
|
||||||
<object class="wxMenuItem" name="FrameSkipAuto">
|
<object class="wxMenuItem" name="FrameSkipAuto">
|
||||||
<label>_Auto skip frames</label>
|
<label>_Auto skip frames</label>
|
||||||
<checkable>1</checkable>
|
<checkable>1</checkable>
|
||||||
|
|
Loading…
Reference in New Issue