diff --git a/CMakeLists.txt b/CMakeLists.txt index b9057cf..549d470 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -233,6 +233,7 @@ add_executable(${EXECUTABLE_NAME} WIN32 ) target_sources(${EXECUTABLE_NAME} PUBLIC + "src/dsound_compat.h" "src/fps_limiter.cc" "src/fps_limiter.h" "src/platform_compat.cc" diff --git a/src/combat_ai.cc b/src/combat_ai.cc index e32d9ab..ef8080a 100644 --- a/src/combat_ai.cc +++ b/src/combat_ai.cc @@ -28,6 +28,7 @@ #include "tile.h" #include +#include #include // 0x51805C @@ -1399,7 +1400,6 @@ Object* _ai_danger_source(Object* a1) attackWho = -1; } - Object* whoHitMe = a1->data.critter.combat.whoHitMe; if (whoHitMe == NULL || a1 == whoHitMe) { targets[0] = NULL; diff --git a/src/dsound_compat.h b/src/dsound_compat.h new file mode 100644 index 0000000..e484d60 --- /dev/null +++ b/src/dsound_compat.h @@ -0,0 +1,17 @@ +#ifndef DSOUND_COMPAT_H +#define DSOUND_COMPAT_H + +#ifdef _WIN32 +#define HAVE_DSOUND 1 + +#define WIN32_LEAN_AND_MEAN +#define NOMINMAX +#include + +#include + +#define DIRECTSOUND_VERSION 0x0300 +#include +#endif + +#endif /* DSOUND_COMPAT_H */ diff --git a/src/movie.cc b/src/movie.cc index f577cd8..c3dd2b3 100644 --- a/src/movie.cc +++ b/src/movie.cc @@ -330,8 +330,12 @@ int _noop() void movieInit() { movieLibSetMemoryProcs(movieMallocImpl, movieFreeImpl); +#ifdef HAVE_DSOUND movieLibSetDirectSound(gDirectSound); gMovieDirectSoundInitialized = (gDirectSound != NULL); +#else + gMovieDirectSoundInitialized = false; +#endif movieLibSetPaletteEntriesProc(movieSetPaletteEntriesImpl); _MVE_sfSVGA(640, 480, 480, 0, 0, 0, 0, 0, 0); movieLibSetReadProc(movieReadImpl); diff --git a/src/movie_lib.cc b/src/movie_lib.cc index e500352..3270ba9 100644 --- a/src/movie_lib.cc +++ b/src/movie_lib.cc @@ -63,11 +63,15 @@ int _sync_late = 0; // 0x51EDEC int _sync_FrameDropped = 0; +#ifdef HAVE_DSOUND // 0x51EDF0 LPDIRECTSOUND gMovieLibDirectSound = NULL; +#endif +#ifdef HAVE_DSOUND // 0x51EDF4 LPDIRECTSOUNDBUFFER gMovieLibDirectSoundBuffer = NULL; +#endif // 0x51EDF8 int gMovieLibVolume = 0; @@ -261,8 +265,10 @@ unsigned int _$$R0063[256] = { // 0x6B3660 int dword_6B3660; +#ifdef HAVE_DSOUND // 0x6B3668 DSBCAPS stru_6B3668; +#endif // 0x6B367C int _sf_ScreenWidth; @@ -469,20 +475,24 @@ void _MVE_MemFree(STRUCT_6B3690* a1) a1->field_4 = 0; } +#ifdef HAVE_DSOUND // 0x4F48F0 void movieLibSetDirectSound(LPDIRECTSOUND ds) { gMovieLibDirectSound = ds; } +#endif // 0x4F4900 void movieLibSetVolume(int volume) { gMovieLibVolume = volume; +#ifdef HAVE_DSOUND if (gMovieLibDirectSoundBuffer != NULL) { IDirectSoundBuffer_SetVolume(gMovieLibDirectSoundBuffer, volume); } +#endif } // 0x4F4920 @@ -490,9 +500,11 @@ void movieLibSetPan(int pan) { gMovieLibPan = pan; +#ifdef HAVE_DSOUND if (gMovieLibDirectSoundBuffer != NULL) { IDirectSoundBuffer_SetPan(gMovieLibDirectSoundBuffer, pan); } +#endif } // 0x4F4940 @@ -733,9 +745,11 @@ int _syncWait() // 0x4F4EA0 void _MVE_sndPause() { +#ifdef HAVE_DSOUND if (gMovieLibDirectSoundBuffer != NULL) { IDirectSoundBuffer_Stop(gMovieLibDirectSoundBuffer); } +#endif } // 0x4F4EC0 @@ -1051,6 +1065,7 @@ void _syncReset(int a1) // 0x4F5570 int _MVE_sndConfigure(int a1, int a2, int a3, int a4, int a5, int a6) { +#ifdef HAVE_DSOUND DSBUFFERDESC dsbd; WAVEFORMATEX wfxFormat; @@ -1096,6 +1111,9 @@ int _MVE_sndConfigure(int a1, int a2, int a3, int a4, int a5, int a6) } return 1; +#else + return 0; +#endif } // 0x4F56C0 @@ -1110,16 +1128,19 @@ void _MVE_syncSync() // 0x4F56F0 void _MVE_sndReset() { +#ifdef HAVE_DSOUND if (gMovieLibDirectSoundBuffer != NULL) { IDirectSoundBuffer_Stop(gMovieLibDirectSoundBuffer); IDirectSoundBuffer_Release(gMovieLibDirectSoundBuffer); gMovieLibDirectSoundBuffer = NULL; } +#endif } // 0x4F5720 void _MVE_sndSync() { +#ifdef HAVE_DSOUND DWORD dwCurrentPlayCursor; DWORD dwCurrentWriteCursor; bool v10; @@ -1257,6 +1278,10 @@ void _MVE_sndSync() ++dword_6B3660; } } +#else + _sync_late = _syncWaitLevel(_sync_wait_quanta >> 2) > -_sync_wait_quanta >> 1 && !_sync_FrameDropped; + _sync_FrameDropped = 0; +#endif } // 0x4F59B0 @@ -1282,6 +1307,7 @@ int _syncWaitLevel(int a1) // 0x4F5A00 void _CallsSndBuff_Loc(unsigned char* a1, int a2) { +#ifdef HAVE_DSOUND int v2; int v3; int v5; @@ -1343,6 +1369,7 @@ void _CallsSndBuff_Loc(unsigned char* a1, int a2) } else { ++dword_6B3AE4; } +#endif } // 0x4F5B70 diff --git a/src/movie_lib.h b/src/movie_lib.h index e19a650..14aff9a 100644 --- a/src/movie_lib.h +++ b/src/movie_lib.h @@ -1,13 +1,11 @@ #ifndef MOVIE_LIB_H #define MOVIE_LIB_H +#include "dsound_compat.h" #include "memory_defs.h" #include -#define DIRECTSOUND_VERSION 0x0300 -#include - typedef struct STRUCT_6B3690 { void* field_0; int field_4; @@ -56,8 +54,10 @@ extern unsigned short word_51EBE0[256]; extern int _sync_active; extern int _sync_late; extern int _sync_FrameDropped; +#ifdef HAVE_DSOUND extern LPDIRECTSOUND gMovieLibDirectSound; extern LPDIRECTSOUNDBUFFER gMovieLibDirectSoundBuffer; +#endif extern int gMovieLibVolume; extern int gMovieLibPan; extern MovieShowFrameProc* _sf_ShowFrame; @@ -74,7 +74,9 @@ extern unsigned int _$$R0004[256]; extern unsigned int _$$R0063[256]; extern int dword_6B3660; +#ifdef HAVE_DSOUND extern DSBCAPS stru_6B3668; +#endif extern int _sf_ScreenWidth; extern int dword_6B3680; extern int _rm_FrameDropCount; @@ -138,7 +140,9 @@ void movieLibSetMemoryProcs(MallocProc* mallocProc, FreeProc* freeProc); void movieLibSetReadProc(MovieReadProc* readProc); void _MVE_MemInit(STRUCT_6B3690* a1, int a2, void* a3); void _MVE_MemFree(STRUCT_6B3690* a1); +#ifdef HAVE_DSOUND void movieLibSetDirectSound(LPDIRECTSOUND ds); +#endif void movieLibSetVolume(int volume); void movieLibSetPan(int pan); void _MVE_sfSVGA(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9); diff --git a/src/scripts.cc b/src/scripts.cc index cafade4..90836a8 100644 --- a/src/scripts.cc +++ b/src/scripts.cc @@ -25,6 +25,7 @@ #include "window_manager_private.h" #include "world_map.h" +#include #include #include diff --git a/src/sound.cc b/src/sound.cc index 6718ccb..7673221 100644 --- a/src/sound.cc +++ b/src/sound.cc @@ -80,6 +80,7 @@ const char* gSoundErrorDescriptions[SOUND_ERR_COUNT] = { "sound.c: invalid handle", "sound.c: no memory available", "sound.c: unknown error", + "sound.c: not implemented", }; // 0x668150 @@ -88,8 +89,10 @@ int gSoundLastError; // 0x668154 int _masterVol; +#ifdef HAVE_DSOUND // 0x668158 LPDIRECTSOUNDBUFFER gDirectSoundPrimaryBuffer; +#endif // 0x66815C int _sampleRate; @@ -114,8 +117,10 @@ bool gSoundInitialized; // 0x668174 Sound* gSoundListHead; +#ifdef HAVE_DSOUND // 0x668178 LPDIRECTSOUND gDirectSound; +#endif // 0x4AC6F0 void* soundMallocProcDefaultImpl(size_t size) @@ -166,6 +171,7 @@ const char* soundGetErrorDescription(int err) // 0x4AC7B0 void _refreshSoundBuffers(Sound* sound) { +#ifdef HAVE_DSOUND if (sound->field_3C & 0x80) { return; } @@ -340,11 +346,13 @@ void _refreshSoundBuffers(Sound* sound) sound->field_70 = v6; return; +#endif } // 0x4ACC58 int soundInit(int a1, int a2, int a3, int a4, int rate) { +#ifdef HAVE_DSOUND HRESULT hr; DWORD v24; @@ -475,11 +483,16 @@ out: gSoundLastError = SOUND_NO_ERROR; return 0; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AD04C void soundExit() { +#ifdef HAVE_DSOUND while (gSoundListHead != NULL) { Sound* next = gSoundListHead->next; soundDelete(gSoundListHead); @@ -508,11 +521,13 @@ void soundExit() gSoundLastError = SOUND_NO_ERROR; gSoundInitialized = false; +#endif } // 0x4AD0FC Sound* soundAllocate(int a1, int a2) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return NULL; @@ -588,6 +603,10 @@ Sound* soundAllocate(int a1, int a2) gSoundListHead = sound; return sound; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return NULL; +#endif } // 0x4AD308 @@ -680,6 +699,7 @@ int soundLoad(Sound* sound, char* filePath) // 0x4AD504 int _soundRewind(Sound* sound) { +#ifdef HAVE_DSOUND HRESULT hr; if (!gSoundInitialized) { @@ -713,11 +733,16 @@ int _soundRewind(Sound* sound) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AD5C8 int _addSoundData(Sound* sound, unsigned char* buf, int size) { +#ifdef HAVE_DSOUND HRESULT hr; void* audio_ptr_1; DWORD audio_bytes_1; @@ -749,11 +774,16 @@ int _addSoundData(Sound* sound, unsigned char* buf, int size) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AD6C0 int _soundSetData(Sound* sound, unsigned char* buf, int size) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return gSoundLastError; @@ -774,11 +804,16 @@ int _soundSetData(Sound* sound, unsigned char* buf, int size) } return _addSoundData(sound, buf, size); +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AD73C int soundPlay(Sound* sound) { +#ifdef HAVE_DSOUND HRESULT hr; DWORD readPos; DWORD writePos; @@ -816,11 +851,16 @@ int soundPlay(Sound* sound) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AD828 int soundStop(Sound* sound) { +#ifdef HAVE_DSOUND HRESULT hr; if (!gSoundInitialized) { @@ -849,6 +889,10 @@ int soundStop(Sound* sound) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AD8DC @@ -878,6 +922,7 @@ int soundDelete(Sound* sample) // 0x4AD948 int soundContinue(Sound* sound) { +#ifdef HAVE_DSOUND HRESULT hr; DWORD status; @@ -942,11 +987,16 @@ int soundContinue(Sound* sound) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4ADA84 bool soundIsPlaying(Sound* sound) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return false; @@ -958,11 +1008,16 @@ bool soundIsPlaying(Sound* sound) } return (sound->field_40 & SOUND_FLAG_SOUND_IS_PLAYING) != 0; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return false; +#endif } // 0x4ADAC4 bool _soundDone(Sound* sound) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return false; @@ -974,11 +1029,16 @@ bool _soundDone(Sound* sound) } return sound->field_40 & 1; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return false; +#endif } // 0x4ADB44 bool soundIsPaused(Sound* sound) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return false; @@ -990,11 +1050,16 @@ bool soundIsPaused(Sound* sound) } return (sound->field_40 & SOUND_FLAG_SOUND_IS_PAUSED) != 0; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return false; +#endif } // 0x4ADBC4 int _soundType(Sound* sound, int a2) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return 0; @@ -1006,11 +1071,16 @@ int _soundType(Sound* sound, int a2) } return sound->field_44 & a2; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return 0; +#endif } // 0x4ADC04 int soundGetDuration(Sound* sound) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return gSoundLastError; @@ -1030,6 +1100,10 @@ int soundGetDuration(Sound* sound) } return result; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4ADD00 @@ -1083,6 +1157,7 @@ int _soundVolumeHMItoDirectSound(int volume) // 0x4ADE0C int soundSetVolume(Sound* sound, int volume) { +#ifdef HAVE_DSOUND int normalizedVolume; HRESULT hr; @@ -1113,11 +1188,16 @@ int soundSetVolume(Sound* sound, int volume) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4ADE80 int _soundGetVolume(Sound* sound) { +#ifdef HAVE_DSOUND long volume; int v13; int v8; @@ -1150,6 +1230,10 @@ int _soundGetVolume(Sound* sound) } return sound->volume; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4ADFF0 @@ -1175,6 +1259,7 @@ int soundSetCallback(Sound* sound, SoundCallback* callback, void* userData) // 0x4AE02C int soundSetChannels(Sound* sound, int channels) { +#ifdef HAVE_DSOUND LPWAVEFORMATEX format; if (!gSoundInitialized) { @@ -1197,6 +1282,10 @@ int soundSetChannels(Sound* sound, int channels) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AE0B0 @@ -1223,6 +1312,7 @@ int soundSetReadLimit(Sound* sound, int readLimit) // 0x4AE0E4 int soundPause(Sound* sound) { +#ifdef HAVE_DSOUND HRESULT hr; DWORD readPos; DWORD writePos; @@ -1262,6 +1352,10 @@ int soundPause(Sound* sound) sound->field_40 |= SOUND_FLAG_SOUND_IS_PAUSED; return soundStop(sound); +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // TODO: Check, looks like it uses couple of inlined functions. @@ -1269,6 +1363,7 @@ int soundPause(Sound* sound) // 0x4AE1F0 int soundResume(Sound* sound) { +#ifdef HAVE_DSOUND HRESULT hr; if (!gSoundInitialized) { @@ -1301,6 +1396,10 @@ int soundResume(Sound* sound) sound->field_48 = 0; return soundPlay(sound); +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AE2FC @@ -1351,6 +1450,7 @@ int soundSetFileIO(Sound* sound, SoundOpenProc* openProc, SoundCloseProc* closeP // 0x4AE378 void soundDeleteInternal(Sound* sound) { +#ifdef HAVE_DSOUND STRUCT_51D478* curr; Sound* v10; Sound* v11; @@ -1409,6 +1509,7 @@ void soundDeleteInternal(Sound* sound) } gSoundFreeProc(sound); +#endif } // 0x4AE578 @@ -1454,6 +1555,7 @@ void _removeTimedEvent(unsigned int* timerId) // 0x4AE634 int _soundGetPosition(Sound* sound) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return gSoundLastError; @@ -1477,11 +1579,16 @@ int _soundGetPosition(Sound* sound) } return playPos; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AE6CC int _soundSetPosition(Sound* sound, int a2) { +#ifdef HAVE_DSOUND if (!gSoundInitialized) { gSoundLastError = SOUND_NOT_INITIALIZED; return gSoundLastError; @@ -1529,6 +1636,10 @@ int _soundSetPosition(Sound* sound, int a2) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AE830 @@ -1613,6 +1724,7 @@ void _fadeSounds() // 0x4AE988 int _internalSoundFade(Sound* sound, int a2, int a3, int a4) { +#ifdef HAVE_DSOUND STRUCT_51D478* ptr; if (!_deviceInit) { @@ -1701,6 +1813,10 @@ int _internalSoundFade(Sound* sound, int a2, int a3, int a4) gSoundLastError = SOUND_NO_ERROR; return gSoundLastError; +#else + gSoundLastError = SOUND_NOT_IMPLEMENTED; + return gSoundLastError; +#endif } // 0x4AEB0C diff --git a/src/sound.h b/src/sound.h index 3e5f781..caf1d45 100644 --- a/src/sound.h +++ b/src/sound.h @@ -44,6 +44,8 @@ typedef enum SoundError { SOUND_INVALID_HANDLE = 30, SOUND_NO_MEMORY_AVAILABLE = 31, SOUND_UNKNOWN_ERROR = 32, + // TODO: Remove once DirectX -> SDL transition is completed. + SOUND_NOT_IMPLEMENTED = 33, SOUND_ERR_COUNT, } SoundError; @@ -72,8 +74,10 @@ typedef void SoundCallback(void* userData, int a2); typedef struct Sound { SoundFileIO io; unsigned char* field_20; +#ifdef HAVE_DSOUND LPDIRECTSOUNDBUFFER directSoundBuffer; DSBUFFERDESC directSoundBufferDescription; +#endif int field_3C; // flags int field_40; @@ -128,7 +132,9 @@ extern const char* gSoundErrorDescriptions[SOUND_ERR_COUNT]; extern int gSoundLastError; extern int _masterVol; +#ifdef HAVE_DSOUND extern LPDIRECTSOUNDBUFFER gDirectSoundPrimaryBuffer; +#endif extern int _sampleRate; extern int _numSounds; extern int _deviceInit; @@ -136,7 +142,9 @@ extern int _dataSize; extern int _numBuffers; extern bool gSoundInitialized; extern Sound* gSoundListHead; +#ifdef HAVE_DSOUND extern LPDIRECTSOUND gDirectSound; +#endif void* soundMallocProcDefaultImpl(size_t size); void* soundReallocProcDefaultImpl(void* ptr, size_t size); diff --git a/src/win32.cc b/src/win32.cc index c72c894..5e55a10 100644 --- a/src/win32.cc +++ b/src/win32.cc @@ -5,9 +5,12 @@ #include "window_manager.h" #include +#include +#ifdef HAVE_DSOUND // 0x51E430 DirectSoundCreateProc* gDirectSoundCreateProc = NULL; +#endif // 0x51E434 HWND gProgramWindow = NULL; @@ -18,8 +21,10 @@ bool gProgramIsActive = false; // GNW95MUTEX HANDLE _GNW95_mutex = NULL; +#ifdef HAVE_DSOUND // 0x51E454 HMODULE gDSoundDLL = NULL; +#endif // 0x4DE700 int main(int argc, char* argv[]) @@ -39,6 +44,7 @@ int main(int argc, char* argv[]) // 0x4DE8D0 bool _LoadDirectX() { +#ifdef HAVE_DSOUND gDSoundDLL = LoadLibraryA("DSOUND.DLL"); if (gDSoundDLL == NULL) { goto err; @@ -48,6 +54,7 @@ bool _LoadDirectX() if (gDirectSoundCreateProc == NULL) { goto err; } +#endif atexit(_UnloadDirectX); @@ -55,7 +62,7 @@ bool _LoadDirectX() err: _UnloadDirectX(); - + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Could not load DirectX", "This program requires DirectX 3.0a or later.", NULL); return false; @@ -64,8 +71,10 @@ err: // 0x4DE988 void _UnloadDirectX(void) { +#ifdef HAVE_DSOUND if (gDSoundDLL != NULL) { FreeLibrary(gDSoundDLL); gDSoundDLL = NULL; } +#endif } diff --git a/src/win32.h b/src/win32.h index 45056cd..d44564d 100644 --- a/src/win32.h +++ b/src/win32.h @@ -1,23 +1,25 @@ #ifndef WIN32_H #define WIN32_H +#include "dsound_compat.h" + #define WIN32_LEAN_AND_MEAN #define NOMINMAX #include -#include - -#define DIRECTSOUND_VERSION 0x0300 -#include - +#ifdef HAVE_DSOUND typedef HRESULT(__stdcall DirectSoundCreateProc)(GUID*, LPDIRECTSOUND*, IUnknown*); +#endif +#ifdef HAVE_DSOUND extern DirectSoundCreateProc* gDirectSoundCreateProc; +#endif extern HWND gProgramWindow; extern bool gProgramIsActive; extern HANDLE _GNW95_mutex; +#ifdef HAVE_DSOUND extern HMODULE gDSoundDLL; - +#endif bool _LoadDirectX(); void _UnloadDirectX(void);