From bbc4bd2d9dc33b41b0bedddf99f8b60588e0f56a Mon Sep 17 00:00:00 2001 From: OV2 Date: Tue, 12 Feb 2019 16:52:05 +0100 Subject: [PATCH] win32: remove DirectSound, hook up WaveOut --- win32/CDirectSound.cpp | 347 ---------------------------------- win32/CDirectSound.h | 64 ------- win32/snes9xw.vcxproj | 4 - win32/snes9xw.vcxproj.filters | 12 -- win32/wconfig.cpp | 2 +- win32/win32_sound.cpp | 20 +- win32/wsnes9x.cpp | 29 +-- win32/wsnes9x.h | 3 +- 8 files changed, 17 insertions(+), 464 deletions(-) delete mode 100644 win32/CDirectSound.cpp delete mode 100644 win32/CDirectSound.h diff --git a/win32/CDirectSound.cpp b/win32/CDirectSound.cpp deleted file mode 100644 index 6834ce16..00000000 --- a/win32/CDirectSound.cpp +++ /dev/null @@ -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 - -////////////////////////////////////////////////////////////////////// -// 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(); -} - diff --git a/win32/CDirectSound.h b/win32/CDirectSound.h deleted file mode 100644 index 055b66b4..00000000 --- a/win32/CDirectSound.h +++ /dev/null @@ -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 -#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) diff --git a/win32/snes9xw.vcxproj b/win32/snes9xw.vcxproj index 3ed98cbc..c7625776 100644 --- a/win32/snes9xw.vcxproj +++ b/win32/snes9xw.vcxproj @@ -320,8 +320,6 @@ - - @@ -433,7 +431,6 @@ - @@ -578,7 +575,6 @@ - diff --git a/win32/snes9xw.vcxproj.filters b/win32/snes9xw.vcxproj.filters index 4a9d124b..7fd640ba 100644 --- a/win32/snes9xw.vcxproj.filters +++ b/win32/snes9xw.vcxproj.filters @@ -96,9 +96,6 @@ GUI - - GUI\SoundDriver - GUI\SoundDriver @@ -186,12 +183,6 @@ APU - - APU - - - APU - APU @@ -497,9 +488,6 @@ GUI - - GUI\SoundDriver - GUI\SoundDriver diff --git a/win32/wconfig.cpp b/win32/wconfig.cpp index e77f5a29..f28afd94 100644 --- a/win32/wconfig.cpp +++ b/win32/wconfig.cpp @@ -819,7 +819,7 @@ void WinRegisterConfigItems() AddIntC("InterpolationMethod", Settings.InterpolationMethod, 2, "0 = None, 1 = Linear, 2 = Gaussian (accurate), 3 = Cubic, 4 = Sinc"); #undef CATEGORY #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"); 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)"); diff --git a/win32/win32_sound.cpp b/win32/win32_sound.cpp index e1e1f4ae..ad685f40 100644 --- a/win32/win32_sound.cpp +++ b/win32/win32_sound.cpp @@ -8,16 +8,16 @@ #include "../snes9x.h" #include "../apu/apu.h" #include "wsnes9x.h" -#include "CDirectSound.h" #include "CXAudio2.h" +#include "CWaveOut.h" #include "win32_sound.h" #include "win32_display.h" #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) // available sound output methods -CDirectSound S9xDirectSound; CXAudio2 S9xXAudio2; +CWaveOut S9xWaveOut; // Interface used to access the sound output IS9xSoundOutput *S9xSoundOutput = &S9xXAudio2; @@ -51,10 +51,7 @@ bool ReInitSound() if(S9xSoundOutput) S9xSoundOutput->DeInitSoundOutput(); - if (S9xSoundOutput == &S9xDirectSound) - return S9xInitSound(GUI.SoundBufferSize, 0); - else - return S9xInitSound(0, 0); + return S9xInitSound(0, 0); } void CloseSoundDevice() { @@ -73,16 +70,15 @@ bool8 S9xOpenSoundDevice () S9xSetSamplesAvailableCallback (NULL, NULL); // point the interface to the correct output object switch(GUI.SoundDriver) { - case WIN_SNES9X_DIRECT_SOUND_DRIVER: - S9xSoundOutput = &S9xDirectSound; - Settings.DynamicRateControl = false; + case WIN_WAVEOUT_DRIVER: + S9xSoundOutput = &S9xWaveOut; break; case WIN_XAUDIO2_SOUND_DRIVER: S9xSoundOutput = &S9xXAudio2; break; - default: // we default to DirectSound - GUI.SoundDriver = WIN_SNES9X_DIRECT_SOUND_DRIVER; - S9xSoundOutput = &S9xDirectSound; + default: // we default to WaveOut + GUI.SoundDriver = WIN_WAVEOUT_DRIVER; + S9xSoundOutput = &S9xWaveOut; } if(!S9xSoundOutput->InitSoundOutput()) return false; diff --git a/win32/wsnes9x.cpp b/win32/wsnes9x.cpp index 5fed8688..7f8a0340 100644 --- a/win32/wsnes9x.cpp +++ b/win32/wsnes9x.cpp @@ -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_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); UpdateAudioDeviceDropdown(output_dropdown); ComboBox_SetCurSel(output_dropdown, FindAudioDeviceIndex(GUI.AudioDevice)); int pos; - pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("Snes9x DirectSound")); - SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_SNES9X_DIRECT_SOUND_DRIVER); + pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("WaveOut")); + SendDlgItemMessage(hDlg, IDC_DRIVER, CB_SETITEMDATA, pos, WIN_WAVEOUT_DRIVER); pos = SendDlgItemMessage(hDlg, IDC_DRIVER, CB_INSERTSTRING, -1, (LPARAM)TEXT("XAudio2")); 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); for (pos = 0; pos < SendDlgItemMessage(hDlg, IDC_DRIVER, CB_GETCOUNT, 0, 0); pos++) { 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; } - EnableWindow(GetDlgItem(hDlg, IDC_DYNRATECONTROL), GUI.SoundDriver == WIN_XAUDIO2_SOUND_DRIVER); EnableWindow(GetDlgItem(hDlg, IDC_INRATEEDIT), !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: 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); - EnableWindow(GetDlgItem(hDlg, IDC_DYNRATECONTROL), FALSE); + switch(driver) { - case WIN_SNES9X_DIRECT_SOUND_DRIVER: + case WIN_WAVEOUT_DRIVER: SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,3,0); break; case WIN_XAUDIO2_SOUND_DRIVER: SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,3,0); - EnableWindow(GetDlgItem(hDlg, IDC_DYNRATECONTROL), TRUE); break; default: SendDlgItemMessage(hDlg,IDC_BUFLEN,CB_SETCURSEL,7,0); diff --git a/win32/wsnes9x.h b/win32/wsnes9x.h index abc8ad61..2de97bd9 100644 --- a/win32/wsnes9x.h +++ b/win32/wsnes9x.h @@ -422,7 +422,8 @@ enum WIN_XAUDIO2_SOUND_DRIVER, WIN_FMODEX_DEFAULT_DRIVER, WIN_FMODEX_ASIO_DRIVER, - WIN_FMODEX_OPENAL_DRIVER + WIN_FMODEX_OPENAL_DRIVER, + WIN_WAVEOUT_DRIVER }; #define S9X_REG_KEY_BASE MY_REG_KEY