win32: remove DirectSound, hook up WaveOut

This commit is contained in:
OV2 2019-02-12 16:52:05 +01:00
parent bb0a66b7f9
commit bbc4bd2d9d
8 changed files with 17 additions and 464 deletions

View File

@ -1,347 +0,0 @@
/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
// CDirectSound.cpp: implementation of the CDirectSound class.
//
//////////////////////////////////////////////////////////////////////
#include "wsnes9x.h"
#include "../snes9x.h"
#include "../apu/apu.h"
#include "CDirectSound.h"
#include <process.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDirectSound::CDirectSound()
{
lpDS = NULL;
lpDSB = NULL;
lpDSBPrimary = NULL;
initDone = NULL;
blockCount = 0;
blockSize = 0;
bufferSize = 0;
blockSamples = 0;
hTimer = NULL;
}
CDirectSound::~CDirectSound()
{
DeInitDirectSound();
}
/* CDirectSound::InitDirectSound
initializes the DirectSound object, the timer queue for the mixing timer, and sets the cooperation level
-----
returns true if successful, false otherwise
*/
bool CDirectSound::InitDirectSound ()
{
HRESULT dErr;
if(initDone)
return true;
if (!lpDS)
{
dErr = DirectSoundCreate (NULL, &lpDS, NULL);
if (dErr != DS_OK)
{
MessageBox (GUI.hWnd, TEXT("\
Unable to initialise DirectSound. You will not be able to hear any\n\
sound effects or music while playing.\n\n\
It is usually caused by not having DirectX installed, another\n\
application that has already opened DirectSound in exclusive\n\
mode or the Windows WAVE device has been opened."),
TEXT("Snes9X - Unable to Open DirectSound"),
MB_OK | MB_ICONWARNING);
return (false);
}
}
initDone = true;
dErr = lpDS->SetCooperativeLevel (GUI.hWnd, DSSCL_PRIORITY | DSSCL_EXCLUSIVE);
if (!SUCCEEDED(dErr))
{
dErr = lpDS->SetCooperativeLevel (GUI.hWnd, DSSCL_PRIORITY);
if (!SUCCEEDED(dErr))
{
if (!SUCCEEDED(lpDS -> SetCooperativeLevel (GUI.hWnd, DSSCL_NORMAL)))
{
DeInitDirectSound();
initDone = false;
}
if (initDone)
MessageBox (GUI.hWnd, TEXT("\
Unable to set DirectSound's priority cooperative level.\n\
Another application is dicating the sound playback rate,\n\
sample size and mono/stereo setting."),
TEXT("Snes9X - Unable to Set DirectSound priority"),
MB_OK | MB_ICONWARNING);
else
MessageBox (GUI.hWnd, TEXT("\
Unable to set any DirectSound cooperative level. You will\n\
not be able to hear any sound effects or music while playing.\n\n\
It is usually caused by another application that has already\n\
opened DirectSound in exclusive mode."),
TEXT("Snes9X - Unable to DirectSound"),
MB_OK | MB_ICONWARNING);
}
}
return (initDone);
}
/* CDirectSound::DeInitDirectSound
releases all DirectSound objects and buffers
*/
void CDirectSound::DeInitDirectSound()
{
initDone = false;
DeInitSoundBuffer();
if( lpDS != NULL)
{
lpDS->SetCooperativeLevel (GUI.hWnd, DSSCL_NORMAL);
lpDS->Release ();
lpDS = NULL;
}
}
/* CDirectSound::InitSoundBuffer
creates the DirectSound buffers and allocates the temp buffer for SoundSync
-----
returns true if successful, false otherwise
*/
bool CDirectSound::InitSoundBuffer()
{
DSBUFFERDESC dsbd;
WAVEFORMATEX wfx,wfx_actual;
HRESULT dErr;
blockCount = 4;
blockTime = GUI.SoundBufferSize / blockCount;
blockSamples = (Settings.SoundPlaybackRate * blockTime) / 1000;
blockSamples *= 2;
blockSize = blockSamples * 2;
bufferSize = blockSize * blockCount;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 2;
wfx.nSamplesPerSec = Settings.SoundPlaybackRate;
wfx.nBlockAlign = 2 * 2;
wfx.wBitsPerSample = 16;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
wfx.cbSize = 0;
ZeroMemory (&dsbd, sizeof(DSBUFFERDESC) );
dsbd.dwSize = sizeof(dsbd);
dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_STICKYFOCUS;
dErr = lpDS->CreateSoundBuffer (&dsbd, &lpDSBPrimary, NULL);
if (dErr != DS_OK)
{
lpDSB = NULL;
return (false);
}
lpDSBPrimary->SetFormat (&wfx);
if (lpDSBPrimary->GetFormat (&wfx_actual, sizeof (wfx_actual), NULL) == DS_OK)
{
if(wfx.nSamplesPerSec!=wfx_actual.nSamplesPerSec ||
wfx_actual.nChannels != wfx.nChannels || wfx.wBitsPerSample != wfx_actual.wBitsPerSample) {
return false;
}
}
lpDSBPrimary->Play (0, 0, DSBPLAY_LOOPING);
ZeroMemory (&dsbd, sizeof (dsbd));
dsbd.dwSize = sizeof( dsbd);
dsbd.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLVOLUME |
DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS | DSBCAPS_CTRLPOSITIONNOTIFY;
dsbd.dwBufferBytes = bufferSize;
dsbd.lpwfxFormat = &wfx;
if (lpDS->CreateSoundBuffer (&dsbd, &lpDSB, NULL) != DS_OK)
{
lpDSBPrimary->Release ();
lpDSBPrimary = NULL;
lpDSB->Release();
lpDSB = NULL;
return (false);
}
return true;
}
/* CDirectSound::DeInitSoundBuffer
deinitializes the DirectSound/temp buffers and stops the mixing timer
*/
void CDirectSound::DeInitSoundBuffer()
{
if(hTimer) {
timeKillEvent(hTimer);
hTimer = NULL;
}
if( lpDSB != NULL)
{
lpDSB->Stop ();
lpDSB->Release();
lpDSB = NULL;
}
if( lpDSBPrimary != NULL)
{
lpDSBPrimary->Stop ();
lpDSBPrimary->Release();
lpDSBPrimary = NULL;
}
}
/* CDirectSound::SetupSound
applies sound setting changes by recreating the buffers and starting a new mixing timer
it fills the buffer before starting playback
-----
returns true if successful, false otherwise
*/
bool CDirectSound::SetupSound()
{
HRESULT hResult;
if(!initDone)
return false;
DeInitSoundBuffer();
InitSoundBuffer();
BYTE *B1;
DWORD S1;
hResult = lpDSB->Lock (0, 0, (void **)&B1,
&S1, NULL, NULL, DSBLOCK_ENTIREBUFFER);
if (hResult == DSERR_BUFFERLOST)
{
lpDSB->Restore ();
hResult = lpDSB->Lock (0, 0, (void **)&B1,
&S1, NULL, NULL, DSBLOCK_ENTIREBUFFER);
}
if (!SUCCEEDED(hResult))
{
hResult = lpDSB -> Unlock (B1, S1, NULL, NULL);
return true;
}
S9xMixSamples(B1,blockSamples * blockCount);
lpDSB->Unlock(B1,S1,NULL,NULL);
lpDSB->Play (0, 0, DSBPLAY_LOOPING);
last_block = blockCount - 1;
hTimer = timeSetEvent (blockTime/2, blockTime/2, SoundTimerCallback, (DWORD_PTR)this, TIME_PERIODIC);
if(!hTimer) {
DeInitSoundBuffer();
return false;
}
return (true);
}
void CDirectSound::SetVolume(double volume)
{
if (!initDone)
return;
// convert percentage to hundredths of dB
LONG dbVolume = (LONG)(10 * log10(volume) * 2 * 100);
lpDSB->SetVolume(dbVolume);
}
/* CDirectSound::ProcessSound
Finishes core sample creation, syncronizes the buffer access.
*/
void CDirectSound::ProcessSound()
{
EnterCriticalSection(&GUI.SoundCritSect);
S9xFinalizeSamples();
LeaveCriticalSection(&GUI.SoundCritSect);
}
/* CDirectSound::MixSound
the mixing function called by the mix timer
uses the current play position to decide if a new block can be filled with audio data
synchronizes the core buffer access with a critical section
*/
void CDirectSound::MixSound()
{
DWORD play_pos = 0, write_pos = 0;
HRESULT hResult;
DWORD curr_block;
if(!initDone)
return;
lpDSB->GetCurrentPosition (&play_pos, NULL);
curr_block = ((play_pos / blockSize) + blockCount) % blockCount;
if (curr_block != last_block)
{
BYTE *B1, *B2;
DWORD S1, S2;
write_pos = curr_block * blockSize;
last_block = curr_block;
hResult = lpDSB->Lock (write_pos, blockSize, (void **)&B1,
&S1, (void **)&B2, &S2, 0);
if (hResult == DSERR_BUFFERLOST)
{
lpDSB->Restore ();
hResult = lpDSB->Lock (write_pos, blockSize,
(void **)&B1, &S1, (void **)&B2,
&S2, 0);
}
if (!SUCCEEDED(hResult))
{
hResult = lpDSB -> Unlock (B1, S1, B2, S2);
return;
}
EnterCriticalSection(&GUI.SoundCritSect);
if (B1)
{
S9xMixSamples(B1, S1>>1);
}
if (B2)
{
S9xMixSamples(B2, S2>>1);
}
LeaveCriticalSection(&GUI.SoundCritSect);
SetEvent(GUI.SoundSyncEvent);
hResult = lpDSB -> Unlock (B1, S1, B2, S2);
if (!SUCCEEDED(hResult))
return;
}
}
/* CDirectSound::SoundTimerCallback
Timer callback that tries to mix a new block. Called twice each block.
*/
VOID CALLBACK CDirectSound::SoundTimerCallback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) {
CDirectSound *S9xDirectSound = (CDirectSound *)dwUser;
S9xDirectSound->MixSound();
}

