From 7ba8351bc3dddaac34093c8f7a15b2e6722e9856 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sat, 16 Mar 2019 15:36:42 +0100 Subject: [PATCH] Fully implement SFileDda* fixes #24 fixes #22 --- 3rdParty/Storm/Source/storm.h | 2 +- Source/effects.cpp | 2 +- SourceX/storm.cpp | 37 +++++++++++++++++++---------------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/3rdParty/Storm/Source/storm.h b/3rdParty/Storm/Source/storm.h index 0d1c01378..01bca119a 100644 --- a/3rdParty/Storm/Source/storm.h +++ b/3rdParty/Storm/Source/storm.h @@ -482,7 +482,7 @@ BOOL STORMAPI SFileCloseFile(HANDLE hFile); BOOL STORMAPI SFileDdaBeginEx(HANDLE directsound, DWORD flags, DWORD mask, unsigned __int32 lDistanceToMove, signed __int32 volume, signed int pan, int a7); BOOL STORMAPI SFileDdaDestroy(); BOOL STORMAPI SFileDdaEnd(HANDLE directsound); -BOOL STORMAPI SFileDdaGetPos(HANDLE directsound, int a2, int a3); +BOOL STORMAPI SFileDdaGetPos(HANDLE directsound, int *current, int *end); BOOL STORMAPI SFileDdaInitialize(HANDLE directsound); BOOL STORMAPI SFileDdaSetVolume(HANDLE directsound, signed int bigvolume, signed int volume); diff --git a/Source/effects.cpp b/Source/effects.cpp index cc00da367..d19c6e422 100644 --- a/Source/effects.cpp +++ b/Source/effects.cpp @@ -1159,7 +1159,7 @@ void __cdecl sound_update() //v3 = v1; if (sfx_stream) { //_LOBYTE(v2) = SFileDdaGetPos(sfx_stream, (int)&v4, (int)&v3); - if (SFileDdaGetPos(sfx_stream, (INT_PTR)&v4, (INT_PTR)&v3)) { + if (SFileDdaGetPos(sfx_stream, &v4, &v3)) { if (v4 >= v3) sfx_stop(); } diff --git a/SourceX/storm.cpp b/SourceX/storm.cpp index b27aa89c6..0765c7ba1 100644 --- a/SourceX/storm.cpp +++ b/SourceX/storm.cpp @@ -26,41 +26,44 @@ radon::File ini(getIniPath()); // UNIMPLEMENTED(); // } +Mix_Chunk *SFileChunk; BOOL STORMAPI SFileDdaBeginEx(HANDLE directsound, DWORD flags, DWORD mask, unsigned __int32 lDistanceToMove, signed __int32 volume, signed int pan, int a7) { - DUMMY(); // Todo track when the sound can be released, see sfx_stop() - int bytestoread; - int nrread; - void *SFXbuffer; - - bytestoread = (int)SFileGetFileSize(directsound, 0); - SFXbuffer = DiabloAllocPtr(bytestoread); - SFileReadFile(directsound, (char *)SFXbuffer, bytestoread, (LPDWORD)&nrread, 0); + DWORD bytestoread = SFileGetFileSize(directsound, 0); + char *SFXbuffer = malloc(bytestoread); + SFileReadFile(directsound, SFXbuffer, bytestoread, NULL, 0); SDL_RWops *rw = SDL_RWFromConstMem(SFXbuffer, bytestoread); - Mix_Chunk *SoundFX = Mix_LoadWAV_RW(rw, 1); + SFileChunk = Mix_LoadWAV_RW(rw, 1); + free(SFXbuffer); - Mix_PlayChannel(-1, SoundFX, 0); + Mix_PlayChannel(0, SFileChunk, 0); - return 1; + return TRUE; } BOOL STORMAPI SFileDdaDestroy() { - DUMMY(); - return 0; + Mix_FreeChunk(SFileChunk); + + return TRUE; } BOOL STORMAPI SFileDdaEnd(HANDLE directsound) { - DUMMY(); - return 0; + Mix_HaltChannel(0); } -BOOL STORMAPI SFileDdaGetPos(HANDLE directsound, int a2, int a3) +BOOL STORMAPI SFileDdaGetPos(HANDLE directsound, int *current, int *end) { - DUMMY_ONCE(); + *current = 0; + *end = 1; + + if (Mix_GetChunk(0) != SFileChunk || !Mix_Playing(0)) { + *current = *end; + } + return TRUE; }