added buffer count selection to OpenAL config dialog. default is 5

git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@211 a31d4220-a93d-0410-bf67-fe4944624d44
This commit is contained in:
spacy51 2007-12-16 01:12:49 +00:00
parent d796bebb0b
commit 92f63b3f7f
8 changed files with 66 additions and 22 deletions

View File

@ -2009,8 +2009,13 @@ void MainWnd::OnOutputapiOalconfiguration()
OALConfig dlg; OALConfig dlg;
dlg.selectedDevice = theApp.oalDevice; dlg.selectedDevice = theApp.oalDevice;
dlg.bufferCount = theApp.oalBufferCount;
if( dlg.DoModal() == IDOK ) { if( dlg.DoModal() == IDOK ) {
systemSoundShutdown();
// do this before changing any values OpenAL
// might need for successful cleanup
if( theApp.oalDevice ) { if( theApp.oalDevice ) {
free( theApp.oalDevice ); free( theApp.oalDevice );
theApp.oalDevice = NULL; theApp.oalDevice = NULL;
@ -2018,8 +2023,8 @@ void MainWnd::OnOutputapiOalconfiguration()
theApp.oalDevice = (TCHAR*)malloc( (dlg.selectedDevice.GetLength() + 1) * sizeof( TCHAR ) ); theApp.oalDevice = (TCHAR*)malloc( (dlg.selectedDevice.GetLength() + 1) * sizeof( TCHAR ) );
_tcscpy( theApp.oalDevice, dlg.selectedDevice.GetBuffer() ); _tcscpy( theApp.oalDevice, dlg.selectedDevice.GetBuffer() );
theApp.oalBufferCount = dlg.bufferCount;
systemSoundShutdown();
systemSoundInit(); systemSoundInit();
} }
#endif #endif

View File

@ -19,6 +19,7 @@ IMPLEMENT_DYNAMIC(OALConfig, CDialog)
OALConfig::OALConfig(CWnd* pParent /*=NULL*/) OALConfig::OALConfig(CWnd* pParent /*=NULL*/)
: CDialog(OALConfig::IDD, pParent) : CDialog(OALConfig::IDD, pParent)
, selectedDevice(_T("")) , selectedDevice(_T(""))
, bufferCount(0)
{ {
if( !LoadOAL10Library( NULL, &ALFunction ) ) { if( !LoadOAL10Library( NULL, &ALFunction ) ) {
systemMessage( IDS_OAL_NODLL, "OpenAL32.dll could not be found on your system. Please install the runtime from http://openal.org" ); systemMessage( IDS_OAL_NODLL, "OpenAL32.dll could not be found on your system. Please install the runtime from http://openal.org" );
@ -32,7 +33,7 @@ OALConfig::~OALConfig()
void OALConfig::DoDataExchange(CDataExchange* pDX) void OALConfig::DoDataExchange(CDataExchange* pDX)
{ {
CDialog::DoDataExchange(pDX); CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_DEVICE, cbDevice); DDX_Control(pDX, IDC_DEVICE, m_cbDevice);
if( !pDX->m_bSaveAndValidate ) { if( !pDX->m_bSaveAndValidate ) {
// enumerate devices // enumerate devices
@ -40,7 +41,7 @@ void OALConfig::DoDataExchange(CDataExchange* pDX)
devices = ALFunction.alcGetString( NULL, ALC_DEVICE_SPECIFIER ); devices = ALFunction.alcGetString( NULL, ALC_DEVICE_SPECIFIER );
if( strlen( devices ) ) { if( strlen( devices ) ) {
while( *devices ) { while( *devices ) {
cbDevice.AddString( devices ); m_cbDevice.AddString( devices );
devices += strlen( devices ) + 1; devices += strlen( devices ) + 1;
} }
} else { } else {
@ -48,23 +49,43 @@ void OALConfig::DoDataExchange(CDataExchange* pDX)
} }
} }
DDX_CBString(pDX, IDC_DEVICE, selectedDevice); DDX_CBString(pDX, IDC_DEVICE, selectedDevice);
DDX_Control(pDX, IDC_SLIDER_BUFFERCOUNT, m_sliderBufferCount);
DDX_Slider(pDX, IDC_SLIDER_BUFFERCOUNT, bufferCount);
DDX_Control(pDX, IDC_BUFFERINFO, m_bufferInfo);
} }
BOOL OALConfig::OnInitDialog() BOOL OALConfig::OnInitDialog()
{ {
CDialog::OnInitDialog(); CDialog::OnInitDialog();
m_sliderBufferCount.SetRange( 2, 10, FALSE );
m_sliderBufferCount.SetTicFreq( 1 );
m_sliderBufferCount.SetPos( bufferCount );
CString info;
int pos = m_sliderBufferCount.GetPos();
info.Format( _T("%i frames = %.2f ms"), pos, (float)pos / 60.0f * 1000.0f );
m_bufferInfo.SetWindowText( info );
return TRUE; return TRUE;
} }
BEGIN_MESSAGE_MAP(OALConfig, CDialog) BEGIN_MESSAGE_MAP(OALConfig, CDialog)
ON_WM_HSCROLL()
END_MESSAGE_MAP() END_MESSAGE_MAP()
// OALConfig message handlers // OALConfig message handlers
#endif #endif
void OALConfig::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CString info;
int pos = m_sliderBufferCount.GetPos();
info.Format( _T("%i frames = %.2f ms"), pos, (float)pos / 60.0f * 1000.0f );
m_bufferInfo.SetWindowText( info );
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

View File

@ -7,6 +7,7 @@
#include <al.h> #include <al.h>
#include <alc.h> #include <alc.h>
#include "LoadOAL.h" #include "LoadOAL.h"
#include "afxcmn.h"
// OALConfig dialog // OALConfig dialog
@ -28,10 +29,14 @@ protected:
DECLARE_MESSAGE_MAP() DECLARE_MESSAGE_MAP()
private: private:
CComboBox cbDevice;
OPENALFNTABLE ALFunction; OPENALFNTABLE ALFunction;
CComboBox m_cbDevice;
CSliderCtrl m_sliderBufferCount;
CStatic m_bufferInfo;
public: public:
CString selectedDevice; CString selectedDevice;
int bufferCount;
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
}; };
#endif #endif

View File

@ -17,6 +17,11 @@
#ifndef NO_OAL #ifndef NO_OAL
// === LOGALL writes very detailed informations to vba-trace.log ===
//#define LOGALL
#include "stdafx.h" // includes VBA.h for 'theApp.throttle' #include "stdafx.h" // includes VBA.h for 'theApp.throttle'
// Interface // Interface
@ -37,11 +42,6 @@
// Debug // Debug
#include <assert.h> #include <assert.h>
#define NBUFFERS 5
//#define LOGALL
// LOGALL writes very detailed informations to vba-trace.log
#ifndef LOGALL #ifndef LOGALL
#define winlog // #define winlog //
#define debugState() // #define debugState() //
@ -65,7 +65,7 @@ private:
bool buffersLoaded; bool buffersLoaded;
ALCdevice *device; ALCdevice *device;
ALCcontext *context; ALCcontext *context;
ALuint buffer[NBUFFERS]; ALuint *buffer;
ALuint tempBuffer; ALuint tempBuffer;
ALuint source; ALuint source;
int freq; int freq;
@ -82,7 +82,8 @@ OpenAL::OpenAL()
buffersLoaded = false; buffersLoaded = false;
device = NULL; device = NULL;
context = NULL; context = NULL;
memset( buffer, 0, NBUFFERS * sizeof( ALuint ) ); buffer = (ALuint*)malloc( theApp.oalBufferCount * sizeof( ALuint ) );
memset( buffer, 0, theApp.oalBufferCount * sizeof( ALuint ) );
tempBuffer = 0; tempBuffer = 0;
source = 0; source = 0;
} }
@ -101,9 +102,11 @@ OpenAL::~OpenAL()
ALFunction.alDeleteSources( 1, &source ); ALFunction.alDeleteSources( 1, &source );
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
ALFunction.alDeleteBuffers( NBUFFERS, buffer ); ALFunction.alDeleteBuffers( theApp.oalBufferCount, buffer );
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
free( buffer );
ALFunction.alcMakeContextCurrent( NULL ); ALFunction.alcMakeContextCurrent( NULL );
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
@ -179,7 +182,7 @@ bool OpenAL::init()
ALCboolean retVal = ALFunction.alcMakeContextCurrent( context ); ALCboolean retVal = ALFunction.alcMakeContextCurrent( context );
assert( ALC_TRUE == retVal ); assert( ALC_TRUE == retVal );
ALFunction.alGenBuffers( NBUFFERS, buffer ); ALFunction.alGenBuffers( theApp.oalBufferCount, buffer );
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
ALFunction.alGenSources( 1, &source ); ALFunction.alGenSources( 1, &source );
@ -266,13 +269,13 @@ void OpenAL::write()
if( !buffersLoaded ) { if( !buffersLoaded ) {
// ==initial buffer filling== // ==initial buffer filling==
winlog( " initial buffer filling\n" ); winlog( " initial buffer filling\n" );
for( int i = 0 ; i < NBUFFERS ; i++ ) { for( int i = 0 ; i < theApp.oalBufferCount ; i++ ) {
// filling the buffers explicitly with silence would be cleaner... // filling the buffers explicitly with silence would be cleaner...
ALFunction.alBufferData( buffer[i], AL_FORMAT_STEREO16, soundFinalWave, soundBufferLen, freq ); ALFunction.alBufferData( buffer[i], AL_FORMAT_STEREO16, soundFinalWave, soundBufferLen, freq );
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
} }
ALFunction.alSourceQueueBuffers( source, NBUFFERS, buffer ); ALFunction.alSourceQueueBuffers( source, theApp.oalBufferCount, buffer );
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
buffersLoaded = true; buffersLoaded = true;
@ -282,7 +285,7 @@ void OpenAL::write()
ALFunction.alGetSourcei( source, AL_BUFFERS_PROCESSED, &nBuffersProcessed ); ALFunction.alGetSourcei( source, AL_BUFFERS_PROCESSED, &nBuffersProcessed );
assert( AL_NO_ERROR == ALFunction.alGetError() ); assert( AL_NO_ERROR == ALFunction.alGetError() );
if( nBuffersProcessed == NBUFFERS ) { if( nBuffersProcessed == theApp.oalBufferCount ) {
static int i = 0; static int i = 0;
log( "OpenAL: Buffers were not refilled fast enough (%i)\n", i++ ); log( "OpenAL: Buffers were not refilled fast enough (%i)\n", i++ );
} }

View File

@ -280,6 +280,7 @@ VBA::VBA()
audioAPI = DIRECTSOUND; audioAPI = DIRECTSOUND;
#ifndef NO_OAL #ifndef NO_OAL
oalDevice = NULL; oalDevice = NULL;
oalBufferCount = 5;
#endif #endif
iconic = false; iconic = false;
ddrawEmulationOnly = false; ddrawEmulationOnly = false;
@ -1714,6 +1715,8 @@ void VBA::loadSettings()
} }
oalDevice = (TCHAR*)malloc( ( buffer.GetLength() + 1 ) * sizeof( TCHAR ) ); oalDevice = (TCHAR*)malloc( ( buffer.GetLength() + 1 ) * sizeof( TCHAR ) );
_tcscpy( oalDevice, buffer.GetBuffer() ); _tcscpy( oalDevice, buffer.GetBuffer() );
oalBufferCount = regQueryDwordValue( "oalBufferCount", 5 );
#endif #endif
} }
@ -2695,6 +2698,7 @@ void VBA::saveSettings()
#ifndef NO_OAL #ifndef NO_OAL
regSetStringValue( "oalDevice", oalDevice ); regSetStringValue( "oalDevice", oalDevice );
regSetDwordValue( "oalBufferCount", oalBufferCount );
#endif #endif
} }

