119 lines
2.6 KiB
C++
119 lines
2.6 KiB
C++
|
#include "Main.h"
|
||
|
#include "../nu/AutoChar.h"
|
||
|
#include "../nu/AutoWide.h"
|
||
|
|
||
|
extern LARGE_INTEGER freq;
|
||
|
Out_Module* out_modules[32] = { 0 };
|
||
|
Out_Module* out_mod = 0;
|
||
|
|
||
|
typedef struct _PLUGINORDER
|
||
|
{
|
||
|
LPCWSTR name;
|
||
|
bool found;
|
||
|
} PLUGINORDER;
|
||
|
|
||
|
static PLUGINORDER preload[] =
|
||
|
{
|
||
|
{ L"out_ds.dll", false },
|
||
|
{ L"out_wave.dll", false },
|
||
|
{ L"out_disk.dll", false }
|
||
|
};
|
||
|
|
||
|
int LoadOutputPlugin(const wchar_t* plugin_filename, int index)
|
||
|
{
|
||
|
wchar_t file[MAX_PATH] = { 0 };
|
||
|
PathCombineW(file, PLUGINDIR, plugin_filename);
|
||
|
|
||
|
HINSTANCE hLib = LoadLibraryW(file);
|
||
|
if ( hLib == NULL )
|
||
|
return index;
|
||
|
|
||
|
|
||
|
Out_Module* (*pr)();
|
||
|
pr = (Out_Module * (__cdecl*)(void)) GetProcAddress(hLib, "winampGetOutModule");
|
||
|
if ( !pr )
|
||
|
return index;
|
||
|
|
||
|
|
||
|
Out_Module* mod = pr();
|
||
|
if ( mod && (mod->version == OUT_VER || mod->version == OUT_VER_U) )
|
||
|
{
|
||
|
AutoChar narrowFn(plugin_filename);
|
||
|
size_t fileNameSize = lstrlenA(narrowFn);
|
||
|
|
||
|
if ( g_safeMode )
|
||
|
{
|
||
|
if ( !(mod->id == 1471482036 || mod->id == 426119909 || mod->id == 203968848) )
|
||
|
{
|
||
|
FreeModule(hLib);
|
||
|
return index;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
mod->hDllInstance = hLib;
|
||
|
mod->hMainWindow = hMainWindow;
|
||
|
mod->id = (intptr_t)GlobalAlloc(GPTR, fileNameSize + 1);
|
||
|
|
||
|
StringCchCopyA((char*)mod->id, fileNameSize + 1, narrowFn);
|
||
|
|
||
|
mod->Init();
|
||
|
out_modules[index] = mod;
|
||
|
|
||
|
return index + 1;
|
||
|
}
|
||
|
|
||
|
|
||
|
return index;
|
||
|
}
|
||
|
|
||
|
void out_init()
|
||
|
{
|
||
|
int index = 0, i = 0, count = sizeof(preload) / sizeof(PLUGINORDER);
|
||
|
for ( ; i < count; i++ ) index = LoadOutputPlugin(preload[i].name, index);
|
||
|
|
||
|
WIN32_FIND_DATAW d = { 0 };
|
||
|
wchar_t dirstr[MAX_PATH] = { 0 };
|
||
|
PathCombineW(dirstr, PLUGINDIR, L"OUT_*.DLL");
|
||
|
HANDLE h = FindFirstFileW(dirstr, &d);
|
||
|
if ( h != INVALID_HANDLE_VALUE )
|
||
|
{
|
||
|
do
|
||
|
{
|
||
|
for ( i = 0; i < count && (preload[i].found || lstrcmpiW(preload[i].name, d.cFileName)); i++ );
|
||
|
if ( i == count ) index = LoadOutputPlugin(d.cFileName, index);
|
||
|
else preload[i].found = true;
|
||
|
} while ( FindNextFileW(h, &d) && index < 31 );
|
||
|
FindClose(h);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void out_setwnd(void)
|
||
|
{
|
||
|
for ( int x = 0; out_modules[x]; x++ )
|
||
|
{
|
||
|
out_modules[x]->hMainWindow = hMainWindow;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void out_changed(HINSTANCE hLib, int enabled)
|
||
|
{
|
||
|
typedef void(__cdecl* OutModeChange)(int);
|
||
|
OutModeChange modeChange = (OutModeChange)GetProcAddress(hLib, "winampGetOutModeChange");
|
||
|
if ( modeChange )
|
||
|
{
|
||
|
modeChange(enabled);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void out_deinit()
|
||
|
{
|
||
|
for ( int x = 0; out_modules[x]; x++ )
|
||
|
{
|
||
|
//HINSTANCE hLib = out_modules[x]->hDllInstance;
|
||
|
out_modules[x]->Quit();
|
||
|
GlobalFree((HGLOBAL)out_modules[x]->id);
|
||
|
out_modules[x]->id = 0;
|
||
|
//FreeLibrary(hLib); // benski> we're just going to let it leak because it might be subclassing
|
||
|
out_modules[x] = 0;
|
||
|
}
|
||
|
}
|