View File

@ -1,64 +0,0 @@
/*****************************************************************************\
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
This file is licensed under the Snes9x License.
For further information, consult the LICENSE file in the root directory.
\*****************************************************************************/
// CDirectSound.h: interface for the CDirectSound class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(DIRECTSOUND_H_INCLUDED)
#define DIRECTSOUND_H_INCLUDED
#include <windows.h>
#include "IS9xSoundOutput.h"
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CDirectSound : public IS9xSoundOutput
{
private:
LPDIRECTSOUND lpDS;
LPDIRECTSOUNDBUFFER lpDSB; // the buffer used for mixing
LPDIRECTSOUNDBUFFER lpDSBPrimary;
int blockCount; // number of blocks in the buffer
int blockSize; // bytes in one block
int blockSamples; // samples in one block
int bufferSize; // bytes in the whole buffer
int blockTime; // ms in one block
DWORD last_block; // the last block that was mixed
bool initDone; // has init been called successfully?
DWORD hTimer; // mixing timer
bool InitDirectSound ();
void DeInitDirectSound();
bool InitSoundBuffer();
void DeInitSoundBuffer();
static VOID CALLBACK SoundTimerCallback(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
void ProcessSound();
void MixSound();
public:
CDirectSound();
~CDirectSound();
// Inherited from IS9xSoundOutput
bool InitSoundOutput(void) { return InitDirectSound(); }
void DeInitSoundOutput(void) { DeInitDirectSound(); }
bool SetupSound(void);
void SetVolume(double volume);
};
extern CDirectSound DirectSound;
#endif // !defined(DIRECTSOUND_H_INCLUDED)

View File

@ -320,8 +320,6 @@
<ClInclude Include="..\apu\bapu\dsp\sdsp.hpp" /> <ClInclude Include="..\apu\bapu\dsp\sdsp.hpp" />
<ClInclude Include="..\apu\bapu\dsp\SPC_DSP.h" /> <ClInclude Include="..\apu\bapu\dsp\SPC_DSP.h" />
<ClInclude Include="..\apu\bapu\snes\snes.hpp" /> <ClInclude Include="..\apu\bapu\snes\snes.hpp" />
<ClInclude Include="..\apu\hermite_resampler.h" />
<ClInclude Include="..\apu\resampler.h" />
<ClInclude Include="..\apu\ring_buffer.h" /> <ClInclude Include="..\apu\ring_buffer.h" />
<CustomBuild Include="..\bsx.h" /> <CustomBuild Include="..\bsx.h" />
<CustomBuild Include="..\c4.h" /> <CustomBuild Include="..\c4.h" />
@ -433,7 +431,6 @@
<ClInclude Include="CD3DCG.h" /> <ClInclude Include="CD3DCG.h" />
<CustomBuild Include="CDirect3D.h" /> <CustomBuild Include="CDirect3D.h" />
<ClInclude Include="CDirectDraw.h" /> <ClInclude Include="CDirectDraw.h" />
<ClInclude Include="CDirectSound.h" />
<ClInclude Include="cgFunctions.h" /> <ClInclude Include="cgFunctions.h" />
<ClInclude Include="CGLCG.h" /> <ClInclude Include="CGLCG.h" />
<ClInclude Include="cgMini.h" /> <ClInclude Include="cgMini.h" />
@ -578,7 +575,6 @@
<ClCompile Include="CD3DCG.cpp" /> <ClCompile Include="CD3DCG.cpp" />
<ClCompile Include="CDirect3D.cpp" /> <ClCompile Include="CDirect3D.cpp" />
<ClCompile Include="CDirectDraw.cpp" /> <ClCompile Include="CDirectDraw.cpp" />
<ClCompile Include="CDirectSound.cpp" />
<ClCompile Include="cgFunctions.cpp" /> <ClCompile Include="cgFunctions.cpp" />
<ClCompile Include="CGLCG.cpp" /> <ClCompile Include="CGLCG.cpp" />
<ClCompile Include="COpenGL.cpp" /> <ClCompile Include="COpenGL.cpp" />

View File

@ -96,9 +96,6 @@
<ClInclude Include="wsnes9x.h"> <ClInclude Include="wsnes9x.h">
<Filter>GUI</Filter> <Filter>GUI</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="CDirectSound.h">
<Filter>GUI\SoundDriver</Filter>
</ClInclude>
<ClInclude Include="CXAudio2.h"> <ClInclude Include="CXAudio2.h">
<Filter>GUI\SoundDriver</Filter> <Filter>GUI\SoundDriver</Filter>
</ClInclude> </ClInclude>
@ -186,12 +183,6 @@
<ClInclude Include="..\apu\apu.h"> <ClInclude Include="..\apu\apu.h">
<Filter>APU</Filter> <Filter>APU</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\apu\hermite_resampler.h">
<Filter>APU</Filter>
</ClInclude>
<ClInclude Include="..\apu\resampler.h">
<Filter>APU</Filter>
</ClInclude>
<ClInclude Include="..\apu\ring_buffer.h"> <ClInclude Include="..\apu\ring_buffer.h">
<Filter>APU</Filter> <Filter>APU</Filter>
</ClInclude> </ClInclude>
@ -497,9 +488,6 @@
<ClCompile Include="wsnes9x.cpp"> <ClCompile Include="wsnes9x.cpp">
<Filter>GUI</Filter> <Filter>GUI</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="CDirectSound.cpp">
<Filter>GUI\SoundDriver</Filter>
</ClCompile>
<ClCompile Include="CXAudio2.cpp"> <ClCompile Include="CXAudio2.cpp">
<Filter>GUI\SoundDriver</Filter> <Filter>GUI\SoundDriver</Filter>
</ClCompile> </ClCompile>

View File

@ -819,7 +819,7 @@ void WinRegisterConfigItems()
AddIntC("InterpolationMethod", Settings.InterpolationMethod, 2, "0 = None, 1 = Linear, 2 = Gaussian (accurate), 3 = Cubic, 4 = Sinc"); AddIntC("InterpolationMethod", Settings.InterpolationMethod, 2, "0 = None, 1 = Linear, 2 = Gaussian (accurate), 3 = Cubic, 4 = Sinc");
#undef CATEGORY #undef CATEGORY
#define CATEGORY "Sound\\Win" #define CATEGORY "Sound\\Win"
AddUIntC("SoundDriver", GUI.SoundDriver, 4, "0=Snes9xDirectSound, 4=XAudio2 (recommended)"); AddUIntC("SoundDriver", GUI.SoundDriver, 4, "4=XAudio2 (recommended), 8=WaveOut");
AddUIntC("BufferSize", GUI.SoundBufferSize, 64, "sound buffer size in ms - determines the internal and output sound buffer sizes. actual mixing is done every SoundBufferSize/4 samples"); AddUIntC("BufferSize", GUI.SoundBufferSize, 64, "sound buffer size in ms - determines the internal and output sound buffer sizes. actual mixing is done every SoundBufferSize/4 samples");
AddBoolC("MuteFrameAdvance", GUI.FAMute, false, "true to prevent Snes9x from outputting sound when the Frame Advance command is in use"); AddBoolC("MuteFrameAdvance", GUI.FAMute, false, "true to prevent Snes9x from outputting sound when the Frame Advance command is in use");
AddUIntC("VolumeRegular", GUI.VolumeRegular, 100, "volume during regular play (percentage between 0 and 100)"); AddUIntC("VolumeRegular", GUI.VolumeRegular, 100, "volume during regular play (percentage between 0 and 100)");

View File

@ -8,16 +8,16 @@
#include "../snes9x.h" #include "../snes9x.h"
#include "../apu/apu.h" #include "../apu/apu.h"
#include "wsnes9x.h" #include "wsnes9x.h"
#include "CDirectSound.h"
#include "CXAudio2.h" #include "CXAudio2.h"
#include "CWaveOut.h"
#include "win32_sound.h" #include "win32_sound.h"
#include "win32_display.h" #include "win32_display.h"
#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
// available sound output methods // available sound output methods
CDirectSound S9xDirectSound;
CXAudio2 S9xXAudio2; CXAudio2 S9xXAudio2;
CWaveOut S9xWaveOut;
// Interface used to access the sound output // Interface used to access the sound output
IS9xSoundOutput *S9xSoundOutput = &S9xXAudio2; IS9xSoundOutput *S9xSoundOutput = &S9xXAudio2;
@ -51,10 +51,7 @@ bool ReInitSound()
if(S9xSoundOutput) if(S9xSoundOutput)
S9xSoundOutput->DeInitSoundOutput(); S9xSoundOutput->DeInitSoundOutput();
if (S9xSoundOutput == &S9xDirectSound) return S9xInitSound(0, 0);
return S9xInitSound(GUI.SoundBufferSize, 0);
else
return S9xInitSound(0, 0);
} }
void CloseSoundDevice() { void CloseSoundDevice() {
@ -73,16 +70,15 @@ bool8 S9xOpenSoundDevice ()
S9xSetSamplesAvailableCallback (NULL, NULL); S9xSetSamplesAvailableCallback (NULL, NULL);
// point the interface to the correct output object // point the interface to the correct output object
switch(GUI.SoundDriver) { switch(GUI.SoundDriver) {
case WIN_SNES9X_DIRECT_SOUND_DRIVER: case WIN_WAVEOUT_DRIVER:
S9xSoundOutput = &S9xDirectSound; S9xSoundOutput = &S9xWaveOut;
Settings.DynamicRateControl = false;
break; break;
case WIN_XAUDIO2_SOUND_DRIVER: case WIN_XAUDIO2_SOUND_DRIVER:
S9xSoundOutput = &S9xXAudio2; S9xSoundOutput = &S9xXAudio2;
break; break;
default: // we default to DirectSound default: // we default to WaveOut
GUI.SoundDriver = WIN_SNES9X_DIRECT_SOUND_DRIVER; GUI.SoundDriver = WIN_WAVEOUT_DRIVER;
S9xSoundOutput = &S9xDirectSound; S9xSoundOutput = &S9xWaveOut;
} }
if(!S9xSoundOutput->InitSoundOutput()) if(!S9xSoundOutput->InitSoundOutput())
return false; return false;

View File

@ -4337,32 +4337,17 @@ INT_PTR CALLBACK DlgSoundConf(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
CreateToolTip(IDC_INRATEEDIT, hDlg, TEXT("For each 'Input rate' samples generated by the SNES, 'Playback rate' samples will produced. If you experience crackling you can try to lower this setting.")); CreateToolTip(IDC_INRATEEDIT, hDlg, TEXT("For each 'Input rate' samples generated by the SNES, 'Playback rate' samples will produced. If you experience crackling you can try to lower this setting."));
CreateToolTip(IDC_INRATE, hDlg, TEXT("For each 'Input rate' samples generated by the SNES, 'Playback rate' samples will produced. If you experience crackling you can try to lower this setting.")); CreateToolTip(IDC_INRATE, hDlg, TEXT("For each 'Input rate' samples generated by the SNES, 'Playback rate' samples will produced. If you experience crackling you can try to lower this setting."));
CreateToolTip(IDC_DYNRATECONTROL, hDlg, TEXT("Try to dynamically adjust the input rate to never overflow or underflow the sound buffer. Only works with XAudio2.")); CreateToolTip(IDC_DYNRATECONTROL, hDlg, TEXT("Try to dynamically adjust the input rate to never overflow or underflow the sound buffer."));
HWND output_dropdown = GetDlgItem(hDlg, IDC_OUTPUT_DEVICE); HWND output_dropdown = GetDlgItem(hDlg, IDC_OUTPUT_DEVICE);
UpdateAudioDeviceDropdown(output_dropdown); UpdateAudioDeviceDropdown(output_dropdown);
ComboBox_SetCurSel(output_dropdown, FindAudioDeviceIndex(GUI.AudioDevice)); ComboBox_SetCurSel(output_dropdown, FindAudioDeviceIndex(GUI.AudioDevice));
int pos; int pos;
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("Snes9x DirectSound")); pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("WaveOut"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_SNES9X_DIRECT_SOUND_DRIVER); SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_WAVEOUT_DRIVER);
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("XAudio2")); pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("XAudio2"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_XAUDIO2_SOUND_DRIVER); SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_XAUDIO2_SOUND_DRIVER);
#ifdef FMOD_SUPPORT
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("FMOD DirectSound"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_FMOD_DIRECT_SOUND_DRIVER);
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("FMOD Windows Multimedia"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_FMOD_WAVE_SOUND_DRIVER);
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("FMOD A3D"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_FMOD_A3D_SOUND_DRIVER);
#elif defined FMODEX_SUPPORT
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("FMOD Ex Default"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_FMODEX_DEFAULT_DRIVER);
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("FMOD Ex ASIO"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_FMODEX_ASIO_DRIVER);
pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("FMOD Ex OpenAL"));
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_FMODEX_OPENAL_DRIVER);
#endif
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETCURSEL, 0, 0); SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETCURSEL, 0, 0);
for (pos = 0; pos < SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETCOUNT, 0, 0); pos++) { for (pos = 0; pos < SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETCOUNT, 0, 0); pos++) {
if (SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETITEMDATA, pos, 0) == GUI.SoundDriver) { if (SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETITEMDATA, pos, 0) == GUI.SoundDriver) {
@ -4377,7 +4362,6 @@ INT_PTR CALLBACK DlgSoundConf(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
GUI.AutomaticInputRate = false; GUI.AutomaticInputRate = false;
} }
EnableWindow(GetDlgItem(hDlg, IDC_DYNRATECONTROL), GUI.SoundDriver == WIN_XAUDIO2_SOUND_DRIVER);
EnableWindow(GetDlgItem(hDlg, IDC_INRATEEDIT), !GUI.AutomaticInputRate); EnableWindow(GetDlgItem(hDlg, IDC_INRATEEDIT), !GUI.AutomaticInputRate);
EnableWindow(GetDlgItem(hDlg, IDC_INRATE), !GUI.AutomaticInputRate); EnableWindow(GetDlgItem(hDlg, IDC_INRATE), !GUI.AutomaticInputRate);
@ -4585,16 +4569,15 @@ INT_PTR CALLBACK DlgSoundConf(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
case IDC_DRIVER: case IDC_DRIVER:
if(CBN_SELCHANGE==HIWORD(wParam)) if(CBN_SELCHANGE==HIWORD(wParam))
{ {
int driver=SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETITEMDATA, int driver = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETITEMDATA,
SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETCURSEL, 0,0),0); SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETCURSEL, 0,0),0);
EnableWindow(GetDlgItem(hDlg, IDC_DYNRATECONTROL), FALSE);
switch(driver) { switch(driver) {
case WIN_SNES9X_DIRECT_SOUND_DRIVER: case WIN_WAVEOUT_DRIVER:
SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,3,0); SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,3,0);
break; break;
case WIN_XAUDIO2_SOUND_DRIVER: case WIN_XAUDIO2_SOUND_DRIVER:
SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,3,0); SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,3,0);
EnableWindow(GetDlgItem(hDlg, IDC_DYNRATECONTROL), TRUE);
break; break;
default: default:
SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,7,0); SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,7,0);

View File

@ -422,7 +422,8 @@ enum
WIN_XAUDIO2_SOUND_DRIVER, WIN_XAUDIO2_SOUND_DRIVER,
WIN_FMODEX_DEFAULT_DRIVER, WIN_FMODEX_DEFAULT_DRIVER,
WIN_FMODEX_ASIO_DRIVER, WIN_FMODEX_ASIO_DRIVER,
WIN_FMODEX_OPENAL_DRIVER WIN_FMODEX_OPENAL_DRIVER,
WIN_WAVEOUT_DRIVER
}; };
#define S9X_REG_KEY_BASE MY_REG_KEY #define S9X_REG_KEY_BASE MY_REG_KEY