View File

@ -155,6 +155,7 @@ class VBA : public CWinApp
AUDIO_API audioAPI; AUDIO_API audioAPI;
#ifndef NO_OAL #ifndef NO_OAL
TCHAR *oalDevice; TCHAR *oalDevice;
int oalBufferCount;
#endif #endif
bool iconic; bool iconic;
bool ddrawEmulationOnly; bool ddrawEmulationOnly;

View File

@ -26,15 +26,18 @@ LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
// Dialog // Dialog
// //
IDD_OAL_CONFIG DIALOGEX 0, 0, 167, 53 IDD_OAL_CONFIG DIALOGEX 0, 0, 167, 114
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "OpenAL configuration" CAPTION "OpenAL configuration"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "OK",IDOK,66,36,48,12 DEFPUSHBUTTON "OK",IDOK,66,96,48,12
PUSHBUTTON "Cancel",IDCANCEL,114,36,48,12 PUSHBUTTON "Cancel",IDCANCEL,114,96,48,12
COMBOBOX IDC_DEVICE,6,18,156,36,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP COMBOBOX IDC_DEVICE,6,18,156,36,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
LTEXT "Select device:",IDC_STATIC,6,6,156,12 LTEXT "Select device:",IDC_STATIC,6,6,156,12
GROUPBOX "Sound Buffer Count",IDC_STATIC,6,36,156,54
CONTROL "",IDC_SLIDER_BUFFERCOUNT,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | WS_TABSTOP,12,48,144,24
CTEXT "bufferInfo",IDC_BUFFERINFO,12,72,144,12,0,WS_EX_DLGMODALFRAME
END END
@ -51,7 +54,7 @@ BEGIN
LEFTMARGIN, 7 LEFTMARGIN, 7
RIGHTMARGIN, 160 RIGHTMARGIN, 160
TOPMARGIN, 7 TOPMARGIN, 7
BOTTOMMARGIN, 46 BOTTOMMARGIN, 107
END END
END END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED

View File

@ -512,6 +512,8 @@
#define IDC_LY 1267 #define IDC_LY 1267
#define IDC_APPENDMODE 1268 #define IDC_APPENDMODE 1268
#define IDC_DEVICE 1269 #define IDC_DEVICE 1269
#define IDC_SLIDER_BUFFERCOUNT 1270
#define IDC_BUFFERINFO 1271
#define ID_HELP_ABOUT 40001 #define ID_HELP_ABOUT 40001
#define ID_FILE_EXIT 40002 #define ID_FILE_EXIT 40002
#define ID_OPTIONS_VIDEO_FRAMESKIP_0 40003 #define ID_OPTIONS_VIDEO_FRAMESKIP_0 40003
@ -821,7 +823,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 161 #define _APS_NEXT_RESOURCE_VALUE 161
#define _APS_NEXT_COMMAND_VALUE 40353 #define _APS_NEXT_COMMAND_VALUE 40353
#define _APS_NEXT_CONTROL_VALUE 1270 #define _APS_NEXT_CONTROL_VALUE 1272
#define _APS_NEXT_SYMED_VALUE 103 #define _APS_NEXT_SYMED_VALUE 103
#endif #endif
#endif #endif