winamp/Src/Plugins/General/gen_ff/wa2cfgitems.cpp
2024-09-24 14:54:57 +02:00

307 lines
9.7 KiB
C++

#include <precomp.h>
#include "wa2cfgitems.h"
#include "wa2wndembed.h"
#include "wa2core.h"
#include <api/config/options.h>
#include "wa2frontend.h"
#include "../../Plugins/Output/out_ds/ds_ipc.h"
#include <bfc/parse/pathparse.h>
#include "gen.h"
#include "resource.h"
#include "../Agave/Language/api_language.h"
// cfg item callbacks
void setCrossfader(int crossfade);
void onWa2CrossfadeChange(int crossfade);
void setOnTop(int ontop);
void onWa2OnTopChanged(int ontop);
int my_set = 0;
int disable_set_wa2_repeat = 0;
//---------------------------------------------------------
// playlist editor cfg items
//---------------------------------------------------------
_bool shuffle(L"Shuffle", FALSE);
_int repeat(L"Repeat", 0);
_bool visrandom(L"Random", FALSE);
Wa2PlEditCfgItems::Wa2PlEditCfgItems() : CfgItemI(L"Playlist Editor", pleditWndGuid) {
registerAttribute(&shuffle, new int_attrCB(Wa2PlEditCfgItems::onSetShuffle));
registerAttribute(&repeat, new int_attrCB(Wa2PlEditCfgItems::onSetRepeat));
WASABI_API_CONFIG->config_registerCfgItem(this);
shuffle.setValueAsInt(g_Core->getShuffle());
disable_set_wa2_repeat = 1;
repeat.setValueAsInt(g_Core->getRepeat());
disable_set_wa2_repeat = 0;
}
Wa2PlEditCfgItems::~Wa2PlEditCfgItems() {
WASABI_API_CONFIG->config_deregisterCfgItem(this);
}
void Wa2PlEditCfgItems::onSetRepeat(int set) {
my_set = 1;
ASSERT(g_Core != NULL);
if (!disable_set_wa2_repeat) {
// if (!!set != !!g_Core->getRepeat()) // FG> do NOT uncomment this
g_Core->setRepeat(set);
}
my_set = 0;
}
void Wa2PlEditCfgItems::onSetShuffle(BOOL set) {
my_set = 1;
ASSERT(g_Core != NULL);
if (!!set != !!g_Core->getShuffle())
g_Core->setShuffle(set);
my_set = 0;
}
//---------------------------------------------------------
static _bool prevent_videostoponclose(L"Prevent video playback Stop on video window Close", FALSE);
static _bool prevent_videoresize(L"Prevent video resize", FALSE); // 5.32+
static _bool show_videownd_on_play(L"Show video wnd on play"); // 5.36+
static _bool hide_videownd_on_stop(L"Hide video wnd on stop"); // 5.36+
int preventvc_savedvalued = -1;
int preventvresize_savedvalued = -1;
SkinTweaks::SkinTweaks() : CfgItemI(L"SkinTweaks", skinTweaksGuid)
{
registerAttribute(&prevent_videostoponclose, new int_attrCB(SkinTweaks::onPreventVideoStopChanged));
registerAttribute(&prevent_videoresize, new int_attrCB(SkinTweaks::onPreventVideoResize));
}
//---------------------------------------------------------
AvsCfg::AvsCfg() : CfgItemI(L"Avs", avs_guid) {
registerAttribute(&visrandom, new int_attrCB(AvsCfg::onVisRandomChanged));
}
//---------------------------------------------------------
void SkinTweaks::onPreventVideoStopChanged(BOOL set) {
if (set) {
if (preventvc_savedvalued == -1) {
preventvc_savedvalued = wa2.getStopOnVideoClose();
wa2.setStopOnVideoClose(0);
}
} else {
if (preventvc_savedvalued != -1) {
wa2.setStopOnVideoClose(preventvc_savedvalued);
preventvc_savedvalued = -1;
}
}
}
void SkinTweaks::onPreventVideoResize(BOOL set) {
if (set) {
if (preventvresize_savedvalued == -1) {
preventvresize_savedvalued = wa2.GetVideoResize();
wa2.SetVideoResize(0);
}
} else {
if (preventvresize_savedvalued != -1) {
wa2.SetVideoResize(preventvresize_savedvalued);
preventvresize_savedvalued = -1;
}
}
}
//---------------------------------------------------------
void AvsCfg::onVisRandomChanged(BOOL set) {
extern int disable_send_visrandom;
if (!disable_send_visrandom) {
disable_send_visrandom = 1;
wa2.visRandom(set);
disable_send_visrandom = 0;
}
}
//---------------------------------------------------------
Options *options;
CustomOptionsMenuItems *optionsmenuitems;
CustomWindowsMenuItems *windowsmenuitems;
SkinTweaks *skintweaks;
Crossfader *crossfader;
AvsCfg *avscfg;
//---------------------------------------------------------
Wa2CfgItems::Wa2CfgItems() {
// set up main options
WASABI_API_CONFIG->config_registerCfgItem((options = new Options()));
// set up custom options menu items
WASABI_API_CONFIG->config_registerCfgItem((optionsmenuitems = new CustomOptionsMenuItems()));
// set up custom windows menu items
WASABI_API_CONFIG->config_registerCfgItem((windowsmenuitems = new CustomWindowsMenuItems()));
// set up skintweaks options menu items
WASABI_API_CONFIG->config_registerCfgItem((skintweaks = new SkinTweaks()));
// set up crossfader options menu item
WASABI_API_CONFIG->config_registerCfgItem((crossfader = new Crossfader()));
// set up avs cfg item
WASABI_API_CONFIG->config_registerCfgItem((avscfg = new AvsCfg()));
}
Wa2CfgItems::~Wa2CfgItems() {
WASABI_API_CONFIG->config_deregisterCfgItem(options);
WASABI_API_CONFIG->config_deregisterCfgItem(optionsmenuitems);
WASABI_API_CONFIG->config_deregisterCfgItem(windowsmenuitems);
WASABI_API_CONFIG->config_deregisterCfgItem(skintweaks);
WASABI_API_CONFIG->config_deregisterCfgItem(crossfader);
WASABI_API_CONFIG->config_deregisterCfgItem(avscfg);
delete options;
options = NULL;
delete optionsmenuitems;
optionsmenuitems = NULL;
delete windowsmenuitems;
windowsmenuitems = NULL;
delete skintweaks;
skintweaks = NULL;
delete crossfader;
crossfader = NULL;
delete avscfg;
avscfg = NULL;
}
//-----------------------------------------------------------------------------------------------
// always on top was toggled in freeform skin
//-----------------------------------------------------------------------------------------------
void setOnTop(int ontop) {
if (!!ontop != !!wa2.isOnTop()) wa2.setOnTop(!!ontop);
}
//-----------------------------------------------------------------------------------------------
// setontop was toggled in wa2
//-----------------------------------------------------------------------------------------------
void onWa2OnTopChanged(int ontop) {
cfg_options_alwaysontop.setValueAsInt(!!ontop);
}
//-----------------------------------------------------------------------------------------------
// Crossfader cfgitem - monitors out_ds
//-----------------------------------------------------------------------------------------------
_int crossfade_time(L"Crossfade time", 2); // in seconds
HWND output_ipc = NULL;
static WNDPROC oldOutputIPCProc;
int syncing_crossfade = 0;
int using_dsound = 0;
extern HWND last_dlg_parent;
// sync out_ds with gen_ff
void syncOutputCrossfade() {
if (output_ipc == NULL) return;
SendMessageW(output_ipc, WM_DS_IPC, crossfade_time.getValueAsInt() * 1000, DS_IPC_SET_CROSSFADE_TIME);
if (using_dsound) SendMessageW(output_ipc, WM_DS_IPC, cfg_audiooptions_crossfader.getValueAsInt(), DS_IPC_SET_CROSSFADE);
}
// sync gen_ff with out_ds, can't happen if out_ds isn't the selected plugin since this occurs when the user changes his config, and he needs to select out_ds to access its config
void syncGenFFCrossfade() {
syncing_crossfade = 1;
if (output_ipc == NULL) return;
crossfade_time.setValueAsInt(SendMessageW(output_ipc, WM_DS_IPC, 0, DS_IPC_GET_CROSSFADE_TIME) / 1000);
cfg_audiooptions_crossfader.setValueAsInt(SendMessageW(output_ipc, WM_DS_IPC, 0, DS_IPC_GET_CROSSFADE));
syncing_crossfade = 0;
}
// called when gen_ff changes the crossfade time setting
void onSetCrossfadeTime(int sectime) {
if (syncing_crossfade) return;
syncOutputCrossfade();
}
// called when gen_ff toggles crossfading
void setCrossfader(int crossfade) {
if (syncing_crossfade) return;
if (crossfade && (!output_ipc || !using_dsound)) {
cfg_audiooptions_crossfader.setValueAsInt(0);
char title[256] = {0};
int r = MessageBoxA(last_dlg_parent ? last_dlg_parent : wa2.getMainWindow(),
WASABI_API_LNGSTRING(IDS_CROSSFADER_ONLY_UNDER_OUT_DS),
WASABI_API_LNGSTRING_BUF(IDS_NOT_SUPPORTED,title,256), MB_YESNO);
if (r == IDYES) {
SendMessageW(wa2.getMainWindow(),WM_WA_IPC,32,IPC_OPENPREFSTOPAGE);
}
}
syncOutputCrossfade();
}
// ----------------------- ipc hook
extern int m_are_we_loaded;
static DWORD WINAPI outputIPCProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam) {
if (m_are_we_loaded) {
switch (uMsg) {
case WM_DS_IPC:
switch (lParam) {
case DS_IPC_CB_CFGREFRESH:
syncGenFFCrossfade();
break;
case DS_IPC_CB_ONSHUTDOWN:
output_ipc = NULL;
break;
}
break;
}
}
return CallWindowProc(oldOutputIPCProc, hwndDlg, uMsg, wParam, lParam);
}
void hookOutputIPC() {
oldOutputIPCProc = (WNDPROC)SetWindowLongPtrW(output_ipc, GWLP_WNDPROC, (LONG_PTR)outputIPCProc);
}
// not called in fact, since we never need to let go of it
void unhookOutputIPC() {
SetWindowLongPtrW(output_ipc, GWLP_WNDPROC, (LONG_PTR)oldOutputIPCProc);
}
BOOL CALLBACK findOutputIPCProc( HWND hwnd, LPARAM lParam )
{
char cn[ 256 ] = { 0 };
GetClassNameA( hwnd, cn, 255 ); cn[ 255 ] = 0; // Must stay in ANSI mode
if ( STRCASEEQL( cn, DS_IPC_CLASSNAME ) )
{
output_ipc = hwnd;
return FALSE;
}
return TRUE;
}
// ------------------------- output plugin changed !
void Crossfader::onOutputChanged() {
if (!(output_ipc && IsWindow(output_ipc))) {
output_ipc = NULL;
EnumChildWindows(wa2.getMainWindow(), findOutputIPCProc, 0);
if (output_ipc) {
hookOutputIPC();
}
}
const char* outputPluginPath = wa2.getOutputPlugin();
PathParser pp(outputPluginPath);
using_dsound = STRCASEEQLSAFE(pp.getLastString(), "out_ds.dll");
if (!using_dsound) {
cfg_audiooptions_crossfader.setValueAsInt(0);
} else
syncGenFFCrossfade();
}
// ------------------------------------------------------------------------
Crossfader::Crossfader() : CfgItemI(L"Crossfader", crossfaderGuid) {
registerAttribute(&crossfade_time, new int_attrCB(onSetCrossfadeTime));
}
Crossfader::~Crossfader() {
unhookOutputIPC();
}