Browse Source

Implement more of the init, audio and video system

- Fix audio for videos with 8bit audio
- Allow muting music and audio
- Save audio volumns to ini
pull/25/head
Anders Jenbo 7 years ago
parent
commit
eea41503f1
  1. 1
      .gitignore
  2. 59
      SourceS/miniwin.h
  3. 3
      SourceS/miniwin_dsound.h
  4. 1
      SourceX/dvlnet/tcp_client.cpp
  5. 114
      SourceX/init.cpp
  6. 73
      SourceX/miniwin.cpp
  7. 35
      SourceX/movie.cpp
  8. 317
      SourceX/sound.cpp
  9. 12
      SourceX/storm.cpp

1
.gitignore vendored

@ -3,6 +3,7 @@
#ignore cmake cache #ignore cmake cache
/build/ /build/
/build32/
.vscode/tasks.json .vscode/tasks.json
# ELF object file. # ELF object file.

59
SourceS/miniwin.h

@ -286,7 +286,7 @@ VOID WINAPI SetLastError(DWORD dwErrCode);
WINBOOL WINAPI CloseHandle(HANDLE hObject); WINBOOL WINAPI CloseHandle(HANDLE hObject);
HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, WINBOOL bManualReset, WINBOOL bInitialState, HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, WINBOOL bManualReset, WINBOOL bInitialState,
LPCSTR lpName); LPCSTR lpName);
#define CreateEvent CreateEventA #define CreateEvent CreateEventA
BOOL WINAPI SetEvent(HANDLE hEvent); BOOL WINAPI SetEvent(HANDLE hEvent);
BOOL WINAPI ResetEvent(HANDLE hEvent); BOOL WINAPI ResetEvent(HANDLE hEvent);
@ -326,7 +326,7 @@ HWND WINAPI FindWindowA(LPCSTR lpClassName, LPCSTR lpWindowName);
#define THREAD_PRIORITY_ABOVE_NORMAL (THREAD_PRIORITY_HIGHEST - 1) #define THREAD_PRIORITY_ABOVE_NORMAL (THREAD_PRIORITY_HIGHEST - 1)
uintptr_t __cdecl _beginthreadex(void *_Security, unsigned _StackSize, unsigned(__stdcall *_StartAddress)(void *), uintptr_t __cdecl _beginthreadex(void *_Security, unsigned _StackSize, unsigned(__stdcall *_StartAddress)(void *),
void *_ArgList, unsigned _InitFlag, unsigned *_ThrdAddr); void *_ArgList, unsigned _InitFlag, unsigned *_ThrdAddr);
HANDLE WINAPI GetCurrentThread(VOID); HANDLE WINAPI GetCurrentThread(VOID);
DWORD WINAPI GetCurrentThreadId(VOID); DWORD WINAPI GetCurrentThreadId(VOID);
WINBOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority); WINBOOL WINAPI SetThreadPriority(HANDLE hThread, int nPriority);
@ -418,18 +418,18 @@ typedef struct _PROCESS_INFORMATION {
typedef void *LPSTARTUPINFOA; typedef void *LPSTARTUPINFOA;
WINBOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, WINBOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation); LPPROCESS_INFORMATION lpProcessInformation);
#define CreateProcess CreateProcessA #define CreateProcess CreateProcessA
VOID WINAPI ExitProcess(UINT uExitCode); VOID WINAPI ExitProcess(UINT uExitCode);
DWORD WINAPI GetCurrentProcessId(VOID); DWORD WINAPI GetCurrentProcessId(VOID);
HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect,
DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName); DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName);
#define CreateFileMapping CreateFileMappingA #define CreateFileMapping CreateFileMappingA
LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap); DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap);
WINBOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress); WINBOOL WINAPI UnmapViewOfFile(LPCVOID lpBaseAddress);
DWORD WINAPI WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds); DWORD WINAPI WaitForInputIdle(HANDLE hProcess, DWORD dwMilliseconds);
@ -438,13 +438,33 @@ HWND WINAPI GetWindow(HWND hWnd, UINT uCmd);
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId); DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId);
DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString,
DWORD nSize, LPCSTR lpFileName); DWORD nSize, LPCSTR lpFileName);
#define GetPrivateProfileString GetPrivateProfileStringA #define GetPrivateProfileString GetPrivateProfileStringA
int MessageBoxA(HWND hWnd, const char *Text, const char *Title, UINT Flags); int MessageBoxA(HWND hWnd, const char *Text, const char *Title, UINT Flags);
#define MessageBox MessageBoxA #define MessageBox MessageBoxA
typedef LONG LSTATUS, HKEY, REGSAM, PHKEY;
#define HKEY_CURRENT_USER 1
#define KEY_READ 0x20019
#define KEY_WRITE 0x20006
#define REG_SZ 1
LSTATUS RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
#define RegOpenKeyEx RegOpenKeyExA
LSTATUS RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, BYTE *lpData, LPDWORD lpcbData);
#define RegQueryValueEx RegQueryValueExA
LSTATUS RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData);
#define RegSetValueEx RegSetValueExA
LSTATUS RegCloseKeyA(HKEY hKey);
#define RegCloseKey RegCloseKeyA
void PostQuitMessage(int nExitCode);
LRESULT DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
#define DefWindowProc DefWindowProcA
LONG GetWindowLongA(HWND hWnd, int nIndex);
#define GetWindowLong GetWindowLongA
LONG SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong);
#define SetWindowLong SetWindowLongA
WINBOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, WINBOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped); LPOVERLAPPED lpOverlapped);
DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); DWORD WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
WINBOOL WINAPI SetEndOfFile(HANDLE hFile); WINBOOL WINAPI SetEndOfFile(HANDLE hFile);
DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName); DWORD WINAPI GetFileAttributesA(LPCSTR lpFileName);
@ -455,16 +475,16 @@ HANDLE WINAPI FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileDat
#define FindFirstFile FindFirstFileA #define FindFirstFile FindFirstFileA
WINBOOL WINAPI FindClose(HANDLE hFindFile); WINBOOL WINAPI FindClose(HANDLE hFindFile);
HANDLE WINAPI CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, HANDLE WINAPI CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
#define CreateFile CreateFileA #define CreateFile CreateFileA
WINBOOL WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, WINBOOL WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped); LPOVERLAPPED lpOverlapped);
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh); DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize); UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize);
#define GetWindowsDirectory GetWindowsDirectoryA #define GetWindowsDirectory GetWindowsDirectoryA
WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters);
#define GetDiskFreeSpace GetDiskFreeSpaceA #define GetDiskFreeSpace GetDiskFreeSpaceA
DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize); DWORD WINAPI GetModuleFileNameA(HMODULE hModule, LPSTR lpFilename, DWORD nSize);
#define GetModuleFileName GetModuleFileNameA #define GetModuleFileName GetModuleFileNameA
@ -476,6 +496,10 @@ WINBOOL WINAPI CopyFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, WINBOO
#define CopyFile CopyFileA #define CopyFile CopyFileA
HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle); HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle);
#define GWL_STYLE (-16)
#define WS_SYSMENU 0x00080000L
// //
// Events // Events
// //
@ -498,6 +522,15 @@ HFILE WINAPI OpenFile(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle);
#define WM_CHAR 0x0102 #define WM_CHAR 0x0102
#define WM_CAPTURECHANGED 0x0215 #define WM_CAPTURECHANGED 0x0215
#define WM_CREATE 0x0001
#define WM_DESTROY 0x0002
#define WM_PAINT 0x000F
#define WM_CLOSE 0x0010
#define WM_ERASEBKGND 0x0014
#define WM_ACTIVATEAPP 0x001C
#define WM_QUERYNEWPALETTE 0x030F
#define WM_PALETTECHANGED 0x0311
#define SC_CLOSE 0xF060 #define SC_CLOSE 0xF060
#define VK_RETURN 0x0D #define VK_RETURN 0x0D

