398 lines
11 KiB
C++
398 lines
11 KiB
C++
|
#include "Main.h"
|
||
|
#include "resource.h"
|
||
|
#include "../nu/ListView.h"
|
||
|
#include "FileTypes.h"
|
||
|
#include "AutoChar.h"
|
||
|
|
||
|
W_ListView typeList;
|
||
|
FileTypes::TypeList types;
|
||
|
#define CFGSET(hwnd, code, boolval) CheckDlgButton(hwnd, code, ((boolval)?BST_CHECKED:BST_UNCHECKED))
|
||
|
|
||
|
struct SpeakerSetup
|
||
|
{
|
||
|
int description;
|
||
|
DWORD value;
|
||
|
};
|
||
|
SpeakerSetup speakerList[] =
|
||
|
{
|
||
|
{IDS_STEREO,DSSPEAKER_STEREO},
|
||
|
{IDS_QUADROPHONIC,DSSPEAKER_QUAD},
|
||
|
{IDS_SURROUND,DSSPEAKER_SURROUND},
|
||
|
{IDS_5_1,DSSPEAKER_5POINT1},
|
||
|
{IDS_7_1,DSSPEAKER_7POINT1},
|
||
|
};
|
||
|
|
||
|
void FillFileTypes()
|
||
|
{
|
||
|
typeList.Clear();
|
||
|
|
||
|
long attrCount = types.size();
|
||
|
int pos=0;
|
||
|
for (long i = 0;i < attrCount;i++)
|
||
|
{
|
||
|
typeList.InsertItem(pos, types[i].wtype, 0);
|
||
|
typeList.SetItemText(pos, 1, types[i].description);
|
||
|
pos++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void ResetTypes()
|
||
|
{
|
||
|
{
|
||
|
Nullsoft::Utility::AutoLock lock (fileTypes.typeGuard);
|
||
|
types=fileTypes.types;
|
||
|
}
|
||
|
FillFileTypes();
|
||
|
}
|
||
|
|
||
|
void Preferences_Populate(HWND hwndDlg)
|
||
|
{
|
||
|
CFGSET(hwndDlg, IDC_HTTPMETA, config_http_metadata);
|
||
|
|
||
|
/* CFGSET(hwndDlg, IDC_SILENT, !config_no_silent);
|
||
|
CFGSET(hwndDlg, IDC_UNTRUSTED, config_untrusted_ok);
|
||
|
*/
|
||
|
CFGSET(hwndDlg, IDC_EXTRA_ASX, config_extra_asx_extensions);
|
||
|
|
||
|
SetDlgItemInt(hwndDlg,IDC_BUFFER_TIME, config_buffer_time, FALSE/*unsigned*/);
|
||
|
|
||
|
SendMessage(GetDlgItem(hwndDlg, IDC_AUDIO_SPEAKER_COUNT), CB_RESETCONTENT, 0, 0);
|
||
|
for (int i = 0;i < sizeof(speakerList)/sizeof(speakerList[0]) ;i++)
|
||
|
{
|
||
|
SendMessage(GetDlgItem(hwndDlg, IDC_AUDIO_SPEAKER_COUNT), CB_ADDSTRING, 0, (LPARAM) WASABI_API_LNGSTRINGW(speakerList[i].description));
|
||
|
if (speakerList[i].value == config_audio_num_channels)
|
||
|
SendMessage(GetDlgItem(hwndDlg, IDC_AUDIO_SPEAKER_COUNT), CB_SETCURSEL, i, 0);
|
||
|
}
|
||
|
|
||
|
ResetTypes();
|
||
|
}
|
||
|
void Preferences_Init(HWND hwndDlg)
|
||
|
{
|
||
|
typeList.setwnd(GetDlgItem(hwndDlg, IDC_TYPELIST));
|
||
|
typeList.AddCol(WASABI_API_LNGSTRINGW(IDS_EXT), 75);
|
||
|
typeList.AddCol(WASABI_API_LNGSTRINGW(IDS_DESCRIPTION), 250);
|
||
|
Preferences_Populate(hwndDlg);
|
||
|
|
||
|
if(config_col1 == -1)
|
||
|
typeList.AutoSizeColumn(0);
|
||
|
else
|
||
|
typeList.SetColumnWidth(0, config_col1);
|
||
|
|
||
|
if(config_col2 == -1)
|
||
|
typeList.AutoSizeColumn(1);
|
||
|
else
|
||
|
typeList.SetColumnWidth(1, config_col2);
|
||
|
|
||
|
if (NULL != WASABI_API_APP)
|
||
|
WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel(typeList.getwnd(), TRUE);
|
||
|
}
|
||
|
|
||
|
void Preferences_TypeRemove(HWND hwndDlg)
|
||
|
{
|
||
|
int next = -1;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
next = typeList.GetNextSelected(next);
|
||
|
if (next != -1)
|
||
|
{
|
||
|
free(types[next].wtype);
|
||
|
types[next].wtype=0;
|
||
|
}
|
||
|
} while (next != -1);
|
||
|
|
||
|
for (FileTypes::TypeList::iterator itr = types.begin(); itr != types.end(); )
|
||
|
{
|
||
|
if (!itr->wtype || !itr->wtype[0])
|
||
|
types.erase(itr);
|
||
|
else
|
||
|
itr++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void OnOk(HWND hwndDlg)
|
||
|
{
|
||
|
config_http_metadata=IsDlgButtonChecked(hwndDlg, IDC_HTTPMETA)== BST_CHECKED;
|
||
|
// config_no_silent=IsDlgButtonChecked(hwndDlg, IDC_SILENT) != BST_CHECKED;
|
||
|
// config_untrusted_ok=IsDlgButtonChecked(hwndDlg, IDC_UNTRUSTED)== BST_CHECKED;
|
||
|
config_extra_asx_extensions=IsDlgButtonChecked(hwndDlg, IDC_EXTRA_ASX)== BST_CHECKED;
|
||
|
wchar_t temp[64] = {0};
|
||
|
|
||
|
GetDlgItemText(hwndDlg,IDC_BUFFER_TIME, temp, 64);
|
||
|
int newBufferTime= _wtoi(temp);
|
||
|
if (newBufferTime<1000)
|
||
|
newBufferTime=1000;
|
||
|
if (newBufferTime>60000)
|
||
|
newBufferTime=60000;
|
||
|
config_buffer_time=newBufferTime;
|
||
|
|
||
|
int numChannels=SendMessage(GetDlgItem(hwndDlg, IDC_AUDIO_SPEAKER_COUNT), CB_GETCURSEL, 0, 0);
|
||
|
if (numChannels!=CB_ERR)
|
||
|
config_audio_num_channels = speakerList[numChannels].value;
|
||
|
|
||
|
fileTypes.SetTypes(types);
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK AddTypeProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
CFGSET(hwndDlg, IDC_FILEEXTENSION, true);
|
||
|
CFGSET(hwndDlg, IDC_TYPE_AUDIO, true);
|
||
|
break;
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_PROTOCOL:
|
||
|
SetDlgItemText(hwndDlg, IDC_STATIC_TYPE, WASABI_API_LNGSTRINGW(IDS_PROTOCOL));
|
||
|
break;
|
||
|
case IDC_FILEEXTENSION:
|
||
|
SetDlgItemText(hwndDlg, IDC_STATIC_TYPE, WASABI_API_LNGSTRINGW(IDS_EXTENSION));
|
||
|
break;
|
||
|
case IDOK:
|
||
|
{
|
||
|
wchar_t type[MAX_PATH] = {0}, description[1024] = {0};
|
||
|
GetDlgItemText(hwndDlg,IDC_TYPE,type,MAX_PATH);
|
||
|
GetDlgItemText(hwndDlg,IDC_DESCRIPTION,description,1024);
|
||
|
bool isProtocol = IsDlgButtonChecked(hwndDlg, IDC_PROTOCOL)== BST_CHECKED;
|
||
|
int avType = IsDlgButtonChecked(hwndDlg, IDC_TYPE_VIDEO)== BST_CHECKED;
|
||
|
types.push_back(FileType(type, description, isProtocol, avType));
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
}
|
||
|
break;
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void AddType(HWND hwndDlg)
|
||
|
{
|
||
|
WASABI_API_DIALOGBOXW(IDD_ADDTYPE, hwndDlg, AddTypeProc);
|
||
|
}
|
||
|
|
||
|
static size_t editIndex=0;
|
||
|
static INT_PTR CALLBACK EditTypeProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
SetWindowText(hwndDlg, WASABI_API_LNGSTRINGW(IDS_EDIT_FILE_TYPE));
|
||
|
CFGSET(hwndDlg, IDC_TYPE_AUDIO, (types[editIndex].avType==FileType::AUDIO));
|
||
|
CFGSET(hwndDlg, IDC_TYPE_VIDEO, (types[editIndex].avType==FileType::VIDEO));
|
||
|
CFGSET(hwndDlg, IDC_PROTOCOL, types[editIndex].isProtocol);
|
||
|
CFGSET(hwndDlg, IDC_FILEEXTENSION, !types[editIndex].isProtocol);
|
||
|
SetDlgItemText(hwndDlg,IDC_TYPE, types[editIndex].wtype);
|
||
|
SetDlgItemText(hwndDlg,IDC_DESCRIPTION, types[editIndex].description);
|
||
|
if (types[editIndex].isProtocol)
|
||
|
SetDlgItemText(hwndDlg, IDC_STATIC_TYPE, WASABI_API_LNGSTRINGW(IDS_PROTOCOL));
|
||
|
else
|
||
|
SetDlgItemText(hwndDlg, IDC_STATIC_TYPE, WASABI_API_LNGSTRINGW(IDS_EXTENSION));
|
||
|
break;
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_PROTOCOL:
|
||
|
SetDlgItemText(hwndDlg, IDC_STATIC_TYPE, WASABI_API_LNGSTRINGW(IDS_PROTOCOL));
|
||
|
break;
|
||
|
case IDC_FILEEXTENSION:
|
||
|
SetDlgItemText(hwndDlg, IDC_STATIC_TYPE, WASABI_API_LNGSTRINGW(IDS_EXTENSION));
|
||
|
break;
|
||
|
case IDOK:
|
||
|
{
|
||
|
wchar_t type[MAX_PATH] = {0}, description[1024] = {0};
|
||
|
GetDlgItemText(hwndDlg,IDC_TYPE,type,MAX_PATH);
|
||
|
GetDlgItemText(hwndDlg,IDC_DESCRIPTION,description,1024);
|
||
|
bool isProtocol = IsDlgButtonChecked(hwndDlg, IDC_PROTOCOL)== BST_CHECKED;
|
||
|
|
||
|
types[editIndex].avType = (IsDlgButtonChecked(hwndDlg, IDC_TYPE_VIDEO)== BST_CHECKED);
|
||
|
if(types[editIndex].wtype)free(types[editIndex].wtype);
|
||
|
types[editIndex].wtype = _wcsdup(type);
|
||
|
|
||
|
types[editIndex].isProtocol = isProtocol;
|
||
|
if(types[editIndex].description)free(types[editIndex].description);
|
||
|
types[editIndex].description = _wcsdup(description);
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
}
|
||
|
break;
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
void EditType(HWND hwndDlg)
|
||
|
{
|
||
|
editIndex=-1;
|
||
|
do
|
||
|
{
|
||
|
editIndex=typeList.GetNextSelected(editIndex);
|
||
|
if (editIndex != -1)
|
||
|
{
|
||
|
WASABI_API_DIALOGBOXW(IDD_ADDTYPE, hwndDlg, EditTypeProc);
|
||
|
}
|
||
|
else
|
||
|
return;
|
||
|
|
||
|
} while (true);
|
||
|
}
|
||
|
|
||
|
|
||
|
void Advanced_Init(HWND hwndDlg)
|
||
|
{
|
||
|
CFGSET(hwndDlg, IDC_AUDIO_THREAD, config_audio_dedicated_thread);
|
||
|
CFGSET(hwndDlg, IDC_AUDIO_EARLY, config_audio_early);
|
||
|
CFGSET(hwndDlg, IDC_AUDIO_OUTOFORDER, config_audio_outoforder);
|
||
|
CFGSET(hwndDlg, IDC_AUDIO_DROP, config_video_catchup);
|
||
|
|
||
|
CFGSET(hwndDlg, IDC_VIDEO_THREAD, config_video_dedicated_thread);
|
||
|
CFGSET(hwndDlg, IDC_VIDEO_EARLY, config_video_early);
|
||
|
CFGSET(hwndDlg, IDC_VIDEO_OUTOFORDER, config_video_outoforder);
|
||
|
CFGSET(hwndDlg, IDC_VIDEO_NOTIFY, config_video_notifylate);
|
||
|
|
||
|
CFGSET(hwndDlg, IDC_REALTIME, !config_clock);
|
||
|
CFGSET(hwndDlg, IDC_LOWMEMORY, config_lowmemory);
|
||
|
|
||
|
SetDlgItemInt(hwndDlg,IDC_AUDIO_CACHE_FRAMES, config_audio_cache_frames, TRUE/*signed*/);
|
||
|
SetDlgItemInt(hwndDlg,IDC_VIDEO_CACHE_FRAMES, config_video_cache_frames, TRUE);
|
||
|
SetDlgItemInt(hwndDlg,IDC_VIDEO_DROP_THRESHOLD, config_video_drop_threshold, TRUE);
|
||
|
SetDlgItemInt(hwndDlg,IDC_VIDEO_JITTER, config_video_jitter, TRUE);
|
||
|
SetDlgItemInt(hwndDlg,IDC_AUDIO_EARLYPAD, config_audio_early_pad, TRUE);
|
||
|
SetDlgItemInt(hwndDlg,IDC_VIDEO_EARLYPAD, config_video_early_pad,TRUE);
|
||
|
|
||
|
}
|
||
|
|
||
|
void Advanced_OnOK(HWND hwndDlg)
|
||
|
{
|
||
|
config_audio_dedicated_thread=IsDlgButtonChecked(hwndDlg, IDC_AUDIO_THREAD)== BST_CHECKED;
|
||
|
config_audio_early=IsDlgButtonChecked(hwndDlg, IDC_AUDIO_EARLY)== BST_CHECKED;
|
||
|
config_audio_outoforder=IsDlgButtonChecked(hwndDlg, IDC_AUDIO_OUTOFORDER)== BST_CHECKED;
|
||
|
config_video_catchup=IsDlgButtonChecked(hwndDlg, IDC_AUDIO_DROP)== BST_CHECKED;
|
||
|
|
||
|
config_video_dedicated_thread=IsDlgButtonChecked(hwndDlg, IDC_VIDEO_THREAD)== BST_CHECKED;
|
||
|
config_video_early=IsDlgButtonChecked(hwndDlg, IDC_VIDEO_EARLY)== BST_CHECKED;
|
||
|
config_video_outoforder=IsDlgButtonChecked(hwndDlg, IDC_VIDEO_OUTOFORDER)== BST_CHECKED;
|
||
|
config_video_notifylate=IsDlgButtonChecked(hwndDlg, IDC_VIDEO_NOTIFY)== BST_CHECKED;
|
||
|
|
||
|
config_clock=IsDlgButtonChecked(hwndDlg, IDC_REALTIME)!= BST_CHECKED;
|
||
|
config_lowmemory=IsDlgButtonChecked(hwndDlg, IDC_LOWMEMORY)== BST_CHECKED;
|
||
|
|
||
|
wchar_t temp[64] = {0};
|
||
|
|
||
|
GetDlgItemText(hwndDlg,IDC_AUDIO_CACHE_FRAMES, temp, 64);
|
||
|
config_audio_cache_frames = _wtoi(temp);
|
||
|
|
||
|
GetDlgItemText(hwndDlg,IDC_VIDEO_CACHE_FRAMES, temp, 64);
|
||
|
config_video_cache_frames= _wtoi(temp);
|
||
|
|
||
|
GetDlgItemText(hwndDlg,IDC_VIDEO_DROP_THRESHOLD, temp, 64);
|
||
|
config_video_drop_threshold= _wtoi(temp);
|
||
|
|
||
|
GetDlgItemText(hwndDlg,IDC_VIDEO_JITTER, temp, 64);
|
||
|
config_video_jitter= _wtoi(temp);
|
||
|
|
||
|
GetDlgItemText(hwndDlg,IDC_AUDIO_EARLYPAD, temp, 64);
|
||
|
config_audio_early_pad= _wtoi(temp);
|
||
|
|
||
|
GetDlgItemText(hwndDlg,IDC_VIDEO_EARLYPAD, temp, 64);
|
||
|
config_video_early_pad= _wtoi(temp);
|
||
|
}
|
||
|
|
||
|
static INT_PTR CALLBACK AdvancedDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
Advanced_Init(hwndDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDOK:
|
||
|
Advanced_OnOK(hwndDlg);
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
break;
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void Advanced(HWND hwndDlg)
|
||
|
{
|
||
|
WASABI_API_DIALOGBOXW(IDD_ADVANCED, hwndDlg, AdvancedDialogProc);
|
||
|
}
|
||
|
|
||
|
void Preferences_Default(HWND hwndDlg)
|
||
|
{
|
||
|
if (config_no_video)
|
||
|
{
|
||
|
// TODO: ask the user if they want to enable video support
|
||
|
}
|
||
|
DefaultConfig();
|
||
|
fileTypes.LoadDefaults();
|
||
|
Preferences_Populate(hwndDlg);
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK PreferencesDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
Preferences_Init(hwndDlg);
|
||
|
break;
|
||
|
case WM_DESTROY:
|
||
|
config_col1 = typeList.GetColumnWidth(0);
|
||
|
config_col2 = typeList.GetColumnWidth(1);
|
||
|
|
||
|
if (NULL != WASABI_API_APP)
|
||
|
WASABI_API_APP->DirectMouseWheel_EnableConvertToMouseWheel(typeList.getwnd(), FALSE);
|
||
|
break;
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_ADVANCED:
|
||
|
Advanced(hwndDlg);
|
||
|
break;
|
||
|
case IDC_DEFAULTTYPE:
|
||
|
Preferences_Default(hwndDlg);
|
||
|
break;
|
||
|
case IDC_ADDTYPE:
|
||
|
AddType(hwndDlg);
|
||
|
FillFileTypes();
|
||
|
break;
|
||
|
case IDC_EDITTYPE:
|
||
|
EditType(hwndDlg);
|
||
|
if(typeList.GetNextSelected(editIndex)!=-1)
|
||
|
FillFileTypes();
|
||
|
break;
|
||
|
case IDC_REMOVETYPE:
|
||
|
Preferences_TypeRemove(hwndDlg);
|
||
|
FillFileTypes();
|
||
|
break;
|
||
|
case IDOK:
|
||
|
OnOk(hwndDlg);
|
||
|
case IDCANCEL:
|
||
|
EndDialog(hwndDlg, 0);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|