1344 lines
44 KiB
C++
1344 lines
44 KiB
C++
|
#include <precomp.h>
|
||
|
/*------------------------------------------------------------------------------------------------
|
||
|
Winamp 2.9/5 frontend class
|
||
|
------------------------------------------------------------------------------------------------*/
|
||
|
#include <stdio.h>
|
||
|
#include "main.h"
|
||
|
#include "wa2frontend.h"
|
||
|
#include "../winamp/wa_ipc.h"
|
||
|
#include "../winamp/ipc_pe.h"
|
||
|
#include "../gen_ml/ml.h"
|
||
|
#include "../gen_ml/main.h"
|
||
|
#include "../gen_hotkeys/wa_hotkeys.h"
|
||
|
#include "../nu/AutoChar.h"
|
||
|
#include "resource.h"
|
||
|
#include "../Agave/Language/api_language.h"
|
||
|
|
||
|
#define WINAMP_EDIT_ID3 40188
|
||
|
|
||
|
|
||
|
Winamp2FrontEnd wa2;
|
||
|
|
||
|
void Winamp2FrontEnd::init(HWND hwndParent)
|
||
|
{
|
||
|
// find Winamp's HWND so we can talk to it
|
||
|
hwnd_winamp = hwndParent; //FindWindow("Winamp v1.x",NULL);
|
||
|
|
||
|
// check that hwnd_winamp isnt null and that we know about this specific ipc version
|
||
|
getVersion();
|
||
|
|
||
|
// more init
|
||
|
enabled = 1;
|
||
|
visible = 1;
|
||
|
|
||
|
*(void **)&export_sa_get=(void*)SendMessageW(hwnd_winamp,WM_WA_IPC,2,IPC_GETSADATAFUNC);
|
||
|
*(void **)&export_sa_setreq=(void *)SendMessageW(hwnd_winamp,WM_WA_IPC,1,IPC_GETSADATAFUNC);
|
||
|
*(void **)&export_sa_get_deprecated=(void*)SendMessageW(hwnd_winamp,WM_WA_IPC,0,IPC_GETSADATAFUNC);
|
||
|
*(void **)&export_vu_get=(void*)SendMessageW(hwnd_winamp,WM_WA_IPC,0,IPC_GETVUDATAFUNC);
|
||
|
if (reinterpret_cast<intptr_t>(export_vu_get) == -1)
|
||
|
export_vu_get=0;
|
||
|
|
||
|
hwnd_playlist = getWnd(IPC_GETWND_PE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
Winamp2FrontEnd::Winamp2FrontEnd()
|
||
|
{
|
||
|
m_version = (char *)malloc(64);
|
||
|
*m_version = 0;
|
||
|
enabled = visible = foundvis =
|
||
|
saved_video =
|
||
|
#ifdef MINIBROWSER_SUPPORT
|
||
|
saved_mb =
|
||
|
#endif
|
||
|
saved_pe = saved_eq = saved_main = 0;
|
||
|
|
||
|
got_length_cache = 0;
|
||
|
cached_length = -1;
|
||
|
cached_length_time = 0;
|
||
|
got_pos_cache = 0;
|
||
|
cached_pos = -1;
|
||
|
cached_pos_time = 0;
|
||
|
|
||
|
video_ideal_height = -1;
|
||
|
video_ideal_width = -1;
|
||
|
|
||
|
hwnd_winamp = hwnd_playlist = NULL;
|
||
|
|
||
|
export_sa_get = 0;
|
||
|
export_sa_setreq = 0;
|
||
|
export_sa_get_deprecated = 0;
|
||
|
export_vu_get = 0;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
Winamp2FrontEnd::~Winamp2FrontEnd()
|
||
|
{
|
||
|
setWindowsVisible(1);
|
||
|
free(m_version);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
const char *Winamp2FrontEnd::getVersion()
|
||
|
{
|
||
|
if (hwnd_winamp == NULL)
|
||
|
{
|
||
|
char err[16] = {0};
|
||
|
MessageBoxA(NULL, WASABI_API_LNGSTRING(IDS_COULD_NOT_FIND_WINAMP),
|
||
|
WASABI_API_LNGSTRING_BUF(IDS_ERROR,err,16), 0);
|
||
|
m_version = "Winamp not found";
|
||
|
return m_version;
|
||
|
}
|
||
|
|
||
|
if (hwnd_winamp == NULL)
|
||
|
return NULL;
|
||
|
|
||
|
if (*m_version == 0)
|
||
|
{
|
||
|
// get version number
|
||
|
int version = SendMessageW(hwnd_winamp,WM_WA_IPC,0,IPC_GETVERSION);
|
||
|
// check that we support this version of the ipc
|
||
|
//assert(((version & 0xFF) >> 8) > 0x20);
|
||
|
// format the version number into a string
|
||
|
wsprintfA(m_version, "%d.%d%d", (version & 0xF000) >> 12, version & (0xF0 >> 4), version & 0xF);
|
||
|
}
|
||
|
return m_version;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::userButton(int button, int modifier)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
int mod = 0;
|
||
|
switch (modifier)
|
||
|
{
|
||
|
case WA2_USERBUTTONMOD_NONE : break;
|
||
|
case WA2_USERBUTTONMOD_SHIFT: mod = 100; break;
|
||
|
case WA2_USERBUTTONMOD_CTRL : mod = 110; break;
|
||
|
}
|
||
|
switch (button)
|
||
|
{
|
||
|
case WA2_USERBUTTON_PREV: SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON1 + mod,0); break;
|
||
|
case WA2_USERBUTTON_PLAY: SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON2 + mod,0); break;
|
||
|
case WA2_USERBUTTON_PAUSE: SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON3 + mod,0); break;
|
||
|
case WA2_USERBUTTON_STOP: SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON4 + mod,0); break;
|
||
|
case WA2_USERBUTTON_NEXT: SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON5 + mod,0); break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setOnTop(int ontop)
|
||
|
{
|
||
|
if (!!ontop == !!isOnTop()) return;
|
||
|
toggleOnTop();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::toggleOnTop()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_AOT, 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::enqueueFile(const wchar_t *file)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
COPYDATASTRUCT cds;
|
||
|
cds.dwData = IPC_PLAYFILEW;
|
||
|
cds.lpData = (void *)file;
|
||
|
cds.cbData = sizeof(wchar_t) * (wcslen(file)+1);
|
||
|
SendMessageW(hwnd_winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isPlaying()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING) == 1;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isPaused()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING) == 3;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isStopped()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 1;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,0,IPC_ISPLAYING) == 0;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getPosition()
|
||
|
{
|
||
|
if ( !IsWindow( hwnd_winamp ) )
|
||
|
return 0;
|
||
|
|
||
|
if ( got_pos_cache && GetTickCount() < cached_pos_time + 20 )
|
||
|
return cached_pos;
|
||
|
|
||
|
got_pos_cache = 1;
|
||
|
cached_pos_time = GetTickCount();
|
||
|
|
||
|
return cached_pos = SendMessageW( hwnd_winamp, WM_WA_IPC, 0, IPC_GETOUTPUTTIME );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getLength()
|
||
|
{
|
||
|
if ( got_length_cache && GetTickCount() < cached_length_time + 3000 )
|
||
|
return cached_length;
|
||
|
|
||
|
if ( !IsWindow( hwnd_winamp ) )
|
||
|
return 0;
|
||
|
|
||
|
int l = SendMessageW( hwnd_winamp, WM_WA_IPC, 1, IPC_GETOUTPUTTIME );
|
||
|
|
||
|
if ( l == -1 )
|
||
|
cached_length = -1;
|
||
|
else
|
||
|
cached_length = l * 1000;
|
||
|
|
||
|
got_length_cache = 1;
|
||
|
cached_length_time = GetTickCount();
|
||
|
|
||
|
return cached_length;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::seekTo(int ms)
|
||
|
{
|
||
|
got_pos_cache = 0;
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,ms,IPC_JUMPTOTIME);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setVolume(int v)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp,WM_WA_IPC,v,IPC_SETVOLUME);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getVolume()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 255;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)-666,IPC_SETVOLUME);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setPanning(int p)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)p,IPC_SETPANNING);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getPanning()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)-666,IPC_SETPANNING);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getInfo( int what )
|
||
|
{
|
||
|
if ( !IsWindow( hwnd_winamp ) )
|
||
|
return 0;
|
||
|
|
||
|
return SendMessageW( hwnd_winamp, WM_WA_IPC, (WPARAM)what, IPC_GETINFO );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getEqData(int what)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)what,IPC_GETEQDATA);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setEqData(int what, int val)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
//SendMessageW(hwnd_winamp,WM_WA_IPC,what,IPC_GETEQDATA); // f this :)
|
||
|
SendMessageW(hwnd_winamp,WM_WA_IPC,0xDB000000 | ((what&0xFF) << 16) | (val&0xFFFF),IPC_SETEQDATA);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getShuffle()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GET_SHUFFLE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getRepeat()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GET_REPEAT);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setShuffle(int shuffle)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)shuffle,IPC_SET_SHUFFLE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setRepeat(int repeat)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)repeat,IPC_SET_REPEAT);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setManualPlaylistAdvance(int manual)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)manual,IPC_SET_MANUALPLADVANCE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getManualPlaylistAdvance()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GET_MANUALPLADVANCE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::enableWindows( int enabled )
|
||
|
{
|
||
|
if ( !IsWindow( hwnd_winamp ) )
|
||
|
return;
|
||
|
|
||
|
SendMessageW( hwnd_winamp, WM_WA_IPC, enabled ? 0 : 0xdeadbeef, IPC_ENABLEDISABLE_ALL_WINDOWS );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::areWindowsEnabled()
|
||
|
{
|
||
|
if ( !IsWindow( hwnd_winamp ) )
|
||
|
return 1;
|
||
|
|
||
|
return 1; // todo !!
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int _IsWindowVisible( HWND w )
|
||
|
{
|
||
|
if ( !IsWindowVisible( w ) )
|
||
|
return 0;
|
||
|
|
||
|
RECT r;
|
||
|
GetWindowRect( w, &r );
|
||
|
|
||
|
return !( r.left >= 3000 && r.top >= 3000 );
|
||
|
}
|
||
|
|
||
|
int Winamp2FrontEnd::isMainWindowVisible()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)0, IPC_ISMAINWNDVISIBLE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setWindowsVisible(int v)
|
||
|
{
|
||
|
if (visible == v)
|
||
|
return;
|
||
|
|
||
|
if (!IsWindow(hwnd_winamp))
|
||
|
return;
|
||
|
|
||
|
if (v)
|
||
|
{
|
||
|
if (saved_main && ! isMainWindowVisible())
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_MAIN_WINDOW, 0);
|
||
|
if (saved_eq && !isWindowVisible(IPC_GETWND_EQ))
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_EQ, 0);
|
||
|
#ifdef MINIBROWSER_SUPPORT
|
||
|
if (saved_mb && !isWindowVisible(IPC_GETWND_MB))
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_MINIBROWSER, 0);
|
||
|
#endif
|
||
|
if (saved_pe && !isWindowVisible(IPC_GETWND_PE))
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_PLEDIT, 0);
|
||
|
if (saved_video && !isWindowVisible(IPC_GETWND_VIDEO))
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_VIDEO, 0);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (isMainWindowVisible())
|
||
|
{
|
||
|
saved_main = 1;
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_MAIN_WINDOW, 0);
|
||
|
}
|
||
|
else
|
||
|
saved_main = 0;
|
||
|
|
||
|
if (isWindowVisible(IPC_GETWND_EQ))
|
||
|
{
|
||
|
saved_eq = 1;
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_EQ, 0);
|
||
|
}
|
||
|
else
|
||
|
saved_eq = 0;
|
||
|
|
||
|
#ifdef MINIBROWSER_SUPPORT
|
||
|
if (isWindowVisible(IPC_GETWND_MB))
|
||
|
{
|
||
|
saved_mb = 1;
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_MINIBROWSER, 0);
|
||
|
}
|
||
|
else saved_mb = 0;
|
||
|
#endif
|
||
|
if (isWindowVisible(IPC_GETWND_PE))
|
||
|
{
|
||
|
saved_pe = 1;
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_PLEDIT, 0);
|
||
|
}
|
||
|
else
|
||
|
saved_pe = 0;
|
||
|
|
||
|
if (isWindowVisible(IPC_GETWND_VIDEO))
|
||
|
{
|
||
|
saved_video = 1;
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_OPTIONS_VIDEO, 0);
|
||
|
}
|
||
|
else saved_video = 0;
|
||
|
}
|
||
|
visible = v;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::areWindowsVisible()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp))
|
||
|
return 1;
|
||
|
|
||
|
return visible;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HWND Winamp2FrontEnd::getWnd(int wnd)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp))
|
||
|
return NULL;
|
||
|
|
||
|
return (HWND)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)wnd,IPC_GETWND);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getPlaylistLength()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GETLISTLENGTH);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getCurPlaylistEntry()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GETLISTPOS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
const wchar_t *Winamp2FrontEnd::getTitle(int plentry)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return NULL;
|
||
|
return (const wchar_t *)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)plentry,IPC_GETPLAYLISTTITLEW);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
const char *Winamp2FrontEnd::getFile(int plentry)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return NULL;
|
||
|
return (const char *)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)plentry,IPC_GETPLAYLISTFILE);
|
||
|
}
|
||
|
|
||
|
const wchar_t *Winamp2FrontEnd::getFileW(int plentry)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return NULL;
|
||
|
return (const wchar_t *)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)plentry,IPC_GETPLAYLISTFILEW);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::playAudioCD(int cd)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp,WM_COMMAND,ID_MAIN_PLAY_AUDIOCD1+cd,0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::openFileDialog(HWND w)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)w, IPC_OPENFILEBOX);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::openUrlDialog(HWND w)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON2_CTRL, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::openDirectoryDialog(HWND w)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)w, IPC_OPENDIRBOX);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::ejectPopupMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)0, IPC_SPAWNBUTTONPOPUP);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::previousPopupMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)1, IPC_SPAWNBUTTONPOPUP);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::nextPopupMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)2, IPC_SPAWNBUTTONPOPUP);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::pausePopupMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)3, IPC_SPAWNBUTTONPOPUP);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::playPopupMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)4, IPC_SPAWNBUTTONPOPUP);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::stopPopupMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)5, IPC_SPAWNBUTTONPOPUP);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setDialogBoxParent(HWND w)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)w, IPC_SETDIALOGBOXPARENT);
|
||
|
}
|
||
|
|
||
|
void Winamp2FrontEnd::updateDialogBoxParent(HWND w)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)w, IPC_UPDATEDIALOGBOXPARENT);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isOnTop()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_IS_AOT);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::triggerPopupMenu(int x, int y)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
HMENU hMenu = (HMENU)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GET_HMENU);
|
||
|
DoTrackPopup(hMenu, TPM_RIGHTBUTTON, x, y, hwnd_winamp);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::triggerEQPresetMenu(int x, int y)
|
||
|
{
|
||
|
waSpawnMenuParms p = {hwnd_winamp, x, y};
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNEQPRESETMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerFileMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNFILEMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerPlayMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNPLAYMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerOptionsMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNOPTIONSMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerWindowsMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNWINDOWSMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerHelpMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNHELPMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerPEFileMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
int IPC_GETMLWINDOW=SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)&"LibraryGetWnd",IPC_REGISTER_WINAMP_IPCMESSAGE);
|
||
|
if (IPC_GETMLWINDOW > 65536) SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)-1, IPC_GETMLWINDOW);
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
p.wnd = getWnd(IPC_GETWND_PE);
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNPEFILEMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerPEPlaylistMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
p.wnd = getWnd(IPC_GETWND_PE);
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNPEPLAYLISTMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerPESortMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
p.wnd = getWnd(IPC_GETWND_PE);
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNPESORTMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerPEHelpMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNPEHELPMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerPEListOfListsMenu(int x, int y)
|
||
|
{
|
||
|
int IPC_GETMLWINDOW=SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)&"LibraryGetWnd",IPC_REGISTER_WINAMP_IPCMESSAGE);
|
||
|
if (IPC_GETMLWINDOW > 65536) SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)-1, IPC_GETMLWINDOW);
|
||
|
waSpawnMenuParms p = {hwnd_winamp, x, y};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNPELISTOFPLAYLISTS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerMLFileMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNMLFILEMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerMLViewMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNMLVIEWMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::triggerMLHelpMenu(int x, int y, int width, int height)
|
||
|
{
|
||
|
waSpawnMenuParms2 p = {hwnd_winamp, x, y, width, height};
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&p, IPC_SPAWNMLHELPMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HMENU Winamp2FrontEnd::getPopupMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return NULL;
|
||
|
return (HMENU)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)0,IPC_GET_HMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HMENU Winamp2FrontEnd::getTopMenu()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return NULL;
|
||
|
return (HMENU)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)-1,IPC_GET_HMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::adjustOptionsPopupMenu(int direction)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)direction,IPC_ADJUST_OPTIONSMENUPOS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HMENU Winamp2FrontEnd::getMenuBarMenu(int which)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return NULL;
|
||
|
return (HMENU)SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)which+1,IPC_GET_HMENU);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::adjustFFWindowsMenu(int direction)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)direction,IPC_ADJUST_FFWINDOWSMENUPOS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::adjustFFOptionsMenu(int direction)
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return 0;
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)direction,IPC_ADJUST_FFOPTIONSMENUPOS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HWND Winamp2FrontEnd::getMainWindow()
|
||
|
{
|
||
|
return hwnd_winamp;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::quit()
|
||
|
{
|
||
|
if (!IsWindow(hwnd_winamp)) return;
|
||
|
SendMessageW(hwnd_winamp,WM_CLOSE,0,0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isWindowVisible(intptr_t which)
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, which, IPC_ISWNDVISIBLE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setWindowVisible(intptr_t which, int visible)
|
||
|
{
|
||
|
int state = isWindowVisible(which);
|
||
|
if (!state == !visible) return;
|
||
|
int id = 0;
|
||
|
switch (which)
|
||
|
{
|
||
|
case IPC_GETWND_EQ:
|
||
|
DebugStringW(L"Showing EQ!!\n");
|
||
|
id = WINAMP_OPTIONS_EQ;
|
||
|
break;
|
||
|
case IPC_GETWND_PE:
|
||
|
id = WINAMP_OPTIONS_PLEDIT;
|
||
|
break;
|
||
|
#ifdef MINIBROWSER_SUPPORT
|
||
|
case IPC_GETWND_MB:
|
||
|
id = WINAMP_OPTIONS_MINIBROWSER;
|
||
|
break;
|
||
|
#endif
|
||
|
case IPC_GETWND_VIDEO:
|
||
|
id = WINAMP_OPTIONS_VIDEO;
|
||
|
break;
|
||
|
}
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, id, 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::sendPlCmd(int which, int x, int y, int menu_align_flag)
|
||
|
{
|
||
|
windowCommand wc = {which, x, y, menu_align_flag};
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (intptr_t)&wc, IPC_PLCMD);
|
||
|
}
|
||
|
|
||
|
#ifdef MINIBROWSER_SUPPORT
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::sendMbCmd(int which, int x, int y, int menu_align_flag)
|
||
|
{
|
||
|
windowCommand wc = {which, x, y, menu_align_flag};
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (intptr_t)&wc, IPC_MBCMD);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::sendVidCmd(int which, int x, int y, int menu_align_flag)
|
||
|
{
|
||
|
windowCommand wc = {which, x, y, menu_align_flag};
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (intptr_t)&wc, IPC_VIDCMD);
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
#define WINAMP_VISPLUGIN 40192
|
||
|
void Winamp2FrontEnd::toggleVis()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_VISPLUGIN, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isVisRunning()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_ISVISRUNNING);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HWND Winamp2FrontEnd::getVisWnd()
|
||
|
{
|
||
|
return (HWND)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETVISWND);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
IDropTarget *Winamp2FrontEnd::getDropTarget()
|
||
|
{
|
||
|
return (IDropTarget *)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETDROPTARGET);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getSamplerate()
|
||
|
{
|
||
|
int realRate = SendMessageW(hwnd_winamp,WM_WA_IPC,5,IPC_GETINFO);
|
||
|
if (realRate == 1)
|
||
|
return 1000*SendMessageW(hwnd_winamp,WM_WA_IPC,0,IPC_GETINFO);
|
||
|
else
|
||
|
return realRate;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getBitrate()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,1,IPC_GETINFO);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getChannels()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,2,IPC_GETINFO);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isValidEmbedWndState(embedWindowState *ws)
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, (intptr_t)ws, IPC_EMBED_ISVALID);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::PE_getNumItems()
|
||
|
{
|
||
|
return SendMessageW(hwnd_playlist, WM_USER, IPC_PE_GETINDEXTOTAL, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
fileinfo2 *Winamp2FrontEnd::PE_getFileTitle(int index)
|
||
|
{
|
||
|
static fileinfo2 fi;
|
||
|
fi.fileindex = index;
|
||
|
*(fi.filetitle) = 0;
|
||
|
*(fi.filelength) = 0;
|
||
|
SendMessageW(hwnd_playlist, WM_USER, IPC_PE_GETINDEXTITLE, (LPARAM)&fi);
|
||
|
return &fi;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
fileinfo2W *Winamp2FrontEnd::PE_getFileTitleW(int index)
|
||
|
{
|
||
|
static fileinfo2W fi;
|
||
|
fi.fileindex = index;
|
||
|
*(fi.filetitle) = 0;
|
||
|
*(fi.filelength) = 0;
|
||
|
SendMessageW(hwnd_playlist, WM_USER, IPC_PE_GETINDEXTITLEW, (LPARAM)&fi);
|
||
|
return &fi;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::PE_getCurrentIndex()
|
||
|
{
|
||
|
//return SendMessageW(hwnd_playlist, WM_USER, IPC_PE_GETCURINDEX, 0);
|
||
|
return SendMessageW(hwnd_winamp, WM_USER, 0, IPC_GETLISTPOS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::PE_setCurrentIndex(int i)
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, i, IPC_SETPLAYLISTPOS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HWND Winamp2FrontEnd::getMediaLibrary()
|
||
|
{
|
||
|
int IPC_GETMLWINDOW=SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)&"LibraryGetWnd",IPC_REGISTER_WINAMP_IPCMESSAGE);
|
||
|
return IPC_GETMLWINDOW > 65536 ? (HWND)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETMLWINDOW) : NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::ensureMediaLibraryLoaded()
|
||
|
{
|
||
|
int IPC_GETMLWINDOW=SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)&"LibraryGetWnd",IPC_REGISTER_WINAMP_IPCMESSAGE);
|
||
|
if (IPC_GETMLWINDOW > 65536) SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)-1, IPC_GETMLWINDOW);
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::hasVideoSupport()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_HAS_VIDEO_SUPPORT);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isPlayingVideo()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_IS_PLAYING_VIDEO) > 0;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isPlayingVideoFullscreen()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_IS_FULLSCREEN);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isDoubleSize()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_ISDOUBLESIZE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getTimeDisplayMode()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETTIMEDISPLAYMODE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::switchSkin(const wchar_t *skinname)
|
||
|
{
|
||
|
static StringW wideSkinName;
|
||
|
wideSkinName=skinname;
|
||
|
PostMessage(hwnd_winamp, WM_WA_IPC, (intptr_t)wideSkinName.getValue(), IPC_SETSKINW);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::visNext()
|
||
|
{
|
||
|
PostMessage(hwnd_winamp, WM_COMMAND, ID_VIS_NEXT, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::visFullscreen()
|
||
|
{
|
||
|
PostMessage(hwnd_winamp, WM_COMMAND, ID_VIS_FS, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::visPrev()
|
||
|
{
|
||
|
PostMessage(hwnd_winamp, WM_COMMAND, ID_VIS_PREV, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::visRandom(int set)
|
||
|
{
|
||
|
PostMessage(hwnd_winamp, WM_COMMAND, ID_VIS_RANDOM | (set << 16), 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::pollVisRandom()
|
||
|
{
|
||
|
PostMessage(hwnd_winamp, WM_COMMAND, ID_VIS_RANDOM | 0xFFFF0000, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::visConfig()
|
||
|
{
|
||
|
PostMessage(hwnd_winamp, WM_COMMAND, ID_VIS_CFG, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::visMenu()
|
||
|
{
|
||
|
PostMessage(hwnd_winamp, WM_COMMAND, ID_VIS_MENU, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::getIdealVideoSize(int *w, int *h)
|
||
|
{
|
||
|
if (w) *w = video_ideal_width;
|
||
|
if (h) *h = video_ideal_height;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getStopOnVideoClose()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETSTOPONVIDEOCLOSE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setStopOnVideoClose(int stop)
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, stop, IPC_SETSTOPONVIDEOCLOSE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::GetVideoResize()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETVIDEORESIZE);
|
||
|
}
|
||
|
|
||
|
|
||
|
void Winamp2FrontEnd::SetVideoResize(int stop)
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, stop, IPC_SETVIDEORESIZE);
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
BOOL CALLBACK findVisWndProc(HWND hwnd, LPARAM lParam)
|
||
|
{
|
||
|
Winamp2FrontEnd *fe = (Winamp2FrontEnd*)lParam;
|
||
|
if (hwnd == fe->getVisWnd())
|
||
|
{
|
||
|
fe->setFoundVis(); return FALSE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isVis(HWND hwnd)
|
||
|
{
|
||
|
if (hwnd == wa2.getVisWnd()) return 1;
|
||
|
foundvis = 0;
|
||
|
EnumChildWindows(hwnd, findVisWndProc, (LPARAM)this);
|
||
|
return foundvis;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HWND Winamp2FrontEnd::getPreferencesWindow()
|
||
|
{
|
||
|
return (HWND)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETPREFSWND);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setPlEditWidthHeight(int width, int height)
|
||
|
{
|
||
|
POINT pt={width, height};
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&pt, IPC_SET_PE_WIDTHHEIGHT);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
HINSTANCE Winamp2FrontEnd::getLanguagePackInstance()
|
||
|
{
|
||
|
return (HINSTANCE)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETLANGUAGEPACKINSTANCE);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::openTrackInfo()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_EDIT_ID3, 0);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
const char *Winamp2FrontEnd::getOutputPlugin()
|
||
|
{
|
||
|
return (const char *)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETOUTPUTPLUGIN);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::setDrawBorders(int d)
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, d, IPC_SETDRAWBORDERS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::disableSkinnedCursors(int disable)
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, disable, IPC_DISABLESKINCURSORS);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getMetaData(const wchar_t *filename, const wchar_t *name, wchar_t *data, int data_len)
|
||
|
{
|
||
|
|
||
|
if (!_wcsnicmp(filename, L"file://", 7))
|
||
|
filename+=7;
|
||
|
extendedFileInfoStructW efis=
|
||
|
{
|
||
|
filename,
|
||
|
name,
|
||
|
data,
|
||
|
data_len,
|
||
|
};
|
||
|
return SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)&efis,IPC_GET_EXTENDED_FILE_INFOW_HOOKABLE);
|
||
|
}
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::invalidateCache()
|
||
|
{
|
||
|
got_length_cache = 0;
|
||
|
got_pos_cache = 0;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::registerGlobalHotkey(const char *name, int msg, int wparam, int lparam, int flags, const char *id)
|
||
|
{
|
||
|
int m_genhotkeys_add_ipc=SendMessageW(hwnd_winamp,WM_WA_IPC,(WPARAM)&"GenHotkeysAdd",IPC_REGISTER_WINAMP_IPCMESSAGE);
|
||
|
genHotkeysAddStruct hs={0,};
|
||
|
hs.name = (char *)name;
|
||
|
hs.uMsg = msg;
|
||
|
hs.wParam = wparam;
|
||
|
hs.lParam = lparam;
|
||
|
hs.flags = flags;
|
||
|
hs.id = (char *)id;
|
||
|
if (m_genhotkeys_add_ipc > 65536) SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&hs, m_genhotkeys_add_ipc);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
const char *Winamp2FrontEnd::getVideoInfoString()
|
||
|
{
|
||
|
return (const char *)SendMessageW(hwnd_winamp, WM_WA_IPC, 4, IPC_GETINFO);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::playFile(const wchar_t *file)
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_DELETE);
|
||
|
COPYDATASTRUCT cds;
|
||
|
cds.dwData = IPC_PLAYFILEW;
|
||
|
cds.lpData = (void *)file;
|
||
|
cds.cbData = sizeof(wchar_t) * (wcslen(file)+1); // +1 to get the NULL, missing forever
|
||
|
SendMessageW(hwnd_winamp, WM_COPYDATA, (WPARAM)hwnd_winamp, (LPARAM)&cds);
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_STARTPLAY);
|
||
|
}
|
||
|
|
||
|
void Winamp2FrontEnd::clearPlaylist()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_DELETE);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::rewind5s()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_REW5S, 0);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::forward5s()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_FFWD5S, 0);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::endOfPlaylist()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON5_CTRL, 0);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::startOfPlaylist()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON1_CTRL, 0);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::stopWithFade()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON4_SHIFT, 0);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
void Winamp2FrontEnd::stopAfterCurrent()
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_COMMAND, WINAMP_BUTTON4_CTRL, 0);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isWindowShade(int whichwnd)
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, whichwnd, IPC_IS_WNDSHADE);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::getCurTrackRating()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GETRATING);
|
||
|
}
|
||
|
|
||
|
void Winamp2FrontEnd::setCurTrackRating(int rating)
|
||
|
{
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, rating, IPC_SETRATING);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::isExitEnabled()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_IS_EXIT_ENABLED);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::pushExitDisabled()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_PUSH_DISABLE_EXIT);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------------
|
||
|
int Winamp2FrontEnd::popExitDisabled()
|
||
|
{
|
||
|
return SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_POP_DISABLE_EXIT);
|
||
|
}
|
||
|
|
||
|
void Winamp2FrontEnd::GetFileInfo(const wchar_t *filename, wchar_t *title, int titleCch, int *length)
|
||
|
{
|
||
|
basicFileInfoStructW infoStruct = {0};
|
||
|
infoStruct.filename = filename;
|
||
|
infoStruct.title = title;
|
||
|
infoStruct.titlelen = titleCch;
|
||
|
SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&infoStruct, IPC_GET_BASIC_FILE_INFOW);
|
||
|
*length = infoStruct.length;
|
||
|
}
|
||
|
|
||
|
const wchar_t *Winamp2FrontEnd::GetCurrentTitle()
|
||
|
{
|
||
|
return (const wchar_t *)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GET_PLAYING_TITLE);
|
||
|
}
|
||
|
|
||
|
const wchar_t *Winamp2FrontEnd::GetCurrentFile()
|
||
|
{
|
||
|
return (const wchar_t *)SendMessageW(hwnd_winamp, WM_WA_IPC, 0, IPC_GET_PLAYING_FILENAME);
|
||
|
}
|
||
|
|
||
|
void *Winamp2FrontEnd::CanPlay(const wchar_t *fn)
|
||
|
{
|
||
|
return (void *)SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)fn, IPC_CANPLAY);
|
||
|
}
|
||
|
|
||
|
bool Winamp2FrontEnd::IsPlaylist(const wchar_t *fn)
|
||
|
{
|
||
|
return AGAVE_API_PLAYLISTMANAGER->CanLoad(fn);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HWND GetMainContainerHWND();
|
||
|
bool Winamp2FrontEnd::GetAlbumArt(const wchar_t *filename)
|
||
|
{
|
||
|
// disabled 30 May 2012 as per email from Tejas w.r.t. to Rovi deal ending
|
||
|
#if 0
|
||
|
if (!_wcsnicmp(filename, L"file://", 7))
|
||
|
filename+=7;
|
||
|
|
||
|
artFetchData fetch = {sizeof(artFetchData), GetMainContainerHWND(), };
|
||
|
|
||
|
|
||
|
|
||
|
wchar_t artist[512]=L"", album[512]=L"", gracenoteFileId[512]=L"", year[5]=L"";
|
||
|
getMetaData(filename, L"albumartist", artist, 512);
|
||
|
if (!WCSICMP(artist, L"")) //Add artist if albumartist not available
|
||
|
getMetaData(filename, L"artist", artist, 512);
|
||
|
getMetaData(filename, L"album", album, 512);
|
||
|
getMetaData(filename, L"GracenoteFileID", gracenoteFileId, 512);
|
||
|
getMetaData(filename, L"year", year, 5);
|
||
|
|
||
|
fetch.artist=artist;
|
||
|
fetch.album=album;
|
||
|
fetch.gracenoteFileId=gracenoteFileId;
|
||
|
fetch.year=_wtoi(year);
|
||
|
|
||
|
int r = SendMessageW(hwnd_winamp, WM_WA_IPC, (WPARAM)&fetch, IPC_FETCH_ALBUMART);
|
||
|
if(r == 0 && fetch.imgData && fetch.imgDataLen) // success, save art in correct location
|
||
|
{
|
||
|
AGAVE_API_ALBUMART->SetAlbumArt(filename,L"cover",0,0,fetch.imgData,fetch.imgDataLen,fetch.type);
|
||
|
WASABI_API_MEMMGR->sysFree(fetch.imgData);
|
||
|
return true;
|
||
|
}
|
||
|
#endif
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
static void code(long* v, long* k)
|
||
|
{
|
||
|
unsigned long y = v[0], z = v[1], sum = 0, /* set up */
|
||
|
delta = 0x9e3779b9, n = 32 ; /* key schedule constant*/
|
||
|
|
||
|
while (n-- > 0)
|
||
|
{ /* basic cycle start */
|
||
|
sum += delta;
|
||
|
y += ((z << 4) + k[0]) ^(z + sum) ^((z >> 5) + k[1]);
|
||
|
z += ((y << 4) + k[2]) ^(y + sum) ^((y >> 5) + k[3]); /* end cycle */
|
||
|
}
|
||
|
v[0] = y; v[1] = z;
|
||
|
|
||
|
}
|
||
|
|
||
|
static int getRegVer()
|
||
|
{
|
||
|
int *x = (int*)malloc(32);
|
||
|
long s[3];
|
||
|
long ss[2] = {GetTickCount(), (int)x + (int)s}; // fucko: better challenge, too
|
||
|
long tealike_key[4] = { 31337, 0xf00d, 0xdead, 0xbeef}; //fucko: hide this a bit
|
||
|
free(x);
|
||
|
s[0] = ss[0];
|
||
|
s[1] = ss[1];
|
||
|
s[2] = 0;
|
||
|
|
||
|
SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)s, IPC_GETREGISTEREDVERSION);
|
||
|
|
||
|
code(ss, tealike_key);
|
||
|
|
||
|
if (memcmp(s, ss, 8)) return 0;
|
||
|
|
||
|
return s[2];
|
||
|
}
|
||
|
|
||
|
bool Winamp2FrontEnd::IsWinampPro()
|
||
|
{
|
||
|
return !!getRegVer();
|
||
|
}
|
||
|
|
||
|
void Winamp2FrontEnd::openUrl(const wchar_t *url)
|
||
|
{
|
||
|
SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)url, IPC_OPEN_URL);
|
||
|
}
|
||
|
|
||
|
#include "../gen_ml/menu.h"
|
||
|
|
||
|
LRESULT sendMlIpc(int msg, WPARAM param)
|
||
|
{
|
||
|
static LRESULT IPC_GETMLWINDOW;
|
||
|
if (!IPC_GETMLWINDOW) IPC_GETMLWINDOW = SendMessageW(plugin.hwndParent, WM_WA_IPC, (WPARAM)&"LibraryGetWnd", IPC_REGISTER_WINAMP_IPCMESSAGE);
|
||
|
HWND mlwnd = (HWND)SendMessageW(plugin.hwndParent, WM_WA_IPC, 0, IPC_GETMLWINDOW);
|
||
|
|
||
|
if (param == 0 && msg == 0) return (LRESULT)mlwnd;
|
||
|
|
||
|
if (IsWindow(mlwnd))
|
||
|
return SendMessageW(mlwnd, WM_ML_IPC, param, msg);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
BOOL DoTrackPopup(HMENU hMenu, UINT fuFlags, int x, int y, HWND hwnd)
|
||
|
{
|
||
|
if(hMenu == NULL)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
HWND ml_wnd = (HWND)sendMlIpc(0, 0);
|
||
|
if (IsWindow(ml_wnd))
|
||
|
{
|
||
|
return Menu_TrackPopup(ml_wnd, hMenu, fuFlags, x, y, hwnd, NULL);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return TrackPopupMenu(hMenu, fuFlags, x, y, 0, hwnd, NULL);
|
||
|
}
|
||
|
}
|