3
SourceS/miniwin_dsound.h

@ -30,7 +30,8 @@ DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown)
// clang-format on // clang-format on
}; };
typedef void *LPDIRECTSOUNDBUFFER, *LPDSCAPS, *LPUNKNOWN, *LPCGUID; typedef IDirectSoundBuffer *LPDIRECTSOUNDBUFFER;
typedef void *LPDSCAPS, *LPUNKNOWN, *LPCGUID;
DECLARE_INTERFACE_(IDirectSound, IUnknown) DECLARE_INTERFACE_(IDirectSound, IUnknown)
{ {

1
SourceX/dvlnet/tcp_client.cpp

@ -1,4 +1,5 @@
#include "dvlnet/tcp_client.h" #include "dvlnet/tcp_client.h"
#include <functional>
using namespace dvlnet; using namespace dvlnet;

114
SourceX/init.cpp

@ -20,6 +20,8 @@ char gszProductName[260] = "Diablo v1.09";
void __fastcall init_cleanup(BOOL show_cursor) void __fastcall init_cleanup(BOOL show_cursor)
{ {
pfile_flush_W(); pfile_flush_W();
init_disable_screensaver(0);
init_run_office_from_start_menu();
if (diabdat_mpq) { if (diabdat_mpq) {
SFileCloseArchive(diabdat_mpq); SFileCloseArchive(diabdat_mpq);
@ -36,16 +38,52 @@ void __fastcall init_cleanup(BOOL show_cursor)
UiDestroy(); UiDestroy();
effects_cleanup_sfx(); effects_cleanup_sfx();
//sound_cleanup(); sound_cleanup();
NetClose(); NetClose();
dx_cleanup(); dx_cleanup();
MI_Dummy(show_cursor); MI_Dummy(show_cursor);
//StormDestroy(); StormDestroy();
if (show_cursor) if (show_cursor)
ShowCursor(TRUE); ShowCursor(TRUE);
} }
void __cdecl init_run_office_from_start_menu()
{
DUMMY();
}
// 634CA0: using guessed type int killed_mom_parent;
// SDL_DisableScreenSaver
void __fastcall init_disable_screensaver(BOOLEAN disable)
{
BOOLEAN v1; // al
char Data[16]; // [esp+4h] [ebp-20h]
DWORD Type; // [esp+14h] [ebp-10h]
DWORD cbData; // [esp+18h] [ebp-Ch]
HKEY phkResult; // [esp+1Ch] [ebp-8h]
BOOLEAN v6; // [esp+20h] [ebp-4h]
// BUGFIX: this is probably the worst possible way to do this. Alternatives: ExtEscape() with SETPOWERMANAGEMENT,
// SystemParametersInfo() with SPI_SETSCREENSAVEACTIVE/SPI_SETPOWEROFFACTIVE/SPI_SETLOWPOWERACTIVE
v6 = disable;
if (!RegOpenKeyEx(HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, KEY_READ | KEY_WRITE, &phkResult)) {
if (v6) {
cbData = 16;
if (!RegQueryValueEx(phkResult, "ScreenSaveActive", 0, &Type, (LPBYTE)Data, &cbData))
screensaver_enabled_prev = Data[0] != '0';
v1 = 0;
} else {
v1 = screensaver_enabled_prev;
}
Data[1] = 0;
Data[0] = (v1 != 0) + '0';
RegSetValueEx(phkResult, "ScreenSaveActive", 0, REG_SZ, (const BYTE *)Data, 2u);
RegCloseKey(phkResult);
}
}
/** /**
* Case insensitive search for a file name in a directory. * Case insensitive search for a file name in a directory.
* @return Empty string when not found. * @return Empty string when not found.
@ -84,6 +122,11 @@ static std::string find_file_in_std_directories(const char *file)
TermMsg("Required file %s not found", file); TermMsg("Required file %s not found", file);
} }
void FakeWMDestroy()
{
MainWndProc(NULL, WM_DESTROY, NULL, NULL);
}
void __fastcall init_create_window(int nCmdShow) void __fastcall init_create_window(int nCmdShow)
{ {
DUMMY(); DUMMY();
@ -120,11 +163,76 @@ void __fastcall init_create_window(int nCmdShow)
init_archives(); init_archives();
gmenu_init_menu(); gmenu_init_menu();
atexit(FakeWMDestroy);
} }
LRESULT __stdcall MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) LRESULT __stdcall MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{ {
UNIMPLEMENTED(); if (Msg > WM_ERASEBKGND) {
if (Msg == WM_ACTIVATEAPP) {
init_activate_window(hWnd, wParam);
} else {
if (Msg == WM_QUERYNEWPALETTE) {
SDrawRealizePalette();
return 1;
}
if (Msg == WM_PALETTECHANGED && (HWND)wParam != hWnd)
SDrawRealizePalette();
}
} else {
switch (Msg) {
case WM_ERASEBKGND:
return 0;
case WM_CREATE:
ghMainWnd = hWnd;
break;
case WM_DESTROY:
init_cleanup(1);
ghMainWnd = 0;
PostQuitMessage(0);
break;
case WM_PAINT:
drawpanflag = 255;
break;
case WM_CLOSE:
return 0;
}
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
void __fastcall init_activate_window(HWND hWnd, BOOLEAN bActive)
{
LONG dwNewLong; // eax
gbActive = bActive;
UiAppActivate(bActive);
dwNewLong = GetWindowLong(hWnd, GWL_STYLE);
if (gbActive && fullscreen)
dwNewLong &= ~WS_SYSMENU;
else
dwNewLong |= WS_SYSMENU;
SetWindowLong(hWnd, GWL_STYLE, dwNewLong);
if (gbActive) {
drawpanflag = 255;
ResetPal();
}
}
// 52571C: using guessed type int drawpanflag;
// 634980: using guessed type int gbActive;
LRESULT __stdcall WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
LRESULT result; // eax
if (CurrentProc)
result = CurrentProc(hWnd, Msg, wParam, lParam);
else
result = MainWndProc(hWnd, Msg, wParam, lParam);
return result;
} }
WNDPROC __fastcall SetWindowProc(WNDPROC NewProc) WNDPROC __fastcall SetWindowProc(WNDPROC NewProc)

73
SourceX/miniwin.cpp

@ -79,7 +79,7 @@ UINT WINAPI GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize)
} }
WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, WINBOOL WINAPI GetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters) LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters)
{ {
struct statvfs fiData; struct statvfs fiData;
int success = statvfs("/", &fiData); int success = statvfs("/", &fiData);
@ -231,9 +231,9 @@ UINT WINAPI GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALET
} }
WINBOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, WINBOOL WINAPI CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags, LPSECURITY_ATTRIBUTES lpThreadAttributes, WINBOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation) LPPROCESS_INFORMATION lpProcessInformation)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
} }
@ -249,7 +249,7 @@ DWORD WINAPI GetCurrentProcessId(VOID)
} }
HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect,
DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName) DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCSTR lpName)
{ {
DUMMY(); DUMMY();
assert(hFile == (HANDLE)-1); assert(hFile == (HANDLE)-1);
@ -257,7 +257,7 @@ HANDLE WINAPI CreateFileMappingA(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappi
} }
LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, LPVOID WINAPI MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap) DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
} }
@ -288,7 +288,7 @@ DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, LPDWORD lpdwProcessId)
} }
DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString, DWORD WINAPI GetPrivateProfileStringA(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpDefault, LPSTR lpReturnedString,
DWORD nSize, LPCSTR lpFileName) DWORD nSize, LPCSTR lpFileName)
{ {
if (!SRegLoadString(lpAppName, lpKeyName, 0, lpReturnedString, nSize)) { if (!SRegLoadString(lpAppName, lpKeyName, 0, lpReturnedString, nSize)) {
strncpy(lpReturnedString, lpDefault, nSize); strncpy(lpReturnedString, lpDefault, nSize);
@ -307,3 +307,62 @@ int MessageBoxA(HWND hWnd, const char *Text, const char *Title, UINT Flags)
SDL_ShowSimpleMessageBox(SDLFlags, Title, Text, window) < 0 ? -1 : 0; SDL_ShowSimpleMessageBox(SDLFlags, Title, Text, window) < 0 ? -1 : 0;
} }
LSTATUS RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
{
return 1;
};
/**
* @brief This is only ever used to enable or disable the screen saver in a hackish way
* For all other settings operation SReg* from Storm is used instead.
*/
LSTATUS RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, BYTE *lpData, LPDWORD lpcbData)
{
if (SDL_IsScreenSaverEnabled()) {
lpData[0] = '0';
lpData[1] = '\0';
}
return 1;
};
/**
* @brief This is only ever used to enable or disable the screen saver in a hackish way
* For all other settings operation SReg* from Storm is used instead.
*/
LSTATUS RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData)
{
if (lpData[0] == '0') {
SDL_DisableScreenSaver();
} else {
SDL_EnableScreenSaver();
}
return 1;
};
LSTATUS RegCloseKeyA(HKEY hKey)
{
return 1;
};
void PostQuitMessage(int nExitCode)
{
DUMMY(); // Possibly use SDL_PumpEvents
}
LRESULT DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
DUMMY();
}
LONG GetWindowLongA(HWND hWnd, int nIndex)
{
DUMMY();
}
LONG SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
{
DUMMY();
}

35
SourceX/movie.cpp

@ -8,13 +8,10 @@ void __fastcall play_movie(char *pszMovie, BOOL user_can_close)
{ {
DUMMY_PRINT("%s", pszMovie); DUMMY_PRINT("%s", pszMovie);
SDL_DestroyTexture(texture);
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, 320, 156);
SDL_RenderSetLogicalSize(renderer, 320, 156);
void *video_stream; void *video_stream;
movie_playing = TRUE; movie_playing = TRUE;
//sound_disable_music(TRUE); sound_disable_music(TRUE);
sfx_stop(); sfx_stop();
effects_play_sound("Sfx\\Misc\\blank.wav"); effects_play_sound("Sfx\\Misc\\blank.wav");
@ -26,9 +23,6 @@ void __fastcall play_movie(char *pszMovie, BOOL user_can_close)
int bytestoread = SFileGetFileSize(directsound, 0); int bytestoread = SFileGetFileSize(directsound, 0);
fileBuffer = DiabloAllocPtr(bytestoread); fileBuffer = DiabloAllocPtr(bytestoread);
SFileReadFile(directsound, fileBuffer, bytestoread, NULL, 0); SFileReadFile(directsound, fileBuffer, bytestoread, NULL, 0);
if (Mix_OpenAudio(22050, AUDIO_S16LSB, 1, 512) < 0) {
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
}
/* file meta-info */ /* file meta-info */
unsigned long width, height, nFrames; unsigned long width, height, nFrames;
@ -48,9 +42,16 @@ void __fastcall play_movie(char *pszMovie, BOOL user_can_close)
smk_enable_all(smacker, -1); smk_enable_all(smacker, -1);
smk_info_all(smacker, NULL, &nFrames, &usPerFrame); smk_info_all(smacker, NULL, &nFrames, &usPerFrame);
smk_info_video(smacker, &width, &height, NULL); smk_info_video(smacker, &width, &height, NULL);
smk_info_audio(smacker, &a_trackmask, a_channels, a_depth, a_rate); smk_info_audio(smacker, &a_trackmask, a_channels, a_depth, a_rate);
printf("Audio info for track 0: bit-depth %u, channels %u, rate %u\n", a_depth[0], a_channels[0], a_rate[0]); if (a_depth[0] && Mix_OpenAudio(a_rate[0], a_depth[0] == 16 ? AUDIO_S16LSB : AUDIO_U8, a_channels[0], 512) < 0) {
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
}
SDL_DestroyTexture(texture);
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, width, height);
SDL_RenderSetLogicalSize(renderer, width, height);
smk_first(smacker); smk_first(smacker);
@ -61,7 +62,9 @@ void __fastcall play_movie(char *pszMovie, BOOL user_can_close)
switch (event.type) { switch (event.type) {
case SDL_KEYDOWN: case SDL_KEYDOWN:
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
movie_playing = false; if (user_can_close) {
movie_playing = false;
}
break; break;
case SDL_QUIT: case SDL_QUIT:
exit(0); exit(0);
@ -110,13 +113,13 @@ void __fastcall play_movie(char *pszMovie, BOOL user_can_close)
} }
smk_close(smacker); smk_close(smacker);
}
Mix_CloseAudio(); SDL_DestroyTexture(texture);
if (Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 1024) < 0) { texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, SCREEN_WIDTH, SCREEN_HEIGHT);
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError()); SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT);
if (a_depth[0] && Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 1024) < 0) {
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
}
} }
SDL_DestroyTexture(texture);
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, SCREEN_WIDTH, SCREEN_HEIGHT);
SDL_RenderSetLogicalSize(renderer, SCREEN_WIDTH, SCREEN_HEIGHT);
} }

