mplayerc.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:81k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // mplayerc.cpp : Defines the class behaviors for the application.
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include <atlsync.h>
  26. #include <Tlhelp32.h>
  27. #include "MainFrm.h"
  28. #include "....DSUtilDSUtil.h"
  29. /////////
  30. void CorrectComboListWidth(CComboBox& box, CFont* pWndFont)
  31. {
  32. int cnt = box.GetCount();
  33. if(cnt <= 0) return;
  34. CDC* pDC = box.GetDC();
  35. pDC->SelectObject(pWndFont);
  36. int maxw = box.GetDroppedWidth();
  37. for(int i = 0; i < cnt; i++)
  38. {
  39. CString str;
  40. box.GetLBText(i, str);
  41. int w = pDC->GetTextExtent(str).cx + 22;
  42. if(maxw < w) maxw = w;
  43. }
  44. box.ReleaseDC(pDC);
  45. box.SetDroppedWidth(maxw);
  46. }
  47. HICON LoadIcon(CString fn, bool fSmall)
  48. {
  49. if(fn.IsEmpty()) return(NULL);
  50. CString ext = fn.Left(fn.Find(_T("://"))+1).TrimRight(':');
  51. if(ext.IsEmpty() || !ext.CompareNoCase(_T("file")))
  52. ext = _T(".") + fn.Mid(fn.ReverseFind('.')+1);
  53. CSize size(fSmall?16:32,fSmall?16:32);
  54. if(!ext.CompareNoCase(_T(".ifo")))
  55. {
  56. if(HICON hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_DVD), IMAGE_ICON, size.cx, size.cy, 0))
  57. return(hIcon);
  58. }
  59. if(!ext.CompareNoCase(_T(".cda")))
  60. {
  61. if(HICON hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_AUDIOCD), IMAGE_ICON, size.cx, size.cy, 0))
  62. return(hIcon);
  63. }
  64. do
  65. {
  66. CRegKey key;
  67. TCHAR buff[256];
  68. ULONG len;
  69. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext + _T("\DefaultIcon"), KEY_READ))
  70. {
  71. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext, KEY_READ))
  72. break;
  73. len = sizeof(buff);
  74. memset(buff, 0, len);
  75. if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len) || (ext = buff).Trim().IsEmpty())
  76. break;
  77. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext + _T("\DefaultIcon"), KEY_READ))
  78. break;
  79. }
  80. CString icon;
  81. len = sizeof(buff);
  82. memset(buff, 0, len);
  83. if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len) || (icon = buff).Trim().IsEmpty())
  84. break;
  85. int i = icon.ReverseFind(',');
  86. if(i < 0) break;
  87. int id = 0;
  88. if(_stscanf(icon.Mid(i+1), _T("%d"), &id) != 1)
  89. break;
  90. icon = icon.Left(i);
  91. HICON hIcon = NULL;
  92. UINT cnt = fSmall 
  93. ? ExtractIconEx(icon, id, NULL, &hIcon, 1)
  94. : ExtractIconEx(icon, id, &hIcon, NULL, 1);
  95. if(hIcon) return hIcon;
  96. }
  97. while(0);
  98. return((HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_UNKNOWN), IMAGE_ICON, size.cx, size.cy, 0));
  99. }
  100. bool LoadType(CString fn, CString& type)
  101. {
  102. CRegKey key;
  103. TCHAR buff[256];
  104. ULONG len;
  105. if(fn.IsEmpty()) return(NULL);
  106. CString ext = fn.Left(fn.Find(_T("://"))+1).TrimRight(':');
  107. if(ext.IsEmpty() || !ext.CompareNoCase(_T("file")))
  108. ext = _T(".") + fn.Mid(fn.ReverseFind('.')+1);
  109. if(ERROR_SUCCESS != key.Open(HKEY_CLASSES_ROOT, ext))
  110. return(false);
  111. CString tmp = ext;
  112.     while(ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, tmp))
  113. {
  114. len = sizeof(buff);
  115. memset(buff, 0, len);
  116. if(ERROR_SUCCESS != key.QueryStringValue(NULL, buff, &len))
  117. break;
  118. CString str(buff);
  119. str.Trim();
  120. if(str.IsEmpty() || str == tmp)
  121. break;
  122. tmp = str;
  123. }
  124. type = tmp;
  125. return(true);
  126. }
  127. bool LoadResource(UINT resid, CStringA& str, LPCTSTR restype)
  128. {
  129. str.Empty();
  130. HRSRC hrsrc = FindResource(AfxGetResourceHandle(), MAKEINTRESOURCE(resid), restype);
  131. if(!hrsrc) return(false);
  132. HGLOBAL hGlobal = LoadResource(AfxGetResourceHandle(), hrsrc);
  133. if(!hGlobal) return(false);
  134. DWORD size = SizeofResource(AfxGetResourceHandle(), hrsrc);
  135. if(!size) return(false);
  136. memcpy(str.GetBufferSetLength(size), LockResource(hGlobal), size);
  137. return(true);
  138. }
  139. /////////////////////////////////////////////////////////////////////////////
  140. // CAboutDlg dialog used for App About
  141. class CAboutDlg : public CDialog
  142. {
  143. public:
  144. CAboutDlg();
  145. // Dialog Data
  146. //{{AFX_DATA(CAboutDlg)
  147. enum { IDD = IDD_ABOUTBOX };
  148. //}}AFX_DATA
  149. // ClassWizard generated virtual function overrides
  150. //{{AFX_VIRTUAL(CAboutDlg)
  151. protected:
  152. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  153. //}}AFX_VIRTUAL
  154. // Implementation
  155. protected:
  156. //{{AFX_MSG(CAboutDlg)
  157. // No message handlers
  158. //}}AFX_MSG
  159. DECLARE_MESSAGE_MAP()
  160. public:
  161. CString m_appname;
  162. virtual BOOL OnInitDialog()
  163. {
  164. #ifdef UNICODE
  165. UpdateData();
  166. m_appname += _T(" (unicode build)");
  167. UpdateData(FALSE);
  168. #endif
  169. return TRUE;
  170. }
  171. };
  172. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD), m_appname(_T(""))
  173. {
  174. //{{AFX_DATA_INIT(CAboutDlg)
  175. //}}AFX_DATA_INIT
  176. }
  177. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  178. {
  179. CDialog::DoDataExchange(pDX);
  180. //{{AFX_DATA_MAP(CAboutDlg)
  181. //}}AFX_DATA_MAP
  182. DDX_Text(pDX, IDC_STATIC1, m_appname);
  183. }
  184. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  185. //{{AFX_MSG_MAP(CAboutDlg)
  186. // No message handlers
  187. //}}AFX_MSG_MAP
  188. END_MESSAGE_MAP()
  189. /////////////////////////////////////////////////////////////////////////////
  190. // CMPlayerCApp
  191. BEGIN_MESSAGE_MAP(CMPlayerCApp, CWinApp)
  192. //{{AFX_MSG_MAP(CMPlayerCApp)
  193. ON_COMMAND(ID_HELP_ABOUT, OnAppAbout)
  194. ON_COMMAND(ID_FILE_EXIT, OnFileExit)
  195. //}}AFX_MSG_MAP
  196. ON_COMMAND(ID_HELP_SHOWCOMMANDLINESWITCHES, OnHelpShowcommandlineswitches)
  197. END_MESSAGE_MAP()
  198. /////////////////////////////////////////////////////////////////////////////
  199. // CMPlayerCApp construction
  200. CMPlayerCApp::CMPlayerCApp()
  201. // : m_hMutexOneInstance(NULL)
  202. {
  203. }
  204. void CMPlayerCApp::ShowCmdlnSwitches()
  205. {
  206. CString s;
  207. if(m_s.nCLSwitches&CLSW_UNRECOGNIZEDSWITCH)
  208. {
  209. CAtlList<CString> sl;
  210. for(int i = 0; i < __argc; i++) sl.AddTail(__targv[i]);
  211. s += "Unrecognized switch(es) found in command line string: nn" + Implode(sl, ' ') + "nn";
  212. }
  213. s +=
  214. _T("Usage: mplayerc.exe "pathname" [switches]nn")
  215. _T(""pathname"tThe main file or directory to be loaded. (wildcards allowed)n")
  216. _T("/dub "dubname"tLoad an additional audio file.n")
  217. _T("/sub "subname"tLoad an additional subtitle file.n")
  218. _T("/filter "filtername"tLoad DirectShow filters from a dynamic link library. (wildcards allowed)n")
  219. _T("/dvdttRun in dvd mode, "pathname" means the dvd folder (optional).n")
  220. _T("/cdttLoad all the tracks of an audio cd or (s)vcd, "pathname" means the drive path (optional).n")
  221. _T("/openttOpen the file, don't automatically start playing.n")
  222. _T("/playttStart playing the file as soon the player is launched.n")
  223. _T("/closettClose the player after playback (only works when used with /play).n")
  224. _T("/shutdowntShutdown the operating system after playbackn")
  225. _T("/fullscreentStart in full-screen mode.n")
  226. _T("/minimizedtStart in minimized mode.n")
  227. _T("/newttUse a new instance of the player.n")
  228. _T("/addttAdd "pathname" to playlist, can be combined with /open and /play.n")
  229. _T("/regvidttRegister video formatsn")
  230. _T("/regaudttRegister audio formatsn")
  231. _T("/unregvidttUnregister video formatsn")
  232. _T("/unregaudtUnregister audio formatsn")
  233. _T("/start msttStart playing at "ms" (= milliseconds)n")
  234. _T("/fixedsize w,htSet fixed window size.n")
  235. _T("/monitor NtStart on monitor N, where N starts from 1.n")
  236. _T("/help /h /?tShow help about command line switches. (this message box)n");
  237. AfxMessageBox(s);
  238. }
  239. /////////////////////////////////////////////////////////////////////////////
  240. // The one and only CMPlayerCApp object
  241. CMPlayerCApp theApp;
  242. HWND g_hWnd = NULL;
  243. bool CMPlayerCApp::StoreSettingsToIni()
  244. {
  245. CString ini = GetIniPath();
  246. /*
  247. FILE* f;
  248. if(!(f = _tfopen(ini, _T("r+"))) && !(f = _tfopen(ini, _T("w"))))
  249. return StoreSettingsToRegistry();
  250. fclose(f);
  251. */
  252. if(m_pszRegistryKey) free((void*)m_pszRegistryKey);
  253. m_pszRegistryKey = NULL;
  254. if(m_pszProfileName) free((void*)m_pszProfileName);
  255. m_pszProfileName = _tcsdup(ini);
  256. return(true);
  257. }
  258. bool CMPlayerCApp::StoreSettingsToRegistry()
  259. {
  260. _tremove(GetIniPath());
  261. if(m_pszRegistryKey) free((void*)m_pszRegistryKey);
  262. m_pszRegistryKey = NULL;
  263. SetRegistryKey(_T("Gabest"));
  264. return(true);
  265. }
  266. CString CMPlayerCApp::GetIniPath()
  267. {
  268. CString path;
  269. GetModuleFileName(AfxGetInstanceHandle(), path.GetBuffer(MAX_PATH), MAX_PATH);
  270. path.ReleaseBuffer();
  271. path = path.Left(path.ReverseFind('.')+1) + _T("ini");
  272. return(path);
  273. }
  274. bool CMPlayerCApp::IsIniValid()
  275. {
  276. CFileStatus fs;
  277. return CFileGetStatus(GetIniPath(), fs) && fs.m_size > 0;
  278. }
  279. bool CMPlayerCApp::GetAppDataPath(CString& path)
  280. {
  281. path.Empty();
  282. CRegKey key;
  283. if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"), KEY_READ))
  284. {
  285. ULONG len = MAX_PATH;
  286. if(ERROR_SUCCESS == key.QueryStringValue(_T("AppData"), path.GetBuffer(MAX_PATH), &len))
  287. path.ReleaseBufferSetLength(len);
  288. }
  289. if(path.IsEmpty())
  290. return(false);
  291. CPath p;
  292. p.Combine(path, _T("Media Player Classic"));
  293. path = (LPCTSTR)p;
  294. return(true);
  295. }
  296. void CMPlayerCApp::PreProcessCommandLine()
  297. {
  298. m_cmdln.RemoveAll();
  299. for(int i = 1; i < __argc; i++)
  300. {
  301. CString str = CString(__targv[i]).Trim(_T(" ""));
  302. if(str[0] != '/' && str[0] != '-' && str.Find(_T(":")) < 0)
  303. {
  304. LPTSTR p = NULL;
  305. CString str2;
  306. str2.ReleaseBuffer(GetFullPathName(str, MAX_PATH, str2.GetBuffer(MAX_PATH), &p));
  307. CFileStatus fs;
  308. if(!str2.IsEmpty() && CFileGetStatus(str2, fs)) str = str2;
  309. }
  310. m_cmdln.AddTail(str);
  311. }
  312. }
  313. void CMPlayerCApp::SendCommandLine(HWND hWnd)
  314. {
  315. if(m_cmdln.IsEmpty())
  316. return;
  317. int bufflen = sizeof(DWORD);
  318. POSITION pos = m_cmdln.GetHeadPosition();
  319. while(pos) bufflen += (m_cmdln.GetNext(pos).GetLength()+1)*sizeof(TCHAR);
  320. CAutoVectorPtr<BYTE> buff;
  321. if(!buff.Allocate(bufflen))
  322. return;
  323. BYTE* p = buff;
  324. *(DWORD*)p = m_cmdln.GetCount(); 
  325. p += sizeof(DWORD);
  326. pos = m_cmdln.GetHeadPosition();
  327. while(pos)
  328. {
  329. CString s = m_cmdln.GetNext(pos); 
  330. int len = (s.GetLength()+1)*sizeof(TCHAR);
  331. memcpy(p, s, len);
  332. p += len;
  333. }
  334. COPYDATASTRUCT cds;
  335. cds.dwData = 0x6ABE51;
  336. cds.cbData = bufflen;
  337. cds.lpData = (void*)(BYTE*)buff;
  338. SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds);
  339. }
  340. /////////////////////////////////////////////////////////////////////////////
  341. // CMPlayerCApp initialization
  342. #include "......includedetoursdetours.h"
  343. #include "......includewinddkntddcdvd.h"
  344. DETOUR_TRAMPOLINE(BOOL WINAPI Real_IsDebuggerPresent(), IsDebuggerPresent);
  345. BOOL WINAPI Mine_IsDebuggerPresent()
  346. {
  347. TRACE(_T("Oops, somebody was trying to be naughty! (called IsDebuggerPresent)n")); 
  348. return FALSE;
  349. }
  350. DETOUR_TRAMPOLINE(LONG WINAPI Real_ChangeDisplaySettingsExA(LPCSTR lpszDeviceName, LPDEVMODEA lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam), ChangeDisplaySettingsExA);
  351. DETOUR_TRAMPOLINE(LONG WINAPI Real_ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName, LPDEVMODEW lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam), ChangeDisplaySettingsExW);
  352. LONG WINAPI Mine_ChangeDisplaySettingsEx(LONG ret, DWORD dwFlags, LPVOID lParam)
  353. {
  354. if(dwFlags&CDS_VIDEOPARAMETERS)
  355. {
  356. VIDEOPARAMETERS* vp = (VIDEOPARAMETERS*)lParam;
  357. if(vp->Guid == GUIDFromCString(_T("{02C62061-1097-11d1-920F-00A024DF156E}"))
  358. && (vp->dwFlags&VP_FLAGS_COPYPROTECT))
  359. {
  360. if(vp->dwCommand == VP_COMMAND_GET)
  361. {
  362. if((vp->dwTVStandard&VP_TV_STANDARD_WIN_VGA)
  363. && vp->dwTVStandard != VP_TV_STANDARD_WIN_VGA)
  364. {
  365. TRACE(_T("Ooops, tv-out enabled? macrovision checks suck..."));
  366. vp->dwTVStandard = VP_TV_STANDARD_WIN_VGA;
  367. }
  368. }
  369. else if(vp->dwCommand == VP_COMMAND_SET)
  370. {
  371. TRACE(_T("Ooops, as I already told ya, no need for any macrovision bs here"));
  372. return 0;
  373. }
  374. }
  375. }
  376. return ret;
  377. }
  378. LONG WINAPI Mine_ChangeDisplaySettingsExA(LPCSTR lpszDeviceName, LPDEVMODEA lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam)
  379. {
  380. return Mine_ChangeDisplaySettingsEx(
  381. Real_ChangeDisplaySettingsExA(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), 
  382. dwFlags, 
  383. lParam);
  384. }
  385. LONG WINAPI Mine_ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName, LPDEVMODEW lpDevMode, HWND hwnd, DWORD dwFlags, LPVOID lParam)
  386. {
  387. return Mine_ChangeDisplaySettingsEx(
  388. Real_ChangeDisplaySettingsExW(lpszDeviceName, lpDevMode, hwnd, dwFlags, lParam), 
  389. dwFlags,
  390. lParam);
  391. }
  392. DETOUR_TRAMPOLINE(HANDLE WINAPI Real_CreateFileA(LPCSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7), CreateFileA);
  393. DETOUR_TRAMPOLINE(HANDLE WINAPI Real_CreateFileW(LPCWSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7), CreateFileW);
  394. HANDLE WINAPI Mine_CreateFileA(LPCSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7)
  395. {
  396. CStringA fn(p1);
  397. fn.MakeLower();
  398. int i = fn.Find(".part");
  399. if(i > 0 && i == fn.GetLength() - 5)
  400. p3 |= FILE_SHARE_WRITE;
  401. return Real_CreateFileA(p1, p2, p3, p4, p5, p6, p7);
  402. }
  403. HANDLE WINAPI Mine_CreateFileW(LPCWSTR p1, DWORD p2, DWORD p3, LPSECURITY_ATTRIBUTES p4, DWORD p5, DWORD p6, HANDLE p7)
  404. {
  405. CStringW fn(p1);
  406. fn.MakeLower();
  407. int i = fn.Find(L".part");
  408. if(i > 0 && i == fn.GetLength() - 5)
  409. p3 |= FILE_SHARE_WRITE;
  410. return Real_CreateFileW(p1, p2, p3, p4, p5, p6, p7);
  411. }
  412. DETOUR_TRAMPOLINE(MMRESULT WINAPI Real_mixerSetControlDetails(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails), mixerSetControlDetails);
  413. MMRESULT WINAPI Mine_mixerSetControlDetails(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
  414. {
  415. if(fdwDetails == (MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE)) 
  416. return MMSYSERR_NOERROR; // don't touch the mixer, kthx
  417. return Real_mixerSetControlDetails(hmxobj, pmxcd, fdwDetails);
  418. }
  419. DETOUR_TRAMPOLINE(BOOL WINAPI Real_DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped), DeviceIoControl);
  420. BOOL WINAPI Mine_DeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
  421. {
  422. BOOL ret = Real_DeviceIoControl(hDevice, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped);
  423. if(IOCTL_DVD_GET_REGION == dwIoControlCode && lpOutBuffer
  424. && lpBytesReturned && *lpBytesReturned == sizeof(DVD_REGION))
  425. {
  426. DVD_REGION* pDVDRegion = (DVD_REGION*)lpOutBuffer;
  427. pDVDRegion->SystemRegion = ~pDVDRegion->RegionData;
  428. }
  429. return ret;
  430. }
  431. #include "../../subtitles/SSF.h"
  432. #include "../../subtitles/RTS.h"
  433. #include "../../subpic/MemSubPic.h"
  434. class ssftest
  435. {
  436. public:
  437. ssftest()
  438. {
  439. Sleep(10000);
  440. MessageBeep(-1);
  441. // 8; //
  442. SubPicDesc spd;
  443. spd.w = 640;
  444. spd.h = 480;
  445. spd.bpp = 32;
  446. spd.pitch = spd.w*spd.bpp>>3;
  447. spd.type = MSP_RGB32;
  448. spd.vidrect = CRect(0, 0, spd.w, spd.h);
  449. spd.bits = new BYTE[spd.pitch*spd.h];
  450. CCritSec csLock;
  451. /*
  452. CRenderedTextSubtitle s(&csLock);
  453. s.Open(_T("../../subtitles/libssf/demo/demo.ssa"), 1);
  454. for(int i = 2*60*1000+2000; i < 2*60*1000+17000; i += 10)
  455. {
  456. memsetd(spd.bits, 0xff000000, spd.pitch*spd.h);
  457. CRect bbox;
  458. bbox.SetRectEmpty();
  459. s.Render(spd, 10000i64*i, 25, bbox);
  460. }
  461. */
  462. try
  463. {
  464. ssf::CRenderer s(&csLock);
  465. s.Open(_T("../../subtitles/libssf/demo/demo.ssf"));
  466. for(int i = 2*60*1000+2000; i < 2*60*1000+17000; i += 40)
  467. // for(int i = 2*60*1000+2000; i < 2*60*1000+17000; i += 1000)
  468. //for(int i = 0; i < 5000; i += 40)
  469. {
  470. memsetd(spd.bits, 0xff000000, spd.pitch*spd.h);
  471. CRect bbox;
  472. bbox.SetRectEmpty();
  473. s.Render(spd, 10000i64*i, 25, bbox);
  474. }
  475. }
  476. catch(ssf::Exception& e)
  477. {
  478. TRACE(_T("%sn"), e.ToString());
  479. ASSERT(0);
  480. }
  481. delete [] spd.bits;
  482. ::ExitProcess(0);
  483. }
  484. };
  485. BOOL CMPlayerCApp::InitInstance()
  486. {
  487. //ssftest s;
  488. DetourFunctionWithTrampoline((PBYTE)Real_IsDebuggerPresent, (PBYTE)Mine_IsDebuggerPresent);
  489. DetourFunctionWithTrampoline((PBYTE)Real_ChangeDisplaySettingsExA, (PBYTE)Mine_ChangeDisplaySettingsExA);
  490. DetourFunctionWithTrampoline((PBYTE)Real_ChangeDisplaySettingsExW, (PBYTE)Mine_ChangeDisplaySettingsExW);
  491. DetourFunctionWithTrampoline((PBYTE)Real_CreateFileA, (PBYTE)Mine_CreateFileA);
  492. DetourFunctionWithTrampoline((PBYTE)Real_CreateFileW, (PBYTE)Mine_CreateFileW);
  493. DetourFunctionWithTrampoline((PBYTE)Real_mixerSetControlDetails, (PBYTE)Mine_mixerSetControlDetails);
  494. DetourFunctionWithTrampoline((PBYTE)Real_DeviceIoControl, (PBYTE)Mine_DeviceIoControl);
  495. CFilterMapper2::Init();
  496. HRESULT hr;
  497.     if(FAILED(hr = OleInitialize(0)))
  498. {
  499.         AfxMessageBox(_T("OleInitialize failed!"));
  500. return FALSE;
  501. }
  502.     WNDCLASS wndcls;
  503.     memset(&wndcls, 0, sizeof(WNDCLASS));
  504.     wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
  505.     wndcls.lpfnWndProc = ::DefWindowProc; 
  506.     wndcls.hInstance = AfxGetInstanceHandle();
  507.     wndcls.hIcon = LoadIcon(IDR_MAINFRAME);
  508.     wndcls.hCursor = LoadCursor(IDC_ARROW);
  509.     wndcls.hbrBackground = 0;//(HBRUSH)(COLOR_WINDOW + 1); // no bkg brush, the view and the bars should always fill the whole client area
  510.     wndcls.lpszMenuName = NULL;
  511.     wndcls.lpszClassName = MPC_WND_CLASS_NAME;
  512. if(!AfxRegisterClass(&wndcls))
  513.     {
  514. AfxMessageBox(_T("MainFrm class registration failed!"));
  515. return FALSE;
  516.     }
  517. if(!AfxSocketInit(NULL))
  518. {
  519.         AfxMessageBox(_T("AfxSocketInit failed!"));
  520. return FALSE;
  521. }
  522. PreProcessCommandLine();
  523. if(IsIniValid()) StoreSettingsToIni();
  524. else StoreSettingsToRegistry();
  525. CString AppDataPath;
  526. if(GetAppDataPath(AppDataPath))
  527. CreateDirectory(AppDataPath, NULL);
  528. m_s.ParseCommandLine(m_cmdln);
  529. if(m_s.nCLSwitches&(CLSW_HELP|CLSW_UNRECOGNIZEDSWITCH))
  530. {
  531. ShowCmdlnSwitches();
  532. return FALSE;
  533. }
  534. if((m_s.nCLSwitches&CLSW_CLOSE) && m_s.slFiles.IsEmpty())
  535. {
  536. return FALSE;
  537. }
  538. m_s.UpdateData(false);
  539. if((m_s.nCLSwitches&CLSW_REGEXTVID) || (m_s.nCLSwitches&CLSW_UNREGEXTVID)
  540. || (m_s.nCLSwitches&CLSW_REGEXTAUD) || (m_s.nCLSwitches&CLSW_UNREGEXTAUD))
  541. {
  542. CMediaFormats& mf = m_s.Formats;
  543. for(int i = 0; i < mf.GetCount(); i++)
  544. {
  545. // HACK
  546. if(!mf[i].GetLabel().CompareNoCase(_T("Image file"))) continue;
  547. bool fAudioOnly = mf[i].IsAudioOnly();
  548. int j = 0;
  549. CString str = mf[i].GetExtsWithPeriod();
  550. for(CString ext = str.Tokenize(_T(" "), j); !ext.IsEmpty(); ext = str.Tokenize(_T(" "), j))
  551. {
  552. if((m_s.nCLSwitches&CLSW_REGEXTVID) && !fAudioOnly
  553. || (m_s.nCLSwitches&CLSW_REGEXTAUD) && fAudioOnly)
  554. CPPageFormats::RegisterExt(ext, true);
  555. if((m_s.nCLSwitches&CLSW_UNREGEXTVID) && !fAudioOnly
  556. || (m_s.nCLSwitches&CLSW_UNREGEXTAUD) && fAudioOnly)
  557. CPPageFormats::RegisterExt(ext, false);
  558. }
  559. }
  560. return FALSE;
  561. }
  562. m_mutexOneInstance.Create(NULL, TRUE, MPC_WND_CLASS_NAME);
  563. if(GetLastError() == ERROR_ALREADY_EXISTS
  564. && (!(m_s.fAllowMultipleInst || (m_s.nCLSwitches&CLSW_NEW) || m_cmdln.IsEmpty())
  565. || (m_s.nCLSwitches&CLSW_ADD)))
  566. {
  567. if(HWND hWnd = ::FindWindow(MPC_WND_CLASS_NAME, NULL))
  568. {
  569. SetForegroundWindow(hWnd);
  570. if(!(m_s.nCLSwitches&CLSW_MINIMIZED) && IsIconic(hWnd))
  571. ShowWindow(hWnd, SW_RESTORE);
  572. SendCommandLine(hWnd);
  573. return FALSE;
  574. }
  575. }
  576. if(!__super::InitInstance())
  577. {
  578. AfxMessageBox(_T("InitInstance failed!"));
  579. return FALSE;
  580. }
  581. CRegKey key;
  582. if(ERROR_SUCCESS == key.Create(HKEY_LOCAL_MACHINE, _T("Software\Gabest\Media Player Classic")))
  583. {
  584. CString path;
  585. GetModuleFileName(AfxGetInstanceHandle(), path.GetBuffer(MAX_PATH), MAX_PATH);
  586. path.ReleaseBuffer();
  587. key.SetStringValue(_T("ExePath"), path);
  588. }
  589. AfxEnableControlContainer();
  590. CMainFrame* pFrame = new CMainFrame;
  591. m_pMainWnd = pFrame;
  592. pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE, NULL, NULL);
  593. pFrame->SetDefaultWindowRect((m_s.nCLSwitches&CLSW_MONITOR)?m_s.iMonitor:0);
  594. pFrame->RestoreFloatingControlBars();
  595. pFrame->SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE);
  596. pFrame->DragAcceptFiles();
  597. pFrame->ShowWindow((m_s.nCLSwitches&CLSW_MINIMIZED)?SW_SHOWMINIMIZED:SW_SHOW);
  598. pFrame->UpdateWindow();
  599. pFrame->m_hAccelTable = m_s.hAccel;
  600. m_s.WinLircClient.SetHWND(m_pMainWnd->m_hWnd);
  601. if(m_s.fWinLirc) m_s.WinLircClient.Connect(m_s.WinLircAddr);
  602. m_s.UIceClient.SetHWND(m_pMainWnd->m_hWnd);
  603. if(m_s.fUIce) m_s.UIceClient.Connect(m_s.UIceAddr);
  604. SendCommandLine(m_pMainWnd->m_hWnd);
  605. pFrame->SetFocus();
  606. return TRUE;
  607. }
  608. int CMPlayerCApp::ExitInstance()
  609. {
  610. m_s.UpdateData(true);
  611.     OleUninitialize();
  612. return CWinApp::ExitInstance();
  613. }
  614. /////////////////////////////////////////////////////////////////////////////
  615. // CMPlayerCApp message handlers
  616. // App command to run the dialog
  617. void CMPlayerCApp::OnAppAbout()
  618. {
  619. CAboutDlg aboutDlg;
  620. aboutDlg.DoModal();
  621. }
  622. void CMPlayerCApp::OnFileExit()
  623. {
  624. OnAppExit();
  625. }
  626. // CRemoteCtrlClient
  627. CRemoteCtrlClient::CRemoteCtrlClient() 
  628. : m_pWnd(NULL)
  629. , m_nStatus(DISCONNECTED)
  630. {
  631. }
  632. void CRemoteCtrlClient::SetHWND(HWND hWnd)
  633. {
  634. CAutoLock cAutoLock(&m_csLock);
  635. m_pWnd = CWnd::FromHandle(hWnd);
  636. }
  637. void CRemoteCtrlClient::Connect(CString addr)
  638. {
  639. CAutoLock cAutoLock(&m_csLock);
  640. if(m_nStatus == CONNECTING && m_addr == addr)
  641. {
  642. TRACE(_T("CRemoteCtrlClient (Connect): already connecting to %sn"), addr);
  643. return;
  644. }
  645. if(m_nStatus == CONNECTED && m_addr == addr)
  646. {
  647. TRACE(_T("CRemoteCtrlClient (Connect): already connected to %sn"), addr);
  648. return;
  649. }
  650. m_nStatus = CONNECTING;
  651. TRACE(_T("CRemoteCtrlClient (Connect): connecting to %sn"), addr);
  652. Close();
  653. Create();
  654. CString ip = addr.Left(addr.Find(':')+1).TrimRight(':');
  655. int port = _tcstol(addr.Mid(addr.Find(':')+1), NULL, 10);
  656. __super::Connect(ip, port);
  657. m_addr = addr;
  658. }
  659. void CRemoteCtrlClient::OnConnect(int nErrorCode)
  660. {
  661. CAutoLock cAutoLock(&m_csLock);
  662. m_nStatus = (nErrorCode == 0 ? CONNECTED : DISCONNECTED);
  663. TRACE(_T("CRemoteCtrlClient (OnConnect): %dn"), nErrorCode);
  664. }
  665. void CRemoteCtrlClient::OnClose(int nErrorCode)
  666. {
  667. CAutoLock cAutoLock(&m_csLock);
  668. if(m_hSocket != INVALID_SOCKET && m_nStatus == CONNECTED)
  669. {
  670. TRACE(_T("CRemoteCtrlClient (OnClose): connection lostn"));
  671. }
  672. m_nStatus = DISCONNECTED;
  673. TRACE(_T("CRemoteCtrlClient (OnClose): %dn"), nErrorCode);
  674. }
  675. void CRemoteCtrlClient::OnReceive(int nErrorCode)
  676. {
  677. if(nErrorCode != 0 || !m_pWnd) return;
  678. CStringA str;
  679. int ret = Receive(str.GetBuffer(256), 255, 0);
  680. if(ret <= 0) return;
  681. str.ReleaseBuffer(ret);
  682. TRACE(_T("CRemoteCtrlClient (OnReceive): %sn"), CString(str));
  683. OnCommand(str);
  684. __super::OnReceive(nErrorCode);
  685. }
  686. void CRemoteCtrlClient::ExecuteCommand(CStringA cmd, int repcnt)
  687. {
  688. cmd.Trim();
  689. if(cmd.IsEmpty()) return;
  690. cmd.Replace(' ', '_');
  691. AppSettings& s = AfxGetAppSettings();
  692. POSITION pos = s.wmcmds.GetHeadPosition();
  693. while(pos)
  694. {
  695. wmcmd wc = s.wmcmds.GetNext(pos);
  696. CStringA name = CString(wc.name);
  697. name.Replace(' ', '_');
  698. if((repcnt == 0 && wc.rmrepcnt == 0 || wc.rmrepcnt > 0 && (repcnt%wc.rmrepcnt) == 0)
  699. && (!name.CompareNoCase(cmd) || !wc.rmcmd.CompareNoCase(cmd) || wc.cmd == (WORD)strtol(cmd, NULL, 10)))
  700. {
  701. CAutoLock cAutoLock(&m_csLock);
  702. TRACE(_T("CRemoteCtrlClient (calling command): %sn"), wc.name);
  703. m_pWnd->SendMessage(WM_COMMAND, wc.cmd);
  704. break;
  705. }
  706. }
  707. }
  708. // CWinLircClient
  709. CWinLircClient::CWinLircClient()
  710. {
  711. }
  712. void CWinLircClient::OnCommand(CStringA str)
  713. {
  714. TRACE(_T("CWinLircClient (OnCommand): %sn"), CString(str));
  715. int i = 0, j = 0, repcnt = 0;
  716. for(CStringA token = str.Tokenize(" ", i); 
  717. !token.IsEmpty();
  718. token = str.Tokenize(" ", i), j++)
  719. {
  720. if(j == 1)
  721. repcnt = strtol(token, NULL, 16);
  722. else if(j == 2)
  723. ExecuteCommand(token, repcnt);
  724. }
  725. }
  726. // CUIceClient
  727. CUIceClient::CUIceClient()
  728. {
  729. }
  730. void CUIceClient::OnCommand(CStringA str)
  731. {
  732. TRACE(_T("CUIceClient (OnCommand): %sn"), CString(str));
  733. CStringA cmd;
  734. int i = 0, j = 0;
  735. for(CStringA token = str.Tokenize("|", i); 
  736. !token.IsEmpty(); 
  737. token = str.Tokenize("|", i), j++)
  738. {
  739. if(j == 0)
  740. cmd = token;
  741. else if(j == 1)
  742. ExecuteCommand(cmd, strtol(token, NULL, 16));
  743. }
  744. }
  745. // CMPlayerCApp::Settings
  746. CMPlayerCApp::Settings::Settings() 
  747. : fInitialized(false)
  748. , MRU(0, _T("Recent File List"), _T("File%d"), 20)
  749. , MRUDub(0, _T("Recent Dub List"), _T("Dub%d"), 20)
  750. , hAccel(NULL)
  751. {
  752. #define ADDCMD(cmd) wmcmds.AddTail(wmcmd##cmd)
  753. ADDCMD((ID_FILE_OPENQUICK, 'Q', FVIRTKEY|FCONTROL|FNOINVERT, _T("Quick Open File")));
  754. ADDCMD((ID_FILE_OPENMEDIA, 'O', FVIRTKEY|FCONTROL|FNOINVERT, _T("Open File")));
  755. ADDCMD((ID_FILE_OPENDVD, 'D', FVIRTKEY|FCONTROL|FNOINVERT, _T("Open DVD")));
  756. ADDCMD((ID_FILE_OPENDEVICE, 'V', FVIRTKEY|FCONTROL|FNOINVERT, _T("Open Device")));
  757. ADDCMD((ID_FILE_SAVE_COPY, 0, FVIRTKEY|FNOINVERT, _T("Save As")));
  758. ADDCMD((ID_FILE_SAVE_IMAGE, 0, FVIRTKEY|FNOINVERT, _T("Save Image")));
  759. ADDCMD((ID_FILE_SAVE_IMAGE_AUTO, VK_F5, FVIRTKEY|FNOINVERT, _T("Save Image (auto)")));
  760. ADDCMD((ID_FILE_LOAD_SUBTITLE, 'L', FVIRTKEY|FCONTROL|FNOINVERT, _T("Load Subtitle")));
  761. ADDCMD((ID_FILE_SAVE_SUBTITLE, 'S', FVIRTKEY|FCONTROL|FNOINVERT, _T("Save Subtitle")));
  762. ADDCMD((ID_FILE_CLOSEPLAYLIST, 'C', FVIRTKEY|FCONTROL|FNOINVERT, _T("Close")));
  763. ADDCMD((ID_FILE_PROPERTIES, VK_F10, FVIRTKEY|FSHIFT|FNOINVERT, _T("Properties")));
  764. ADDCMD((ID_FILE_EXIT, 'X', FVIRTKEY|FALT|FNOINVERT, _T("Exit")));
  765. ADDCMD((ID_PLAY_PLAYPAUSE, VK_SPACE, FVIRTKEY|FNOINVERT, _T("Play/Pause"), APPCOMMAND_MEDIA_PLAY_PAUSE, wmcmd::LDOWN));
  766. ADDCMD((ID_PLAY_PLAY, 0, FVIRTKEY|FNOINVERT, _T("Play")));
  767. ADDCMD((ID_PLAY_PAUSE, 0, FVIRTKEY|FNOINVERT, _T("Pause")));
  768. ADDCMD((ID_PLAY_STOP, VK_OEM_PERIOD, FVIRTKEY|FNOINVERT, _T("Stop"), APPCOMMAND_MEDIA_STOP));
  769. ADDCMD((ID_PLAY_FRAMESTEP, VK_RIGHT, FVIRTKEY|FNOINVERT, _T("Framestep")));
  770. ADDCMD((ID_PLAY_FRAMESTEPCANCEL, VK_LEFT, FVIRTKEY|FNOINVERT, _T("Framestep back")));
  771. ADDCMD((ID_PLAY_GOTO, 'G', FVIRTKEY|FCONTROL|FNOINVERT, _T("Go To")));
  772. ADDCMD((ID_PLAY_INCRATE, VK_UP, FVIRTKEY|FCONTROL|FNOINVERT, _T("Increase Rate")));
  773. ADDCMD((ID_PLAY_DECRATE, VK_DOWN, FVIRTKEY|FCONTROL|FNOINVERT, _T("Decrease Rate")));
  774. ADDCMD((ID_PLAY_RESETRATE, 'R', FVIRTKEY|FCONTROL|FNOINVERT, _T("Reset Rate")));
  775. ADDCMD((ID_PLAY_INCAUDDELAY, VK_ADD, FVIRTKEY|FNOINVERT, _T("Audio Delay +10ms")));
  776. ADDCMD((ID_PLAY_DECAUDDELAY, VK_SUBTRACT, FVIRTKEY|FNOINVERT, _T("Audio Delay -10ms")));
  777. ADDCMD((ID_PLAY_SEEKFORWARDSMALL, 0, FVIRTKEY|FNOINVERT, _T("Jump Forward (small)")));
  778. ADDCMD((ID_PLAY_SEEKBACKWARDSMALL, 0, FVIRTKEY|FNOINVERT, _T("Jump Backward (small)")));
  779. ADDCMD((ID_PLAY_SEEKFORWARDMED, VK_RIGHT, FVIRTKEY|FCONTROL|FNOINVERT, _T("Jump Forward (medium)")));
  780. ADDCMD((ID_PLAY_SEEKBACKWARDMED, VK_LEFT, FVIRTKEY|FCONTROL|FNOINVERT, _T("Jump Backward (medium)")));
  781. ADDCMD((ID_PLAY_SEEKFORWARDLARGE, 0, FVIRTKEY|FNOINVERT, _T("Jump Forward (large)")));
  782. ADDCMD((ID_PLAY_SEEKBACKWARDLARGE, 0, FVIRTKEY|FNOINVERT, _T("Jump Backward (large)")));
  783. ADDCMD((ID_PLAY_SEEKKEYFORWARD, VK_RIGHT, FVIRTKEY|FSHIFT|FNOINVERT, _T("Jump Forward (keyframe)")));
  784. ADDCMD((ID_PLAY_SEEKKEYBACKWARD, VK_LEFT, FVIRTKEY|FSHIFT|FNOINVERT, _T("Jump Backward (keyframe)")));
  785. ADDCMD((ID_NAVIGATE_SKIPFORWARD, VK_NEXT, FVIRTKEY|FNOINVERT, _T("Next"), APPCOMMAND_MEDIA_NEXTTRACK, wmcmd::X2DOWN));
  786. ADDCMD((ID_NAVIGATE_SKIPBACK, VK_PRIOR, FVIRTKEY|FNOINVERT, _T("Previous"), APPCOMMAND_MEDIA_PREVIOUSTRACK, wmcmd::X1DOWN));
  787. ADDCMD((ID_NAVIGATE_SKIPFORWARDPLITEM, VK_NEXT, FVIRTKEY|FCONTROL|FNOINVERT, _T("Next Playlist Item")));
  788. ADDCMD((ID_NAVIGATE_SKIPBACKPLITEM, VK_PRIOR, FVIRTKEY|FCONTROL|FNOINVERT, _T("Previous Playlist Item")));
  789. ADDCMD((ID_VIEW_CAPTIONMENU, '0', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Caption&Menu")));
  790. ADDCMD((ID_VIEW_SEEKER, '1', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Seeker")));
  791. ADDCMD((ID_VIEW_CONTROLS, '2', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Controls")));
  792. ADDCMD((ID_VIEW_INFORMATION, '3', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Information")));
  793. ADDCMD((ID_VIEW_STATISTICS, '4', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Statistics")));
  794. ADDCMD((ID_VIEW_STATUS, '5', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Status")));
  795. ADDCMD((ID_VIEW_SUBRESYNC, '6', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Subresync Bar")));
  796. ADDCMD((ID_VIEW_PLAYLIST, '7', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Playlist Bar")));
  797. ADDCMD((ID_VIEW_CAPTURE, '8', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Capture Bar")));
  798. ADDCMD((ID_VIEW_SHADEREDITOR, '9', FVIRTKEY|FCONTROL|FNOINVERT, _T("Toggle Shader Editor Bar")));
  799. ADDCMD((ID_VIEW_PRESETS_MINIMAL, '1', FVIRTKEY|FNOINVERT, _T("View Minimal")));
  800. ADDCMD((ID_VIEW_PRESETS_COMPACT, '2', FVIRTKEY|FNOINVERT, _T("View Compact")));
  801. ADDCMD((ID_VIEW_PRESETS_NORMAL, '3', FVIRTKEY|FNOINVERT, _T("View Normal")));
  802. ADDCMD((ID_VIEW_FULLSCREEN, VK_RETURN, FVIRTKEY|FALT|FNOINVERT, _T("Fullscreen"), 0, wmcmd::LDBLCLK));
  803. ADDCMD((ID_VIEW_FULLSCREEN_SECONDARY, VK_RETURN, FVIRTKEY|FCONTROL|FNOINVERT, _T("Fullscreen (w/o res.change)")));
  804. ADDCMD((ID_VIEW_ZOOM_50, '1', FVIRTKEY|FALT|FNOINVERT, _T("Zoom 50%")));
  805. ADDCMD((ID_VIEW_ZOOM_100, '2', FVIRTKEY|FALT|FNOINVERT, _T("Zoom 100%")));
  806. ADDCMD((ID_VIEW_ZOOM_200, '3', FVIRTKEY|FALT|FNOINVERT, _T("Zoom 200%")));
  807. ADDCMD((ID_VIEW_ZOOM_AUTOFIT, '4', FVIRTKEY|FALT|FNOINVERT, _T("Zoom Auto Fit")));
  808. ADDCMD((ID_ASPECTRATIO_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next AR Preset")));
  809. ADDCMD((ID_VIEW_VF_HALF, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Half")));
  810. ADDCMD((ID_VIEW_VF_NORMAL, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Normal")));
  811. ADDCMD((ID_VIEW_VF_DOUBLE, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Double")));
  812. ADDCMD((ID_VIEW_VF_STRETCH, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Stretch")));
  813. ADDCMD((ID_VIEW_VF_FROMINSIDE, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Inside")));
  814. ADDCMD((ID_VIEW_VF_FROMOUTSIDE, 0, FVIRTKEY|FNOINVERT, _T("VidFrm Outside")));
  815. ADDCMD((ID_ONTOP_ALWAYS, 'T', FVIRTKEY|FCONTROL|FNOINVERT, _T("Always On Top")));
  816. ADDCMD((ID_VIEW_RESET, VK_NUMPAD5, FVIRTKEY|FNOINVERT, _T("PnS Reset")));
  817. ADDCMD((ID_VIEW_INCSIZE, VK_NUMPAD9, FVIRTKEY|FNOINVERT, _T("PnS Inc Size")));
  818. ADDCMD((ID_VIEW_INCWIDTH, VK_NUMPAD6, FVIRTKEY|FNOINVERT, _T("PnS Inc Width")));
  819. ADDCMD((ID_VIEW_INCHEIGHT, VK_NUMPAD8, FVIRTKEY|FNOINVERT, _T("PnS Inc Height")));
  820. ADDCMD((ID_VIEW_DECSIZE, VK_NUMPAD1, FVIRTKEY|FNOINVERT, _T("PnS Dec Size")));
  821. ADDCMD((ID_VIEW_DECWIDTH, VK_NUMPAD4, FVIRTKEY|FNOINVERT, _T("PnS Dec Width")));
  822. ADDCMD((ID_VIEW_DECHEIGHT, VK_NUMPAD2, FVIRTKEY|FNOINVERT, _T("PnS Dec Height")));
  823. ADDCMD((ID_PANSCAN_CENTER, VK_NUMPAD5, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Center")));
  824. ADDCMD((ID_PANSCAN_MOVELEFT, VK_NUMPAD4, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Left")));
  825. ADDCMD((ID_PANSCAN_MOVERIGHT, VK_NUMPAD6, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Right")));
  826. ADDCMD((ID_PANSCAN_MOVEUP, VK_NUMPAD8, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Up")));
  827. ADDCMD((ID_PANSCAN_MOVEDOWN, VK_NUMPAD2, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Down")));
  828. ADDCMD((ID_PANSCAN_MOVEUPLEFT, VK_NUMPAD7, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Up/Left")));
  829. ADDCMD((ID_PANSCAN_MOVEUPRIGHT, VK_NUMPAD9, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Up/Right")));
  830. ADDCMD((ID_PANSCAN_MOVEDOWNLEFT, VK_NUMPAD1, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Down/Left")));
  831. ADDCMD((ID_PANSCAN_MOVEDOWNRIGHT, VK_NUMPAD3, FVIRTKEY|FCONTROL|FNOINVERT, _T("PnS Down/Right")));
  832. ADDCMD((ID_PANSCAN_ROTATEXP, VK_NUMPAD8, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate X+")));
  833. ADDCMD((ID_PANSCAN_ROTATEXM, VK_NUMPAD2, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate X-")));
  834. ADDCMD((ID_PANSCAN_ROTATEYP, VK_NUMPAD4, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Y+")));
  835. ADDCMD((ID_PANSCAN_ROTATEYM, VK_NUMPAD6, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Y-")));
  836. ADDCMD((ID_PANSCAN_ROTATEZP, VK_NUMPAD1, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Z+")));
  837. ADDCMD((ID_PANSCAN_ROTATEZM, VK_NUMPAD3, FVIRTKEY|FALT|FNOINVERT, _T("PnS Rotate Z-")));
  838. ADDCMD((ID_VOLUME_UP, VK_UP, FVIRTKEY|FNOINVERT, _T("Volume Up"), APPCOMMAND_VOLUME_UP, wmcmd::WUP));
  839. ADDCMD((ID_VOLUME_DOWN, VK_DOWN, FVIRTKEY|FNOINVERT, _T("Volume Down"), APPCOMMAND_VOLUME_DOWN, wmcmd::WDOWN));
  840. ADDCMD((ID_VOLUME_MUTE, 'M', FVIRTKEY|FCONTROL|FNOINVERT, _T("Volume Mute"), APPCOMMAND_VOLUME_MUTE));
  841. ADDCMD((ID_VOLUME_BOOST_INC, 0, FVIRTKEY|FNOINVERT, _T("Volume Boost Increase")));
  842. ADDCMD((ID_VOLUME_BOOST_DEC, 0, FVIRTKEY|FNOINVERT, _T("Volume Boost Decrease")));
  843. ADDCMD((ID_VOLUME_BOOST_MIN, 0, FVIRTKEY|FNOINVERT, _T("Volume Boost Min")));
  844. ADDCMD((ID_VOLUME_BOOST_MAX, 0, FVIRTKEY|FNOINVERT, _T("Volume Boost Max")));
  845. ADDCMD((ID_NAVIGATE_TITLEMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Title Menu")));
  846. ADDCMD((ID_NAVIGATE_ROOTMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Root Menu")));
  847. ADDCMD((ID_NAVIGATE_SUBPICTUREMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Subtitle Menu")));
  848. ADDCMD((ID_NAVIGATE_AUDIOMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Audio Menu")));
  849. ADDCMD((ID_NAVIGATE_ANGLEMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Angle Menu")));
  850. ADDCMD((ID_NAVIGATE_CHAPTERMENU, 0, FVIRTKEY|FNOINVERT, _T("DVD Chapter Menu")));
  851. ADDCMD((ID_NAVIGATE_MENU_LEFT, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Left")));
  852. ADDCMD((ID_NAVIGATE_MENU_RIGHT, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Right")));
  853. ADDCMD((ID_NAVIGATE_MENU_UP, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Up")));
  854. ADDCMD((ID_NAVIGATE_MENU_DOWN, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Down")));
  855. ADDCMD((ID_NAVIGATE_MENU_ACTIVATE, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Activate")));
  856. ADDCMD((ID_NAVIGATE_MENU_BACK, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Back")));
  857. ADDCMD((ID_NAVIGATE_MENU_LEAVE, 0, FVIRTKEY|FNOINVERT, _T("DVD Menu Leave")));
  858. ADDCMD((ID_BOSS, 'B', FVIRTKEY|FNOINVERT, _T("Boss key")));
  859. ADDCMD((ID_MENU_PLAYER_SHORT, 0, FVIRTKEY|FNOINVERT, _T("Player Menu (short)"), 0, wmcmd::RUP));
  860. ADDCMD((ID_MENU_PLAYER_LONG, 0, FVIRTKEY|FNOINVERT, _T("Player Menu (long)")));
  861. ADDCMD((ID_MENU_FILTERS, 0, FVIRTKEY|FNOINVERT, _T("Filters Menu")));
  862. ADDCMD((ID_VIEW_OPTIONS, 'O', FVIRTKEY|FNOINVERT, _T("Options")));
  863. ADDCMD((ID_STREAM_AUDIO_NEXT, 'A', FVIRTKEY|FNOINVERT, _T("Next Audio")));
  864. ADDCMD((ID_STREAM_AUDIO_PREV, 'A', FVIRTKEY|FSHIFT|FNOINVERT, _T("Prev Audio")));
  865. ADDCMD((ID_STREAM_SUB_NEXT, 'S', FVIRTKEY|FNOINVERT, _T("Next Subtitle")));
  866. ADDCMD((ID_STREAM_SUB_PREV, 'S', FVIRTKEY|FSHIFT|FNOINVERT, _T("Prev Subtitle")));
  867. ADDCMD((ID_STREAM_SUB_ONOFF, 'W', FVIRTKEY|FNOINVERT, _T("On/Off Subtitle")));
  868. ADDCMD((ID_SUBTITLES_SUBITEM_START+2, 0, FVIRTKEY|FNOINVERT, _T("Reload Subtitles")));
  869. ADDCMD((ID_OGM_AUDIO_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Audio (OGM)")));
  870. ADDCMD((ID_OGM_AUDIO_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Audio (OGM)")));
  871. ADDCMD((ID_OGM_SUB_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Subtitle (OGM)")));
  872. ADDCMD((ID_OGM_SUB_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Subtitle (OGM)")));
  873. ADDCMD((ID_DVD_ANGLE_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Angle (DVD)")));
  874. ADDCMD((ID_DVD_ANGLE_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Angle (DVD)")));
  875. ADDCMD((ID_DVD_AUDIO_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Audio (DVD)")));
  876. ADDCMD((ID_DVD_AUDIO_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Audio (DVD)")));
  877. ADDCMD((ID_DVD_SUB_NEXT, 0, FVIRTKEY|FNOINVERT, _T("Next Subtitle (DVD)")));
  878. ADDCMD((ID_DVD_SUB_PREV, 0, FVIRTKEY|FNOINVERT, _T("Prev Subtitle (DVD)")));
  879. ADDCMD((ID_DVD_SUB_ONOFF, 0, FVIRTKEY|FNOINVERT, _T("On/Off Subtitle (DVD)")));
  880. #undef ADDCMD
  881. }
  882. CMPlayerCApp::Settings::~Settings()
  883. {
  884. if(hAccel)
  885. DestroyAcceleratorTable(hAccel);
  886. }
  887. void CMPlayerCApp::Settings::UpdateData(bool fSave)
  888. {
  889. CWinApp* pApp = AfxGetApp();
  890. ASSERT(pApp);
  891. UINT len;
  892. BYTE* ptr = NULL;
  893. if(fSave)
  894. {
  895. if(!fInitialized) return;
  896. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECAPTIONMENU), fHideCaptionMenu);
  897. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CONTROLSTATE), nCS);
  898. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DEFAULTVIDEOFRAME), iDefaultVideoSize);
  899. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPASPECTRATIO), fKeepAspectRatio);
  900. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_COMPMONDESKARDIFF), fCompMonDeskARDiff);
  901. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VOLUME), nVolume);
  902. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_BALANCE), nBalance);
  903. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MUTE), fMute);
  904. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOPNUM), nLoops);
  905. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOP), fLoopForever);
  906. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REWIND), fRewind);
  907. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ZOOM), iZoomLevel);
  908. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MULTIINST), fAllowMultipleInst);
  909. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TITLEBARTEXTSTYLE), iTitleBarTextStyle);
  910. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TITLEBARTEXTTITLE), fTitleBarTextTitle);
  911. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ONTOP), iOnTop);
  912. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TRAYICON), fTrayIcon);
  913. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOZOOM), fRememberZoomLevel);
  914. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLS), fShowBarsWhenFullScreen);
  915. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLSTIMEOUT), nShowBarsWhenFullScreenTimeOut);
  916. pApp->WriteProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENRES), (BYTE*)&dmFullscreenRes, sizeof(dmFullscreenRes));
  917. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_EXITFULLSCREENATTHEEND), fExitFullScreenAtTheEnd);
  918. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWPOS), fRememberWindowPos);
  919. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWSIZE), fRememberWindowSize);
  920. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPTODESKTOPEDGES), fSnapToDesktopEdges);
  921. pApp->WriteProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWRECT), (BYTE*)&rcLastWindowPos, sizeof(rcLastWindowPos));
  922. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWTYPE), lastWindowType);
  923. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_X), AspectRatio.cx);
  924. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_Y), AspectRatio.cy);
  925. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPHISTORY), fKeepHistory);
  926. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DSVIDEORENDERERTYPE), iDSVideoRendererType);
  927. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_RMVIDEORENDERERTYPE), iRMVideoRendererType);
  928. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QTVIDEORENDERERTYPE), iQTVideoRendererType);
  929. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_APSURACEFUSAGE), iAPSurfaceUsage);
  930. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMRSYNCFIX), fVMRSyncFix);
  931. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DX9_RESIZER), iDX9Resizer);
  932. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMR9MIXERMODE), fVMR9MixerMode);
  933. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMR9MIXERYUV), fVMR9MixerYUV);
  934. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIORENDERERTYPE), CString(AudioRendererDisplayName));
  935. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADAUDIO), fAutoloadAudio);
  936. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADSUBTITLES), fAutoloadSubtitles);
  937. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWORKERTHREADFOROPENING), fEnableWorkerThreadForOpening);
  938. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REPORTFAILEDPINS), fReportFailedPins);
  939. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DVDPATH), sDVDPath);
  940. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEDVDPATH), fUseDVDPath);
  941. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MENULANG), idMenuLang);
  942. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOLANG), idAudioLang);
  943. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SUBTITLESLANG), idSubtitlesLang);
  944. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOSPEAKERCONF), fAutoSpeakerConf);
  945. CString style;
  946. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPLOGFONT), style <<= subdefstyle);
  947. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPOVERRIDEPLACEMENT), fOverridePlacement);
  948. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPHORPOS), nHorPos);
  949. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPVERPOS), nVerPos);
  950. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCSIZE), nSPCSize);
  951. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCMAXRES), nSPCMaxRes);
  952. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_POW2TEX), fSPCPow2Tex);
  953. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLESUBTITLES), fEnableSubtitles);
  954. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOSWITCHER), fEnableAudioSwitcher);
  955. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOTIMESHIFT), fAudioTimeShift);
  956. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOTIMESHIFT), tAudioTimeShift);
  957. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DOWNSAMPLETO441), fDownSampleTo441);
  958. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CUSTOMCHANNELMAPPING), fCustomChannelMapping);
  959. pApp->WriteProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPEAKERTOCHANNELMAPPING), (BYTE*)pSpeakerToChannelMap, sizeof(pSpeakerToChannelMap));
  960. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIONORMALIZE), fAudioNormalize);
  961. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIONORMALIZERECOVER), fAudioNormalizeRecover);
  962. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOBOOST), (int)AudioBoost);
  963. {
  964. for(int i = 0; ; i++)
  965. {
  966. CString key;
  967. key.Format(_T("%s\%04d"), ResStr(IDS_R_FILTERS), i);
  968. int j = pApp->GetProfileInt(key, _T("Enabled"), -1); 
  969. pApp->WriteProfileString(key, NULL, NULL);
  970. if(j < 0) break;
  971. }
  972. pApp->WriteProfileString(ResStr(IDS_R_FILTERS), NULL, NULL);
  973. POSITION pos = filters.GetHeadPosition();
  974. for(int i = 0; pos; i++)
  975. {
  976. FilterOverride* f = filters.GetNext(pos);
  977. if(f->fTemporary)
  978. continue;
  979. CString key;
  980. key.Format(_T("%s\%04d"), ResStr(IDS_R_FILTERS), i);
  981. pApp->WriteProfileInt(key, _T("SourceType"), (int)f->type);
  982. pApp->WriteProfileInt(key, _T("Enabled"), (int)!f->fDisabled);
  983. if(f->type == FilterOverride::REGISTERED)
  984. {
  985. pApp->WriteProfileString(key, _T("DisplayName"), CString(f->dispname));
  986. pApp->WriteProfileString(key, _T("Name"), f->name);
  987. }
  988. else if(f->type == FilterOverride::EXTERNAL)
  989. {
  990. pApp->WriteProfileString(key, _T("Path"), f->path);
  991. pApp->WriteProfileString(key, _T("Name"), f->name);
  992. pApp->WriteProfileString(key, _T("CLSID"), CStringFromGUID(f->clsid));
  993. }
  994. POSITION pos2 = f->backup.GetHeadPosition();
  995. for(int i = 0; pos2; i++)
  996. {
  997. CString val;
  998. val.Format(_T("org%04d"), i);
  999. pApp->WriteProfileString(key, val, CStringFromGUID(f->backup.GetNext(pos2)));
  1000. }
  1001. pos2 = f->guids.GetHeadPosition();
  1002. for(int i = 0; pos2; i++)
  1003. {
  1004. CString val;
  1005. val.Format(_T("mod%04d"), i);
  1006. pApp->WriteProfileString(key, val, CStringFromGUID(f->guids.GetNext(pos2)));
  1007. }
  1008. pApp->WriteProfileInt(key, _T("LoadType"), f->iLoadType);
  1009. pApp->WriteProfileInt(key, _T("Merit"), f->dwMerit);
  1010. }
  1011. }
  1012. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_INTREALMEDIA), fIntRealMedia);
  1013. // pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIARENDERLESS), fRealMediaRenderless);
  1014. // pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QUICKTIMERENDERER), iQuickTimeRenderer);
  1015. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIAFPS), *((DWORD*)&RealMediaQuickTimeFPS));
  1016. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS) + _T("\") + ResStr(IDS_RS_PNSPRESETS), NULL, NULL);
  1017. for(int i = 0, j = m_pnspresets.GetCount(); i < j; i++)
  1018. {
  1019. CString str;
  1020. str.Format(_T("Preset%d"), i);
  1021. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS) + _T("\") + ResStr(IDS_RS_PNSPRESETS), str, m_pnspresets[i]);
  1022. }
  1023. pApp->WriteProfileString(ResStr(IDS_R_COMMANDS), NULL, NULL);
  1024. POSITION pos = wmcmds.GetHeadPosition();
  1025. for(int i = 0; pos; )
  1026. {
  1027. wmcmd& wc = wmcmds.GetNext(pos);
  1028. if(wc.IsModified())
  1029. {
  1030. CString str;
  1031. str.Format(_T("CommandMod%d"), i);
  1032. CString str2;
  1033. str2.Format(_T("%d %x %x %s %d %d %d"), 
  1034. wc.cmd, wc.fVirt, wc.key, 
  1035. _T(""") + CString(wc.rmcmd) +  _T("""), wc.rmrepcnt,
  1036. wc.mouse, wc.appcmd);
  1037. pApp->WriteProfileString(ResStr(IDS_R_COMMANDS), str, str2);
  1038. i++;
  1039. }
  1040. }
  1041. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRC), fWinLirc);
  1042. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRCADDR), WinLircAddr);
  1043. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICE), fUIce);
  1044. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICEADDR), UIceAddr);
  1045. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DISABLEXPTOOLBARS), fDisabeXPToolbars);
  1046. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEWMASFREADER), fUseWMASFReader);
  1047. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTS), nJumpDistS);
  1048. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTM), nJumpDistM);
  1049. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTL), nJumpDistL);
  1050. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FREEWINDOWRESIZING), fFreeWindowResizing);
  1051. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_NOTIFYMSN), fNotifyMSN);
  1052. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_NOTIFYGTSDLL), fNotifyGTSdll);
  1053. Formats.UpdateData(true);
  1054. pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_SRCFILTERS), SrcFilters|~(SRC_LAST-1));
  1055. pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_TRAFILTERS), TraFilters|~(TRA_LAST-1));
  1056. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOFILE), logofn);
  1057. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOID), logoid);
  1058. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOEXT), logoext);
  1059. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECDROMSSUBMENU), fHideCDROMsSubMenu);
  1060. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_PRIORITY), priority);
  1061. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LAUNCHFULLSCREEN), launchfullscreen);
  1062. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWEBSERVER), fEnableWebServer);
  1063. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPORT), nWebServerPort);
  1064. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPRINTDEBUGINFO), fWebServerPrintDebugInfo);
  1065. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERUSECOMPRESSION), fWebServerUseCompression);
  1066. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERLOCALHOSTONLY), fWebServerLocalhostOnly);
  1067. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBROOT), WebRoot);
  1068. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBDEFINDEX), WebDefIndex);
  1069. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERCGI), WebServerCGI);
  1070. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTPATH), SnapShotPath);
  1071. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTEXT), SnapShotExt);
  1072. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_THUMBROWS), ThumbRows);
  1073. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_THUMBCOLS), ThumbCols);
  1074. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_THUMBWIDTH), ThumbWidth);
  1075. pApp->WriteProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ISDB), ISDb);
  1076. pApp->WriteProfileString(_T("Shaders"), NULL, NULL);
  1077. pApp->WriteProfileInt(_T("Shaders"), _T("Initialized"), 1);
  1078. pApp->WriteProfileString(_T("Shaders"), _T("Combine"), m_shadercombine);
  1079. pos = m_shaders.GetHeadPosition();
  1080. for(int i = 0; pos; i++)
  1081. {
  1082. const Shader& s = m_shaders.GetNext(pos);
  1083. if(!s.label.IsEmpty())
  1084. {
  1085. CString index;
  1086. index.Format(_T("%d"), i);
  1087. CString srcdata = s.srcdata;
  1088. srcdata.Replace(_T("r"), _T(""));
  1089. srcdata.Replace(_T("n"), _T("\n"));
  1090. srcdata.Replace(_T("t"), _T("\t"));
  1091. AfxGetApp()->WriteProfileString(_T("Shaders"), index, s.label + _T("|") + s.target + _T("|") + srcdata);
  1092. }
  1093. }
  1094. if(pApp->m_pszRegistryKey)
  1095. {
  1096. // WINBUG: on win2k this would crash WritePrivateProfileString
  1097. pApp->WriteProfileInt(_T(""), _T(""), pApp->GetProfileInt(_T(""), _T(""), 0)?0:1);
  1098. }
  1099. }
  1100. else
  1101. {
  1102. if(fInitialized) return;
  1103. if(pApp->m_pszRegistryKey)
  1104. {
  1105. CRegKey appkey, settingskey;
  1106. appkey.Attach(pApp->GetAppRegistryKey());
  1107. settingskey.Attach(pApp->GetSectionKey(ResStr(IDS_R_INTERNAL_FILTERS)));
  1108. if(appkey && settingskey)
  1109. {
  1110. ULONGLONG ftapp = 0, ftsettings = 0;
  1111. RegQueryInfoKey(appkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, (FILETIME*)&ftapp);
  1112. RegQueryInfoKey(settingskey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, (FILETIME*)&ftsettings);
  1113. if(ftapp < ftsettings)
  1114. {
  1115. pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_SRCFILTERS), ~0);
  1116. pApp->WriteProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_TRAFILTERS), ~0^TRA_MPEG1);
  1117. }
  1118. }
  1119. }
  1120. OSVERSIONINFO vi;
  1121. vi.dwOSVersionInfoSize = sizeof(vi);
  1122. GetVersionEx(&vi);
  1123. fXpOrBetter = (vi.dwMajorVersion >= 5 && vi.dwMinorVersion >= 1 || vi.dwMajorVersion >= 6);
  1124. iDXVer = 0;
  1125. CRegKey dxver;
  1126. if(ERROR_SUCCESS == dxver.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\Microsoft\DirectX"), KEY_READ))
  1127. {
  1128. CString str;
  1129. ULONG len = 64;
  1130. if(ERROR_SUCCESS == dxver.QueryStringValue(_T("Version"), str.GetBuffer(len), &len))
  1131. {
  1132. str.ReleaseBuffer(len);
  1133. int ver[4];
  1134. _stscanf(str, _T("%d.%d.%d.%d"), ver+0, ver+1, ver+2, ver+3);
  1135. iDXVer = ver[1];
  1136. }
  1137. }
  1138. fHideCaptionMenu = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECAPTIONMENU), 0);
  1139. nCS = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CONTROLSTATE), CS_SEEKBAR|CS_TOOLBAR|CS_INFOBAR|CS_STATUSBAR);
  1140. iDefaultVideoSize = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DEFAULTVIDEOFRAME), DVS_FROMINSIDE);
  1141. fKeepAspectRatio = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPASPECTRATIO), TRUE);
  1142. fCompMonDeskARDiff = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_COMPMONDESKARDIFF), FALSE);
  1143. nVolume = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VOLUME), 100);
  1144. nBalance = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_BALANCE), 0);
  1145. fMute = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MUTE), 0);
  1146. nLoops = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOPNUM), 1);
  1147. fLoopForever = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOOP), 1);
  1148. fRewind = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REWIND), TRUE);
  1149. iZoomLevel = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ZOOM), 1);
  1150. iDSVideoRendererType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DSVIDEORENDERERTYPE), VIDRNDT_DS_DEFAULT);
  1151. iRMVideoRendererType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_RMVIDEORENDERERTYPE), VIDRNDT_RM_DEFAULT);
  1152. iQTVideoRendererType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QTVIDEORENDERERTYPE), VIDRNDT_QT_DEFAULT);
  1153. iAPSurfaceUsage = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_APSURACEFUSAGE), VIDRNDT_AP_TEXTURE2D);
  1154. fVMRSyncFix = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMRSYNCFIX), FALSE);
  1155. iDX9Resizer = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DX9_RESIZER), 1);
  1156. fVMR9MixerMode = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMR9MIXERMODE), FALSE);
  1157. fVMR9MixerYUV = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_VMR9MIXERYUV), FALSE);
  1158. AudioRendererDisplayName = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIORENDERERTYPE), _T(""));
  1159. fAutoloadAudio = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADAUDIO), TRUE);
  1160. fAutoloadSubtitles = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOLOADSUBTITLES), TRUE);
  1161. fEnableWorkerThreadForOpening = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWORKERTHREADFOROPENING), TRUE);
  1162. fReportFailedPins = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REPORTFAILEDPINS), TRUE);
  1163. fAllowMultipleInst = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MULTIINST), 0);
  1164. iTitleBarTextStyle = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TITLEBARTEXTSTYLE), 1);
  1165. fTitleBarTextTitle = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TITLEBARTEXTTITLE), FALSE);
  1166. iOnTop = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ONTOP), 0);
  1167. fTrayIcon = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_TRAYICON), 0);
  1168. fRememberZoomLevel = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOZOOM), 1);
  1169. fShowBarsWhenFullScreen = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLS), 1);
  1170. nShowBarsWhenFullScreenTimeOut = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENCTRLSTIMEOUT), 0);
  1171. if(pApp->GetProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FULLSCREENRES), &ptr, &len))
  1172. {
  1173. memcpy(&dmFullscreenRes, ptr, sizeof(dmFullscreenRes));
  1174. delete [] ptr;
  1175. }
  1176. else
  1177. {
  1178. dmFullscreenRes.fValid = false;
  1179. }
  1180. fExitFullScreenAtTheEnd = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_EXITFULLSCREENATTHEEND), 0);
  1181. fRememberWindowPos = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWPOS), 0);
  1182. fRememberWindowSize = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REMEMBERWINDOWSIZE), 0);
  1183. fSnapToDesktopEdges = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPTODESKTOPEDGES), 0);
  1184. AspectRatio.cx = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_X), 0);
  1185. AspectRatio.cy = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ASPECTRATIO_Y), 0);
  1186. fKeepHistory = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_KEEPHISTORY), 1);
  1187. if(pApp->GetProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWRECT), &ptr, &len))
  1188. {
  1189. memcpy(&rcLastWindowPos, ptr, sizeof(rcLastWindowPos));
  1190. delete [] ptr;
  1191. }
  1192. else
  1193. {
  1194. fRememberWindowPos = false;
  1195. }
  1196. lastWindowType = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LASTWINDOWTYPE), SIZE_RESTORED);
  1197. sDVDPath = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DVDPATH), _T(""));
  1198. fUseDVDPath = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEDVDPATH), 0);
  1199. idMenuLang = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_MENULANG), ::GetUserDefaultLCID());
  1200. idAudioLang = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOLANG), ::GetUserDefaultLCID());
  1201. idSubtitlesLang = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SUBTITLESLANG), ::GetUserDefaultLCID());
  1202. fAutoSpeakerConf = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUTOSPEAKERCONF), 1);
  1203. // TODO: rename subdefstyle -> defStyle, IDS_RS_SPLOGFONT -> IDS_RS_SPSTYLE
  1204. subdefstyle <<= pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPLOGFONT), _T(""));
  1205. fOverridePlacement = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPOVERRIDEPLACEMENT), 0);
  1206. nHorPos = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPHORPOS), 50);
  1207. nVerPos = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPVERPOS), 90);
  1208. nSPCSize = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCSIZE), 3);
  1209. nSPCMaxRes = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPCMAXRES), 2);
  1210. fSPCPow2Tex = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_POW2TEX), TRUE);
  1211. fEnableSubtitles = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLESUBTITLES), TRUE);
  1212. fEnableAudioSwitcher = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOSWITCHER), TRUE);
  1213. fAudioTimeShift = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEAUDIOTIMESHIFT), 0);
  1214. tAudioTimeShift = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOTIMESHIFT), 0);
  1215. fDownSampleTo441 = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DOWNSAMPLETO441), 0);
  1216. fCustomChannelMapping = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_CUSTOMCHANNELMAPPING), 0);
  1217. if(pApp->GetProfileBinary(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SPEAKERTOCHANNELMAPPING), &ptr, &len))
  1218. {
  1219. memcpy(pSpeakerToChannelMap, ptr, sizeof(pSpeakerToChannelMap));
  1220. delete [] ptr;
  1221. }
  1222. else
  1223. {
  1224. memset(pSpeakerToChannelMap, 0, sizeof(pSpeakerToChannelMap));
  1225. for(int j = 0; j < 18; j++)
  1226. for(int i = 0; i <= j; i++)
  1227. pSpeakerToChannelMap[j][i] = 1<<i;
  1228. pSpeakerToChannelMap[0][0] = 1<<0;
  1229. pSpeakerToChannelMap[0][1] = 1<<0;
  1230. pSpeakerToChannelMap[3][0] = 1<<0;
  1231. pSpeakerToChannelMap[3][1] = 1<<1;
  1232. pSpeakerToChannelMap[3][2] = 0;
  1233. pSpeakerToChannelMap[3][3] = 0;
  1234. pSpeakerToChannelMap[3][4] = 1<<2;
  1235. pSpeakerToChannelMap[3][5] = 1<<3;
  1236. pSpeakerToChannelMap[4][0] = 1<<0;
  1237. pSpeakerToChannelMap[4][1] = 1<<1;
  1238. pSpeakerToChannelMap[4][2] = 1<<2;
  1239. pSpeakerToChannelMap[4][3] = 0;
  1240. pSpeakerToChannelMap[4][4] = 1<<3;
  1241. pSpeakerToChannelMap[4][5] = 1<<4;
  1242. }
  1243. fAudioNormalize = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIONORMALIZE), FALSE);
  1244. fAudioNormalizeRecover = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIONORMALIZERECOVER), TRUE);
  1245. AudioBoost = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_AUDIOBOOST), 1);
  1246. {
  1247. for(int i = 0; ; i++)
  1248. {
  1249. CString key;
  1250. key.Format(_T("%s\%04d"), ResStr(IDS_R_FILTERS), i);
  1251. CAutoPtr<FilterOverride> f(new FilterOverride);
  1252. f->fDisabled = !pApp->GetProfileInt(key, _T("Enabled"), 0);
  1253. UINT j = pApp->GetProfileInt(key, _T("SourceType"), -1);
  1254. if(j == 0)
  1255. {
  1256. f->type = FilterOverride::REGISTERED;
  1257. f->dispname = CStringW(pApp->GetProfileString(key, _T("DisplayName"), _T("")));
  1258. f->name = pApp->GetProfileString(key, _T("Name"), _T(""));
  1259. }
  1260. else if(j == 1)
  1261. {
  1262. f->type = FilterOverride::EXTERNAL;
  1263. f->path = pApp->GetProfileString(key, _T("Path"), _T(""));
  1264. f->name = pApp->GetProfileString(key, _T("Name"), _T(""));
  1265. f->clsid = GUIDFromCString(pApp->GetProfileString(key, _T("CLSID"), _T("")));
  1266. }
  1267. else
  1268. {
  1269. pApp->WriteProfileString(key, NULL, 0);
  1270. break;
  1271. }
  1272. f->backup.RemoveAll();
  1273. for(int i = 0; ; i++)
  1274. {
  1275. CString val;
  1276. val.Format(_T("org%04d"), i);
  1277. CString guid = pApp->GetProfileString(key, val, _T(""));
  1278. if(guid.IsEmpty()) break;
  1279. f->backup.AddTail(GUIDFromCString(guid));
  1280. }
  1281. f->guids.RemoveAll();
  1282. for(int i = 0; ; i++)
  1283. {
  1284. CString val;
  1285. val.Format(_T("mod%04d"), i);
  1286. CString guid = pApp->GetProfileString(key, val, _T(""));
  1287. if(guid.IsEmpty()) break;
  1288. f->guids.AddTail(GUIDFromCString(guid));
  1289. }
  1290. f->iLoadType = (int)pApp->GetProfileInt(key, _T("LoadType"), -1);
  1291. if(f->iLoadType < 0) break;
  1292. f->dwMerit = pApp->GetProfileInt(key, _T("Merit"), MERIT_DO_NOT_USE+1);
  1293. filters.AddTail(f);
  1294. }
  1295. }
  1296. fIntRealMedia = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_INTREALMEDIA), 0);
  1297. //fRealMediaRenderless = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIARENDERLESS), 0);
  1298. //iQuickTimeRenderer = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_QUICKTIMERENDERER), 2);
  1299. RealMediaQuickTimeFPS = 25.0;
  1300. *((DWORD*)&RealMediaQuickTimeFPS) = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_REALMEDIAFPS), *((DWORD*)&RealMediaQuickTimeFPS));
  1301. m_pnspresets.RemoveAll();
  1302. for(int i = 0; i < (ID_PANNSCAN_PRESETS_END - ID_PANNSCAN_PRESETS_START); i++)
  1303. {
  1304. CString str;
  1305. str.Format(_T("Preset%d"), i);
  1306. str = pApp->GetProfileString(ResStr(IDS_R_SETTINGS) + _T("\") + ResStr(IDS_RS_PNSPRESETS), str, _T(""));
  1307. if(str.IsEmpty()) break;
  1308. m_pnspresets.Add(str);
  1309. }
  1310. if(m_pnspresets.IsEmpty())
  1311. {
  1312. double _4p3 = 4.0/3.0;
  1313. double _16p9 = 16.0/9.0;
  1314. double _185p1 = 1.85/1.0;
  1315. double _235p1 = 2.35/1.0;
  1316. CString str;
  1317. str.Format(_T("Scale to 16:9 TV,%.3f,%.3f,%.3f,%.3f"), 0.5, 0.5, _4p3/_4p3, _16p9/_4p3);
  1318. m_pnspresets.Add(str);
  1319. str.Format(_T("Zoom To Widescreen,%.3f,%.3f,%.3f,%.3f"), 0.5, 0.5, _16p9/_4p3, _16p9/_4p3);
  1320. m_pnspresets.Add(str);
  1321. str.Format(_T("Zoom To Ultra-Widescreen,%.3f,%.3f,%.3f,%.3f"), 0.5, 0.5, _235p1/_4p3, _235p1/_4p3);
  1322. m_pnspresets.Add(str);
  1323. }
  1324. for(int i = 0; i < wmcmds.GetCount(); i++)
  1325. {
  1326. CString str;
  1327. str.Format(_T("CommandMod%d"), i);
  1328. str = pApp->GetProfileString(ResStr(IDS_R_COMMANDS), str, _T(""));
  1329. if(str.IsEmpty()) break;
  1330. int cmd, fVirt, key, repcnt, mouse, appcmd;
  1331. TCHAR buff[128];
  1332. int n;
  1333. if(5 > (n = _stscanf(str, _T("%d %x %x %s %d %d %d"), &cmd, &fVirt, &key, buff, &repcnt, &mouse, &appcmd)))
  1334. break;
  1335. if(POSITION pos = wmcmds.Find(cmd))
  1336. {
  1337. wmcmd& wc = wmcmds.GetAt(pos);
  1338.                 wc.cmd = cmd;
  1339. wc.fVirt = fVirt;
  1340. wc.key = key;
  1341. if(n >= 6) wc.mouse = (UINT)mouse;
  1342. if(n >= 7) wc.appcmd = (UINT)appcmd;
  1343. wc.rmcmd = CStringA(buff).Trim('"');
  1344. wc.rmrepcnt = repcnt;
  1345. }
  1346. }
  1347. CAtlArray<ACCEL> pAccel;
  1348. pAccel.SetCount(wmcmds.GetCount());
  1349. POSITION pos = wmcmds.GetHeadPosition();
  1350. for(int i = 0; pos; i++) pAccel[i] = wmcmds.GetNext(pos);
  1351. hAccel = CreateAcceleratorTable(pAccel.GetData(), pAccel.GetCount());
  1352. WinLircAddr = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRCADDR), _T("127.0.0.1:8765"));
  1353. fWinLirc = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WINLIRC), 0);
  1354. UIceAddr = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICEADDR), _T("127.0.0.1:1234"));
  1355. fUIce = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_UICE), 0);
  1356. fDisabeXPToolbars = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_DISABLEXPTOOLBARS), 0);
  1357. fUseWMASFReader = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_USEWMASFREADER), TRUE);
  1358. nJumpDistS = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTS), 1000);
  1359. nJumpDistM = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTM), 5000);
  1360. nJumpDistL = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_JUMPDISTL), 20000);
  1361. fFreeWindowResizing = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_FREEWINDOWRESIZING), TRUE);
  1362. fNotifyMSN = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_NOTIFYMSN), FALSE);
  1363. fNotifyGTSdll = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_NOTIFYGTSDLL), FALSE);
  1364. Formats.UpdateData(false);
  1365. SrcFilters = pApp->GetProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_SRCFILTERS), ~0);
  1366. TraFilters = pApp->GetProfileInt(ResStr(IDS_R_INTERNAL_FILTERS), ResStr(IDS_RS_TRAFILTERS), ~0^TRA_MPEG1);
  1367. logofn = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOFILE), _T(""));
  1368. logoid = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOID), IDF_LOGO7);
  1369. logoext = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LOGOEXT), 0);
  1370. fHideCDROMsSubMenu = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_HIDECDROMSSUBMENU), 0);
  1371. priority = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_PRIORITY), NORMAL_PRIORITY_CLASS);
  1372. ::SetPriorityClass(::GetCurrentProcess(), priority);
  1373. launchfullscreen = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_LAUNCHFULLSCREEN), FALSE);
  1374. fEnableWebServer = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ENABLEWEBSERVER), FALSE);
  1375. nWebServerPort = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPORT), 13579);
  1376. fWebServerPrintDebugInfo = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERPRINTDEBUGINFO), FALSE);
  1377. fWebServerUseCompression = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERUSECOMPRESSION), TRUE);
  1378. fWebServerLocalhostOnly = !!pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERLOCALHOSTONLY), TRUE);
  1379. WebRoot = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBROOT), _T("*./webroot"));
  1380. WebDefIndex = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBDEFINDEX), _T("index.html;index.php"));
  1381. WebServerCGI = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_WEBSERVERCGI), _T(""));
  1382. CString MyPictures;
  1383. CRegKey key;
  1384. // grrrrr
  1385. // if(!SHGetSpecialFolderPath(NULL, MyPictures.GetBufferSetLength(MAX_PATH), CSIDL_MYPICTURES, TRUE)) MyPictures.Empty();
  1386. // else MyPictures.ReleaseBuffer();
  1387. if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"), KEY_READ))
  1388. {
  1389. ULONG len = MAX_PATH;
  1390. if(ERROR_SUCCESS == key.QueryStringValue(_T("My Pictures"), MyPictures.GetBuffer(MAX_PATH), &len)) MyPictures.ReleaseBufferSetLength(len);
  1391. else MyPictures.Empty();
  1392. }
  1393. SnapShotPath = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTPATH), MyPictures);
  1394. SnapShotExt = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_SNAPSHOTEXT), _T(".bmp"));
  1395. ThumbRows = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_THUMBROWS), 4);
  1396. ThumbCols = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_THUMBCOLS), 4);
  1397. ThumbWidth = pApp->GetProfileInt(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_THUMBWIDTH), 1024);
  1398. ISDb = pApp->GetProfileString(ResStr(IDS_R_SETTINGS), ResStr(IDS_RS_ISDB), _T("isdb.go.dyndns.org"));
  1399. pApp->WriteProfileInt(ResStr(IDS_R_SETTINGS), _T("LastUsedPage"), 0);
  1400. //
  1401. m_shaders.RemoveAll();
  1402. CAtlStringMap<UINT> shaders;
  1403. shaders[_T("contour")] = IDF_SHADER_CONTOUR;
  1404. shaders[_T("deinterlace (blend)")] = IDF_SHADER_DEINTERLACE;
  1405. shaders[_T("emboss")] = IDF_SHADER_EMBOSS;
  1406. shaders[_T("grayscale")] = IDF_SHADER_GRAYSCALE;
  1407. shaders[_T("invert")] = IDF_SHADER_INVERT;
  1408. shaders[_T("letterbox")] = IDF_SHADER_LETTERBOX;
  1409. shaders[_T("procamp")] = IDF_SHADER_PROCAMP;
  1410. shaders[_T("sharpen")] = IDF_SHADER_SHARPEN;
  1411. shaders[_T("sphere")] = IDF_SHADER_SPHERE;
  1412. shaders[_T("spotlight")] = IDF_SHADER_SPOTLIGHT;
  1413. shaders[_T("wave")] = IDF_SHADER_WAVE;
  1414. int iShader = 0;
  1415. for(; ; iShader++)
  1416. {
  1417. CString str;
  1418. str.Format(_T("%d"), iShader);
  1419. str = pApp->GetProfileString(_T("Shaders"), str);
  1420. CAtlList<CString> sl;
  1421. CString label = Explode(str, sl, '|');
  1422. if(label.IsEmpty()) break;
  1423. if(sl.GetCount() < 3) continue;
  1424. Shader s;
  1425. s.label = sl.RemoveHead();
  1426. s.target = sl.RemoveHead();
  1427. s.srcdata = sl.RemoveHead();
  1428. s.srcdata.Replace(_T("\n"), _T("n"));
  1429. s.srcdata.Replace(_T("\t"), _T("t"));
  1430. m_shaders.AddTail(s);
  1431. shaders.RemoveKey(s.label);
  1432. }
  1433. pos = shaders.GetStartPosition();
  1434. for(; pos; iShader++)
  1435. {
  1436. CAtlStringMap<UINT>::CPair* pPair = shaders.GetNext(pos);
  1437. CStringA srcdata;
  1438. if(LoadResource(pPair->m_value, srcdata, _T("FILE")))
  1439. {
  1440. Shader s;
  1441. s.label = pPair->m_key;
  1442. s.target = _T("ps_2_0");
  1443. s.srcdata = CString(srcdata);
  1444. m_shaders.AddTail(s);
  1445. }
  1446. }
  1447. // TODO: sort shaders by label
  1448. m_shadercombine = pApp->GetProfileString(_T("Shaders"), _T("Combine"), _T(""));
  1449. fInitialized = true;
  1450. }
  1451. }
  1452. void CMPlayerCApp::Settings::ParseCommandLine(CAtlList<CString>& cmdln)
  1453. {
  1454. nCLSwitches = 0;
  1455. slFiles.RemoveAll();
  1456. slDubs.RemoveAll();
  1457. slSubs.RemoveAll();
  1458. slFilters.RemoveAll();
  1459. rtStart = 0;
  1460. fixedWindowSize.SetSize(0, 0);
  1461. iMonitor = 0;
  1462. if(launchfullscreen) nCLSwitches |= CLSW_FULLSCREEN;
  1463. POSITION pos = cmdln.GetHeadPosition();
  1464. while(pos)
  1465. {
  1466. CString param = cmdln.GetNext(pos);
  1467. if(param.IsEmpty()) continue;
  1468. if((param[0] == '-' || param[0] == '/') && param.GetLength() > 1)
  1469. {
  1470. CString sw = param.Mid(1).MakeLower();
  1471. if(sw == _T("open")) nCLSwitches |= CLSW_OPEN;
  1472. else if(sw == _T("play")) nCLSwitches |= CLSW_PLAY;
  1473. else if(sw == _T("fullscreen")) nCLSwitches |= CLSW_FULLSCREEN;
  1474. else if(sw == _T("minimized")) nCLSwitches |= CLSW_MINIMIZED;
  1475. else if(sw == _T("new")) nCLSwitches |= CLSW_NEW;
  1476. else if(sw == _T("help") || sw == _T("h") || sw == _T("?")) nCLSwitches |= CLSW_HELP;
  1477. else if(sw == _T("dub") && pos) slDubs.AddTail(cmdln.GetNext(pos));
  1478. else if(sw == _T("sub") && pos) slSubs.AddTail(cmdln.GetNext(pos));
  1479. else if(sw == _T("filter") && pos) slFilters.AddTail(cmdln.GetNext(pos));
  1480. else if(sw == _T("dvd")) nCLSwitches |= CLSW_DVD;
  1481. else if(sw == _T("cd")) nCLSwitches |= CLSW_CD;
  1482. else if(sw == _T("add")) nCLSwitches |= CLSW_ADD;
  1483. else if(sw == _T("regvid")) nCLSwitches |= CLSW_REGEXTVID;
  1484. else if(sw == _T("regaud")) nCLSwitches |= CLSW_REGEXTAUD;
  1485. else if(sw == _T("unregvid")) nCLSwitches |= CLSW_UNREGEXTVID;
  1486. else if(sw == _T("unregaud")) nCLSwitches |= CLSW_UNREGEXTAUD;
  1487. else if(sw == _T("start") && pos) {rtStart = 10000i64*_tcstol(cmdln.GetNext(pos), NULL, 10); nCLSwitches |= CLSW_STARTVALID;}
  1488. else if(sw == _T("startpos") && pos) {/* TODO: mm:ss. */;}
  1489. else if(sw == _T("nofocus")) nCLSwitches |= CLSW_NOFOCUS;
  1490. else if(sw == _T("close")) nCLSwitches |= CLSW_CLOSE;
  1491. else if(sw == _T("standby")) nCLSwitches |= CLSW_STANDBY;
  1492. else if(sw == _T("hibernate")) nCLSwitches |= CLSW_HIBERNATE;
  1493. else if(sw == _T("shutdown")) nCLSwitches |= CLSW_SHUTDOWN;
  1494. else if(sw == _T("logoff")) nCLSwitches |= CLSW_LOGOFF;
  1495. else if(sw == _T("fixedsize") && pos)
  1496. {
  1497. CAtlList<CString> sl;
  1498. Explode(cmdln.GetNext(pos), sl, ',', 2);
  1499. if(sl.GetCount() == 2)
  1500. {
  1501. fixedWindowSize.SetSize(_ttol(sl.GetHead()), _ttol(sl.GetTail()));
  1502. if(fixedWindowSize.cx > 0 && fixedWindowSize.cy > 0)
  1503. nCLSwitches |= CLSW_FIXEDSIZE;
  1504. }
  1505. }
  1506. else if(sw == _T("monitor") && pos) {iMonitor = _tcstol(cmdln.GetNext(pos), NULL, 10); nCLSwitches |= CLSW_MONITOR;}
  1507. else nCLSwitches |= CLSW_HELP|CLSW_UNRECOGNIZEDSWITCH;
  1508. }
  1509. else
  1510. {
  1511. slFiles.AddTail(param);
  1512. }
  1513. }
  1514. }
  1515. void CMPlayerCApp::Settings::GetFav(favtype ft, CAtlList<CString>& sl)
  1516. {
  1517. sl.RemoveAll();
  1518. CString root;
  1519. switch(ft)
  1520. {
  1521. case FAV_FILE: root = ResStr(IDS_R_FAVFILES); break;
  1522. case FAV_DVD: root = ResStr(IDS_R_FAVDVDS); break;
  1523. case FAV_DEVICE: root = ResStr(IDS_R_FAVDEVICES); break;
  1524. default: return;
  1525. }
  1526. for(int i = 0; ; i++)
  1527. {
  1528. CString s;
  1529. s.Format(_T("Name%d"), i);
  1530. s = AfxGetApp()->GetProfileString(root, s, NULL);
  1531. if(s.IsEmpty()) break;
  1532. sl.AddTail(s);
  1533. }
  1534. }
  1535. void CMPlayerCApp::Settings::SetFav(favtype ft, CAtlList<CString>& sl)
  1536. {
  1537. CString root;
  1538. switch(ft)
  1539. {
  1540. case FAV_FILE: root = ResStr(IDS_R_FAVFILES); break;
  1541. case FAV_DVD: root = ResStr(IDS_R_FAVDVDS); break;
  1542. case FAV_DEVICE: root = ResStr(IDS_R_FAVDEVICES); break;
  1543. default: return;
  1544. }
  1545. AfxGetApp()->WriteProfileString(root, NULL, NULL);
  1546. int i = 0;
  1547. POSITION pos = sl.GetHeadPosition();
  1548. while(pos)
  1549. {
  1550. CString s;
  1551. s.Format(_T("Name%d"), i++);
  1552. AfxGetApp()->WriteProfileString(root, s, sl.GetNext(pos));
  1553. }
  1554. }
  1555. void CMPlayerCApp::Settings::AddFav(favtype ft, CString s)
  1556. {
  1557. CAtlList<CString> sl;
  1558. GetFav(ft, sl);
  1559. if(sl.Find(s)) return;
  1560. sl.AddTail(s);
  1561. SetFav(ft, sl);
  1562. }
  1563. // CMPlayerCApp::Settings::CRecentFileAndURLList
  1564. CMPlayerCApp::Settings::CRecentFileAndURLList::CRecentFileAndURLList(UINT nStart, LPCTSTR lpszSection,
  1565. LPCTSTR lpszEntryFormat, int nSize,
  1566. int nMaxDispLen) 
  1567. : CRecentFileList(nStart, lpszSection, lpszEntryFormat, nSize, nMaxDispLen)
  1568. {
  1569. }
  1570. //#include <afximpl.h>
  1571. extern BOOL AFXAPI AfxFullPath(LPTSTR lpszPathOut, LPCTSTR lpszFileIn);
  1572. extern BOOL AFXAPI AfxComparePath(LPCTSTR lpszPath1, LPCTSTR lpszPath2);
  1573. void CMPlayerCApp::Settings::CRecentFileAndURLList::Add(LPCTSTR lpszPathName)
  1574. {
  1575. ASSERT(m_arrNames != NULL);
  1576. ASSERT(lpszPathName != NULL);
  1577. ASSERT(AfxIsValidString(lpszPathName));
  1578. if(CString(lpszPathName).MakeLower().Find(_T("@device:")) >= 0)
  1579. return;
  1580. bool fURL = (CString(lpszPathName).Find(_T("://")) >= 0);
  1581. // fully qualify the path name
  1582. TCHAR szTemp[1024];
  1583. if(fURL) _tcscpy_s(szTemp, countof(szTemp), lpszPathName);
  1584. else AfxFullPath(szTemp, lpszPathName);
  1585. // update the MRU list, if an existing MRU string matches file name
  1586. int iMRU;
  1587. for (iMRU = 0; iMRU < m_nSize-1; iMRU++)
  1588. {
  1589. if((fURL && !_tcscmp(m_arrNames[iMRU], szTemp))
  1590. || AfxComparePath(m_arrNames[iMRU], szTemp))
  1591. break;      // iMRU will point to matching entry
  1592. }
  1593. // move MRU strings before this one down
  1594. for (; iMRU > 0; iMRU--)
  1595. {
  1596. ASSERT(iMRU > 0);
  1597. ASSERT(iMRU < m_nSize);
  1598. m_arrNames[iMRU] = m_arrNames[iMRU-1];
  1599. }
  1600. // place this one at the beginning
  1601. m_arrNames[0] = szTemp;
  1602. }
  1603. void CMPlayerCApp::OnHelpShowcommandlineswitches()
  1604. {
  1605. ShowCmdlnSwitches();
  1606. }
  1607. //
  1608. void GetCurDispMode(dispmode& dm)
  1609. {
  1610. if(HDC hDC = ::GetDC(0))
  1611. {
  1612. dm.fValid = true;
  1613. dm.size = CSize(GetDeviceCaps(hDC, HORZRES), GetDeviceCaps(hDC, VERTRES));
  1614. dm.bpp = GetDeviceCaps(hDC, BITSPIXEL);
  1615. dm.freq = GetDeviceCaps(hDC, VREFRESH);
  1616. ::ReleaseDC(0, hDC);
  1617. }
  1618. }
  1619. bool GetDispMode(int i, dispmode& dm)
  1620. {
  1621. DEVMODE devmode;
  1622. devmode.dmSize = sizeof(DEVMODE);
  1623. if(!EnumDisplaySettings(0, i, &devmode))
  1624. return(false);
  1625. dm.fValid = true;
  1626. dm.size = CSize(devmode.dmPelsWidth, devmode.dmPelsHeight);
  1627. dm.bpp = devmode.dmBitsPerPel;
  1628. dm.freq = devmode.dmDisplayFrequency;
  1629. return(true);
  1630. }
  1631. void SetDispMode(dispmode& dm)
  1632. {
  1633. if(!dm.fValid) return;
  1634. DEVMODE dmScreenSettings;
  1635. memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
  1636. dmScreenSettings.dmSize = sizeof(dmScreenSettings);
  1637. dmScreenSettings.dmPelsWidth = dm.size.cx;
  1638. dmScreenSettings.dmPelsHeight = dm.size.cy;
  1639. dmScreenSettings.dmBitsPerPel = dm.bpp;
  1640. dmScreenSettings.dmDisplayFrequency = dm.freq;
  1641. dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
  1642. ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
  1643. }
  1644. #include <afxsock.h>
  1645. #include <atlsync.h>
  1646. #include <atlutil.h> // put this before the first detours macro above to see an ICE with vc71 :)
  1647. #include <atlrx.h>
  1648. typedef CAtlRegExp<CAtlRECharTraits> CAtlRegExpT;
  1649. typedef CAtlREMatchContext<CAtlRECharTraits> CAtlREMatchContextT;
  1650. bool FindRedir(CUrl& src, CString ct, CString& body, CAtlList<CString>& urls, CAutoPtrList<CAtlRegExpT>& res)
  1651. {
  1652. POSITION pos = res.GetHeadPosition();
  1653. while(pos)
  1654. {
  1655. CAtlRegExpT* re = res.GetNext(pos);
  1656. CAtlREMatchContextT mc;
  1657. const CAtlREMatchContextT::RECHAR* s = (LPCTSTR)body;
  1658. const CAtlREMatchContextT::RECHAR* e = NULL;
  1659. for(; s && re->Match(s, &mc, &e); s = e)
  1660. {
  1661. const CAtlREMatchContextT::RECHAR* szStart = 0;
  1662. const CAtlREMatchContextT::RECHAR* szEnd = 0;
  1663. mc.GetMatch(0, &szStart, &szEnd);
  1664. CString url;
  1665. url.Format(_T("%.*s"), szEnd - szStart, szStart);
  1666. url.Trim();
  1667. if(url.CompareNoCase(_T("asf path")) == 0) continue;
  1668. CUrl dst;
  1669. dst.CrackUrl(CString(url));
  1670. if(_tcsicmp(src.GetSchemeName(), dst.GetSchemeName())
  1671. || _tcsicmp(src.GetHostName(), dst.GetHostName())
  1672. || _tcsicmp(src.GetUrlPath(), dst.GetUrlPath()))
  1673. {
  1674. urls.AddTail(url);
  1675. }
  1676. else
  1677. {
  1678. // recursive
  1679. urls.RemoveAll();
  1680. break;
  1681. }
  1682. }
  1683. }
  1684. return urls.GetCount() > 0;
  1685. }
  1686. bool FindRedir(CString& fn, CString ct, CAtlList<CString>& fns, CAutoPtrList<CAtlRegExpT>& res)
  1687. {
  1688. CString body;
  1689. CTextFile f(CTextFile::ANSI);
  1690. if(f.Open(fn)) for(CString tmp; f.ReadString(tmp); body += tmp + 'n');
  1691. CString dir = fn.Left(max(fn.ReverseFind('/'), fn.ReverseFind('\'))+1); // "ReverseFindOneOf"
  1692. POSITION pos = res.GetHeadPosition();
  1693. while(pos)
  1694. {
  1695. CAtlRegExpT* re = res.GetNext(pos);
  1696. CAtlREMatchContextT mc;
  1697. const CAtlREMatchContextT::RECHAR* s = (LPCTSTR)body;
  1698. const CAtlREMatchContextT::RECHAR* e = NULL;
  1699. for(; s && re->Match(s, &mc, &e); s = e)
  1700. {
  1701. const CAtlREMatchContextT::RECHAR* szStart = 0;
  1702. const CAtlREMatchContextT::RECHAR* szEnd = 0;
  1703. mc.GetMatch(0, &szStart, &szEnd);
  1704. CString fn2;
  1705. fn2.Format(_T("%.*s"), szEnd - szStart, szStart);
  1706. fn2.Trim();
  1707. if(!fn2.CompareNoCase(_T("asf path"))) continue;
  1708. if(fn2.Find(_T("EXTM3U")) == 0 || fn2.Find(_T("#EXTINF")) == 0) continue;
  1709. if(fn2.Find(_T(":")) < 0 && fn2.Find(_T("\\")) != 0 && fn2.Find(_T("//")) != 0)
  1710. {
  1711. CPath p;
  1712. p.Combine(dir, fn2);
  1713. fn2 = (LPCTSTR)p;
  1714. }
  1715. if(!fn2.CompareNoCase(fn))
  1716. continue;
  1717. fns.AddTail(fn2);
  1718. }
  1719. }
  1720. return fns.GetCount() > 0;
  1721. }
  1722. CString GetContentType(CString fn, CAtlList<CString>* redir)
  1723. {
  1724. CUrl url;
  1725. CString ct, body;
  1726. if(fn.Find(_T("://")) >= 0)
  1727. {
  1728. url.CrackUrl(fn);
  1729. if(_tcsicmp(url.GetSchemeName(), _T("pnm")) == 0)
  1730. return "audio/x-pn-realaudio";
  1731. if(_tcsicmp(url.GetSchemeName(), _T("mms")) == 0)
  1732. return "video/x-ms-asf";
  1733. if(_tcsicmp(url.GetSchemeName(), _T("http")) != 0)
  1734. return "";
  1735. DWORD ProxyEnable = 0;
  1736. CString ProxyServer;
  1737. DWORD ProxyPort = 0;
  1738. ULONG len = 256+1;
  1739. CRegKey key;
  1740. if(ERROR_SUCCESS == key.Open(HKEY_CURRENT_USER, _T("Software\Microsoft\Windows\CurrentVersion\Internet Settings"), KEY_READ)
  1741. && ERROR_SUCCESS == key.QueryDWORDValue(_T("ProxyEnable"), ProxyEnable) && ProxyEnable
  1742. && ERROR_SUCCESS == key.QueryStringValue(_T("ProxyServer"), ProxyServer.GetBufferSetLength(256), &len))
  1743. {
  1744. ProxyServer.ReleaseBufferSetLength(len);
  1745. CAtlList<CString> sl;
  1746. ProxyServer = Explode(ProxyServer, sl, ';');
  1747. if(sl.GetCount() > 1)
  1748. {
  1749. POSITION pos = sl.GetHeadPosition();
  1750. while(pos)
  1751. {
  1752. CAtlList<CString> sl2;
  1753. if(!Explode(sl.GetNext(pos), sl2, '=', 2).CompareNoCase(_T("http"))
  1754. && sl2.GetCount() == 2)
  1755. {
  1756. ProxyServer = sl2.GetTail();
  1757. break;
  1758. }
  1759. }
  1760. }
  1761. ProxyServer = Explode(ProxyServer, sl, ':');
  1762. if(sl.GetCount() > 1) ProxyPort = _tcstol(sl.GetTail(), NULL, 10);
  1763. }
  1764. CSocket s;
  1765. s.Create();
  1766. if(s.Connect(
  1767. ProxyEnable ? ProxyServer : url.GetHostName(), 
  1768. ProxyEnable ? ProxyPort : url.GetPortNumber()))
  1769. {
  1770. CStringA host = CStringA(url.GetHostName());
  1771. CStringA path = CStringA(url.GetUrlPath()) + CStringA(url.GetExtraInfo());
  1772. if(ProxyEnable) path = "http://" + host + path;
  1773. CStringA hdr;
  1774. hdr.Format(
  1775. "GET %s HTTP/1.0rn"
  1776. "User-Agent: Media Player Classicrn"
  1777. "Host: %srn"
  1778. "Accept: */*rn"
  1779. "rn", path, host);
  1780. // MessageBox(NULL, CString(hdr), _T("Sending..."), MB_OK);
  1781. if(s.Send((LPCSTR)hdr, hdr.GetLength()) < hdr.GetLength()) return "";
  1782. hdr.Empty();
  1783. while(1)
  1784. {
  1785. CStringA str;
  1786. str.ReleaseBuffer(s.Receive(str.GetBuffer(256), 256)); // SOCKET_ERROR == -1, also suitable for ReleaseBuffer
  1787. if(str.IsEmpty()) break;
  1788. hdr += str;
  1789. int hdrend = hdr.Find("rnrn");
  1790. if(hdrend >= 0) {body = hdr.Mid(hdrend+4); hdr = hdr.Left(hdrend); break;}
  1791. }
  1792. // MessageBox(NULL, CString(hdr), _T("Received..."), MB_OK);
  1793. CAtlList<CStringA> sl;
  1794. Explode(hdr, sl, 'n');
  1795. POSITION pos = sl.GetHeadPosition();
  1796. while(pos)
  1797. {
  1798. CStringA& hdrline = sl.GetNext(pos);
  1799. CAtlList<CStringA> sl2;
  1800. Explode(hdrline, sl2, ':', 2);
  1801. CStringA field = sl2.RemoveHead().MakeLower();
  1802. if(field == "location" && !sl2.IsEmpty())
  1803. return GetContentType(CString(sl2.GetHead()), redir);
  1804. if(field == "content-type" && !sl2.IsEmpty())
  1805. ct = sl2.GetHead();
  1806. }
  1807. while(body.GetLength() < 256)
  1808. {
  1809. CStringA str;
  1810. str.ReleaseBuffer(s.Receive(str.GetBuffer(256), 256)); // SOCKET_ERROR == -1, also suitable for ReleaseBuffer
  1811. if(str.IsEmpty()) break;
  1812. body += str;
  1813. }
  1814. if(body.GetLength() >= 8)
  1815. {
  1816. CStringA str = TToA(body);
  1817. if(!strncmp((LPCSTR)str, ".ra", 3))
  1818. return "audio/x-pn-realaudio";
  1819. if(!strncmp((LPCSTR)str, ".RMF", 4))
  1820. return "audio/x-pn-realaudio";
  1821. if(*(DWORD*)(LPCSTR)str == 0x75b22630)
  1822. return "video/x-ms-wmv";
  1823. if(!strncmp((LPCSTR)str+4, "moov", 4))
  1824. return "video/quicktime";
  1825. }
  1826. if(redir && (ct == _T("audio/x-scpls") || ct == _T("audio/x-mpegurl")))
  1827. {
  1828. while(body.GetLength() < 4*1024) // should be enough for a playlist...
  1829. {
  1830. CStringA str;
  1831. str.ReleaseBuffer(s.Receive(str.GetBuffer(256), 256)); // SOCKET_ERROR == -1, also suitable for ReleaseBuffer
  1832. if(str.IsEmpty()) break;
  1833. body += str;
  1834. }
  1835. }
  1836. }
  1837. }
  1838. else if(!fn.IsEmpty())
  1839. {
  1840. CPath p(fn);
  1841. CString ext = p.GetExtension().MakeLower();
  1842. if(ext == _T(".asx")) ct = _T("video/x-ms-asf");
  1843. else if(ext == _T(".pls")) ct = _T("audio/x-scpls");
  1844. else if(ext == _T(".m3u")) ct = _T("audio/x-mpegurl");
  1845. else if(ext == _T(".qtl")) ct = _T("application/x-quicktimeplayer");
  1846. else if(ext == _T(".mpcpl")) ct = _T("application/x-mpc-playlist");
  1847. if(FILE* f = _tfopen(fn, _T("rb")))
  1848. {
  1849. CStringA str;
  1850. str.ReleaseBufferSetLength(fread(str.GetBuffer(10240), 1, 10240, f));
  1851. body = AToT(str);
  1852. fclose(f);
  1853. }
  1854. }
  1855. if(body.GetLength() >= 4) // here only those which cannot be opened through dshow
  1856. {
  1857. CStringA str = TToA(body);
  1858. if(!strncmp((LPCSTR)str, ".ra", 3))
  1859. return "audio/x-pn-realaudio";
  1860. if(!strncmp((LPCSTR)str, "FWS", 3))
  1861. return "application/x-shockwave-flash";
  1862. }
  1863. if(redir && !ct.IsEmpty())
  1864. {
  1865. CAutoPtrList<CAtlRegExpT> res;
  1866. CAutoPtr<CAtlRegExpT> re;
  1867. if(ct == _T("video/x-ms-asf"))
  1868. {
  1869. // ...://..."/>
  1870. re.Attach(new CAtlRegExpT());
  1871. if(re && REPARSE_ERROR_OK == re->Parse(_T("{[a-zA-Z]+://[^n">]*}"), FALSE))
  1872. res.AddTail(re);
  1873. // Ref#n= ...://...n
  1874. re.Attach(new CAtlRegExpT());
  1875. if(re && REPARSE_ERROR_OK == re->Parse(_T("Ref\z\b*=\b*["]*{([a-zA-Z]+://[^n"]+}"), FALSE))
  1876. res.AddTail(re);
  1877. }
  1878. else if(ct == _T("audio/x-scpls"))
  1879. {
  1880. // File1=...n
  1881. re.Attach(new CAtlRegExp<>());
  1882. if(re && REPARSE_ERROR_OK == re->Parse(_T("file\z\b*=\b*["]*{[^n"]+}"), FALSE))
  1883. res.AddTail(re);
  1884. }
  1885. else if(ct == _T("audio/x-mpegurl"))
  1886. {
  1887. // #comment
  1888. // ...
  1889. re.Attach(new CAtlRegExp<>());
  1890. if(re && REPARSE_ERROR_OK == re->Parse(_T("{[^#][^n]+}"), FALSE))
  1891. res.AddTail(re);
  1892. }
  1893. else if(ct == _T("audio/x-pn-realaudio"))
  1894. {
  1895. // rtsp://...
  1896. re.Attach(new CAtlRegExp<>());
  1897. if(re && REPARSE_ERROR_OK == re->Parse(_T("{rtsp://[^n]+}"), FALSE))
  1898. res.AddTail(re);
  1899. }
  1900. if(!body.IsEmpty())
  1901. {
  1902. if(fn.Find(_T("://")) >= 0) FindRedir(url, ct, body, *redir, res);
  1903. else FindRedir(fn, ct, *redir, res);
  1904. }
  1905. }
  1906. return ct;
  1907. }