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 ec624c028..00517c143 100644 --- a/Source/effects.cpp +++ b/Source/effects.cpp @@ -1161,7 +1161,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 0e19f586b..13428c635 100644 --- a/SourceX/storm.cpp +++ b/SourceX/storm.cpp @@ -30,42 +30,45 @@ radon::File ini(getIniPath()); // UNIMPLEMENTED(); // } +Mix_Chunk *SFileChunk; BOOL 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 SFileDdaDestroy() { - DUMMY(); - return 0; + Mix_FreeChunk(SFileChunk); + + return TRUE; } BOOL SFileDdaEnd(HANDLE directsound) { - DUMMY(); - return 0; + Mix_HaltChannel(0); } -BOOL SFileDdaGetPos(HANDLE directsound, int a2, int a3) +BOOL SFileDdaGetPos(HANDLE directsound, int *current, int *end) { - DUMMY_ONCE(); - return true; + *current = 0; + *end = 1; + + if (Mix_GetChunk(0) != SFileChunk || !Mix_Playing(0)) { + *current = *end; + } + + return TRUE; } BOOL SFileDdaInitialize(HANDLE directsound)