317
SourceX/sound.cpp

@ -1,116 +1,47 @@
//HEADER_GOES_HERE
#include "../types.h"
#include "pch.h" #include "pch.h"
bool SoundInited; LPDIRECTSOUNDBUFFER DSBs[8];
LPDIRECTSOUND sglpDS;
char gbSndInited; char gbSndInited;
BYTE gbDupSounds; int sglMusicVolume;
unsigned char channels = 8; // defines how many channels, respectively how many *.wav files can be played at the same time int sglSoundVolume;
UCHAR gbMusicOn; HMODULE hDsound_dll;
UCHAR gbSoundOn; HANDLE sgpMusicTrack;
LPDIRECTSOUNDBUFFER sglpDSB;
char *sgszMusicTracks[6] = { "Music\\DTowne.wav", "Music\\DLvlA.wav", "Music\\DLvlB.wav",
"Music\\DLvlC.wav", "Music\\DLvlD.wav", "Music\\Dintro.wav" }; /* data */
void __fastcall snd_init(HWND hWnd) BYTE gbMusicOn = TRUE;
{ BYTE gbSoundOn = TRUE;
DUMMY(); BYTE gbDupSounds = TRUE;
printf("\nSND INIT\n"); int sgnMusicTrack = 6;
char *sgszMusicTracks[NUM_MUSIC] = {
/* following function Mix_AllocateChannels allocates the number of channels of simultaneously played sounds.*/ "Music\\DTowne.wav",
printf("Opened %i sound channels\n\n", Mix_AllocateChannels(channels)); "Music\\DLvlA.wav",
/* for example following possible channels: "Music\\DLvlB.wav",
1. music is playing "Music\\DLvlC.wav",
2. walking at the same time (walking sound) "Music\\DLvlD.wav",
3. reading a quest book at the same time "Music\\Dintro.wav"
4. perform a magic spell at the same time };
5. hitting an enemy at the same time char unk_volume[4][2] = {
5. enemy is dieing { 15, -16 },
6. enemy is losing an object an so on { 15, -16 },
So it is possible that the channels value has to be modified to adjust an amount of simultaneously played sounds in the future. { 30, -31 },
At this time 8 channels seem to be sufficient */ { 30, -31 }
};
if (Mix_OpenAudio(44100 /*sampling frequency*/, AUDIO_S16LSB /*Signed 16-bit samples, in little-endian byte order*/, 2 /*2 for stereo sound*/, 1024 /*size of each mixed sample*/) < 0) {
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
}
gbSndInited = 1;
gbSoundOn = 1;
SoundInited = 1;
}
void *sgpMusicTrack;
void *buffer;
// int bytestoread;
int channel = 2;
SDL_AudioSpec wanted;
static Uint8 *audio_chunk;
static Uint32 audio_len;
static Uint8 *audio_pos;
void fill_audio(void *udata, Uint8 *stream, int len) void __fastcall snd_update(BOOL bStopAll)
{ {
/* Only play if we have data left */ DUMMY_PRINT("snd_update: %d", bStopAll);
if (audio_len == 0)
return;
/* Mix as much data as possible */
len = (len > audio_len ? audio_len : len);
SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
audio_pos += len;
audio_len -= len;
} }
void __fastcall music_start(int nTrack) void __fastcall snd_stop_snd(TSnd *pSnd)
{
//DUMMY();
//wanted.freq = 44100; //seems not to be used at this time
//wanted.format = AUDIO_S16LSB; //seems not to be used at this time
//wanted.channels = 2; /* 1 = mono, 2 = stereo */ //seems not to be used at this time
//wanted.samples = 1024; /* Good low-latency value for callback */ //seems not to be used at this time
//wanted.callback = fill_audio; //seems not to be used at this time
//wanted.userdata = NULL; //seems not to be used at this time
gbSoundOn = true;
gbMusicOn = true;
int bytestoread;
int nread;
void *file;
int v6;
if (buffer != NULL) {
music_stop();
}
if (SoundInited) {
/// I know this needs clean up... I haven't the time to do this.
SFileOpenFile(sgszMusicTracks[nTrack], &sgpMusicTrack);
// This is a hack.... I don't like it .
// If you know this better than I , please help clean it up.
//Mix_OpenAudio(44100, AUDIO_S16LSB, 1, 1024); //No need to Mix_OpenAudio. Already done in the function __fastcall snd_init
//Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 1024);
file = sgpMusicTrack;
bytestoread = (int)SFileGetFileSize((HANDLE)file, 0);
buffer = DiabloAllocPtr(bytestoread);
SFileReadFile(file, (char *)buffer, bytestoread, (LPDWORD)&nread, 0);
SDL_RWops *rw = SDL_RWFromMem(buffer, bytestoread);
Mix_Music *Song = Mix_LoadMUS_RW(rw, 1);
Mix_PlayMusic(Song, -1);
// Mix_PlayChannel(2, Music, 0);
}
}
void __cdecl music_stop()
{ {
DUMMY(); DUMMY_ONCE();
Mix_HaltMusic(); Mix_HaltMusic();
Mix_HaltChannel(-1);
} }
BOOL __fastcall snd_playing(TSnd *pSnd) BOOL __fastcall snd_playing(TSnd *pSnd)
@ -124,13 +55,6 @@ void __fastcall snd_play_snd(TSnd *pSnd, int lVolume, int lPan)
Mix_PlayChannel(-1, pSnd->chunk, 0); Mix_PlayChannel(-1, pSnd->chunk, 0);
} }
void __fastcall snd_stop_snd(TSnd *pSnd)
{
DUMMY();
Mix_HaltMusic();
}
void *MSFXBuffer;
TSnd *__fastcall sound_file_load(char *path) TSnd *__fastcall sound_file_load(char *path)
{ {
int bytestoread; int bytestoread;
@ -142,8 +66,8 @@ TSnd *__fastcall sound_file_load(char *path)
SFileOpenFile(path, &file); SFileOpenFile(path, &file);
bytestoread = (int)SFileGetFileSize((HANDLE)file, 0); bytestoread = (int)SFileGetFileSize((HANDLE)file, 0);
MSFXBuffer = DiabloAllocPtr(bytestoread); char * MSFXBuffer = DiabloAllocPtr(bytestoread);
SFileReadFile(file, (char *)MSFXBuffer, bytestoread, (LPDWORD)&nrread, 0); SFileReadFile(file, MSFXBuffer, bytestoread, (LPDWORD)&nrread, 0);
SDL_RWops *rw = SDL_RWFromMem(MSFXBuffer, bytestoread); SDL_RWops *rw = SDL_RWFromMem(MSFXBuffer, bytestoread);
Mix_Chunk *SoundFX = Mix_LoadWAV_RW(rw, 1); Mix_Chunk *SoundFX = Mix_LoadWAV_RW(rw, 1);
@ -153,9 +77,6 @@ TSnd *__fastcall sound_file_load(char *path)
fx->sound_path = NULL; fx->sound_path = NULL;
return fx; return fx;
// printf("Sound_File_Load %s\n", path);
// UNIMPLEMENTED();
} }
void __fastcall sound_file_cleanup(TSnd *sound_file) void __fastcall sound_file_cleanup(TSnd *sound_file)
@ -163,20 +84,170 @@ void __fastcall sound_file_cleanup(TSnd *sound_file)
DUMMY(); DUMMY();
} }
int __fastcall sound_get_or_set_sound_volume(int volume) void __fastcall snd_init(HWND hWnd)
{
DUMMY();
printf("\nSND INIT\n");
/* following function Mix_AllocateChannels allocates the number of channels of simultaneously played sounds.*/
printf("Opened %i sound channels\n\n", Mix_AllocateChannels(8));
sound_load_volume("Sound Volume", &sglSoundVolume);
gbSoundOn = sglSoundVolume > VOLUME_MIN;
sound_load_volume("Music Volume", &sglMusicVolume);
gbMusicOn = sglMusicVolume > VOLUME_MIN;
if (Mix_OpenAudio(44100, AUDIO_S16LSB, 2, 1024) < 0) {
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
return;
}
gbSndInited = 1;
}
void __fastcall sound_load_volume(char *value_name, int *value)
{
int v = *value;
if (!SRegLoadValue("Diablo", value_name, 0, &v)) {
v = VOLUME_MAX;
}
*value = v;
if (*value < VOLUME_MIN) {
*value = VOLUME_MIN;
} else if (*value > VOLUME_MAX) {
*value = VOLUME_MAX;
}
*value -= *value % 100;
}
void __fastcall sound_create_primary_buffer(HANDLE music_track)
{
DUMMY();
}
void __cdecl sound_cleanup()
{
snd_update(TRUE);
//SVidDestroy();
SFileDdaDestroy();
if (sglpDS) {
#ifdef __cplusplus
sglpDS->Release();
#else
sglpDS->lpVtbl->Release(sglpDS);
#endif
sglpDS = NULL;
}
if (gbSndInited) {
gbSndInited = FALSE;
sound_store_volume("Sound Volume", sglSoundVolume);
sound_store_volume("Music Volume", sglMusicVolume);
}
}
void __fastcall sound_store_volume(char *key, int value)
{
SRegSaveValue("Diablo", key, 0, value);
}
void __cdecl music_stop()
{ {
DUMMY_PRINT("volume: %d", volume); DUMMY();
return volume; Mix_HaltMusic();
Mix_HaltChannel(-1);
}
void *buffer;
void __fastcall music_start(int nTrack)
{
BOOL success;
/// ASSERT: assert((DWORD) nTrack < NUM_MUSIC);
music_stop();
if (gbSndInited && gbMusicOn) {
#ifdef _DEBUG
SFileEnableDirectAccess(FALSE);
#endif
success = SFileOpenFile(sgszMusicTracks[nTrack], &sgpMusicTrack);
#ifdef _DEBUG
SFileEnableDirectAccess(TRUE);
#endif
sound_create_primary_buffer(sgpMusicTrack);
if (!success) {
sgpMusicTrack = 0;
} else {
int bytestoread = (int)SFileGetFileSize((HANDLE)sgpMusicTrack, 0);
char *buffer = DiabloAllocPtr(bytestoread);
SFileReadFile(sgpMusicTrack, buffer, bytestoread, NULL, 0);
SDL_RWops *rw = SDL_RWFromMem(buffer, bytestoread);
Mix_Music *Song = Mix_LoadMUS_RW(rw, 1);
Mix_PlayMusic(Song, -1);
sgnMusicTrack = nTrack;
}
}
}
void __fastcall sound_disable_music(BOOL disable)
{
if (disable) {
music_stop();
} else if (sgnMusicTrack != 6) {
music_start(sgnMusicTrack);
}
} }
int __fastcall sound_get_or_set_music_volume(int volume) int __fastcall sound_get_or_set_music_volume(int volume)
{ {
DUMMY_PRINT("volume: %d", volume); if (volume == 1)
return volume; return sglMusicVolume;
sglMusicVolume = volume;
if (sgpMusicTrack)
SFileDdaSetVolume(sgpMusicTrack, volume, 0);
return sglMusicVolume;
} }
void __fastcall snd_update(BOOL bStopAll) int __fastcall sound_get_or_set_sound_volume(int volume)
{ {
if (volume == 1)
return sglSoundVolume;
sglSoundVolume = volume;
// DUMMY_PRINT("stopall: %d", bStopAll); return sglSoundVolume;
}
/*
SDL_AudioSpec wanted;
static Uint32 audio_len;
static Uint8 *audio_pos;
void fill_audio(void *udata, Uint8 *stream, int len)
{
//DUMMY();
//wanted.freq = 44100; //seems not to be used at this time
//wanted.format = AUDIO_S16LSB; //seems not to be used at this time
//wanted.channels = 2; // 1 = mono, 2 = stereo, seems not to be used at this time
//wanted.samples = 1024; // Good low-latency value for callback, seems not to be used at this time
//wanted.callback = fill_audio; //seems not to be used at this time
//wanted.userdata = NULL; //seems not to be used at this time
// Only play if we have data left
if (audio_len == 0)
return;
// Mix as much data as possible
len = (len > audio_len ? audio_len : len);
SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
audio_pos += len;
audio_len -= len;
} }
*/

12
SourceX/storm.cpp

@ -439,12 +439,12 @@ void __stdcall SDrawMessageBox(char *Text, char *Title, int Flags)
//{ //{
// UNIMPLEMENTED(); // UNIMPLEMENTED();
//} //}
//
// bool __cdecl StormDestroy(void) BOOLEAN __cdecl StormDestroy(void)
//{ {
// UNIMPLEMENTED(); DUMMY();
//} }
//
// bool __stdcall SFileSetBasePath(char *) // bool __stdcall SFileSetBasePath(char *)
//{ //{
// UNIMPLEMENTED(); // UNIMPLEMENTED();

Loading…
Cancel
Save