|
35 | 35 | #include <mmsystem.h>
|
36 | 36 | #include <malloc.h>
|
37 | 37 | #include <ddraw.h>
|
| 38 | +#include <filesystem> |
38 | 39 |
|
39 | 40 | #include "renderer.h"
|
40 | 41 | #include "hext.h"
|
@@ -3419,15 +3420,33 @@ __declspec(dllexport) BOOL __stdcall dotemuDeleteFileA(LPCSTR lpFileName)
|
3419 | 3420 | __declspec(dllexport) HRESULT __stdcall EAXDirectSoundCreate(LPGUID guid, LPLPDIRECTSOUND directsound, IUnknown FAR* unk)
|
3420 | 3421 | {
|
3421 | 3422 | typedef HRESULT(FAR PASCAL* LPEAXDIRECTSOUNDCREATE)(LPGUID, LPLPDIRECTSOUND, IUnknown FAR*);
|
| 3423 | + char eax_dll[MAX_PATH] = {}; |
3422 | 3424 |
|
3423 |
| - char eax_dll[MAX_PATH]; |
3424 |
| - GetSystemDirectoryA(eax_dll, sizeof(eax_dll)); |
3425 |
| - strcat(eax_dll, R"(\eax.dll)"); |
| 3425 | + if (std::filesystem::exists("creative_eax.dll")) { |
| 3426 | + // For portable installation, this name can be used to load the official Creative EAX 2.0+ DLL along with FFNx |
| 3427 | + snprintf(eax_dll, sizeof(eax_dll), R"(%s\creative_eax.dll)", basedir); |
| 3428 | + } else { |
| 3429 | + GetSystemDirectoryA(eax_dll, sizeof(eax_dll)); |
| 3430 | + strcat(eax_dll, R"(\eax.dll)"); |
| 3431 | + } |
| 3432 | + |
| 3433 | + FARPROC procDSoundCreate = NULL; |
| 3434 | + HMODULE hDll = LoadLibraryA(eax_dll); |
| 3435 | + if (hDll != NULL) { |
| 3436 | + procDSoundCreate = GetProcAddress(hDll, "EAXDirectSoundCreate"); |
| 3437 | + } |
3426 | 3438 |
|
3427 |
| - HMODULE hEaxDll = LoadLibraryA(eax_dll); |
3428 |
| - FARPROC procEaxDSoundCreate = GetProcAddress((HMODULE)hEaxDll, "EAXDirectSoundCreate"); |
| 3439 | + if (procDSoundCreate == NULL) { |
| 3440 | + ffnx_warning("%s: Cannot load EAX Library, please install Creative EAX Unified redistribuable version 2.0+\n", __func__); |
| 3441 | + |
| 3442 | + hDll = LoadLibraryA("dsound.dll"); |
| 3443 | + if (hDll != NULL) { |
| 3444 | + // EAXDirectSoundCreate is basically DirectSoundCreate with more features |
| 3445 | + procDSoundCreate = GetProcAddress(hDll, "DirectSoundCreate"); |
| 3446 | + } |
| 3447 | + } |
3429 | 3448 |
|
3430 |
| - return ((LPEAXDIRECTSOUNDCREATE)procEaxDSoundCreate)(guid, directsound, unk); |
| 3449 | + return LPEAXDIRECTSOUNDCREATE(procDSoundCreate)(guid, directsound, unk); |
3431 | 3450 | }
|
3432 | 3451 |
|
3433 | 3452 | void ffnx_inject_driver(struct game_obj* game_object)
|
|
0 commit comments