/*
* $Id$
*
* (C) 2003-2006 Gabest
* (C) 2006-2010 see AUTHORS
*
* This file is part of mplayerc.
*
* Mplayerc is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Mplayerc is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#pragma once
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h" // main symbols
#include
#include
#include "../../Subtitles/STS.h"
#include "MediaFormats.h"
#include "FakeFilterMapper2.h"
#include "DVBChannel.h"
#include "RenderersSettings.h"
#define MPC_WND_CLASS_NAME L"MediaPlayerClassicW"
enum
{
WM_GRAPHNOTIFY = WM_RESET_DEVICE+1,
WM_RESUMEFROMSTATE,
WM_TUNER_SCAN_PROGRESS,
WM_TUNER_SCAN_END,
WM_TUNER_STATS,
WM_TUNER_NEW_CHANNEL
};
#define WM_MYMOUSELAST WM_XBUTTONDBLCLK
///////////////
extern void CorrectComboListWidth(CComboBox& box, CFont* pWndFont);
extern HICON LoadIcon(CString fn, bool fSmall);
extern bool LoadType(CString fn, CString& type);
extern bool LoadResource(UINT resid, CStringA& str, LPCTSTR restype);
extern CStringA GetContentType(CString fn, CAtlList* redir = NULL);
extern bool IsVistaOrAbove();
/////////////////////////////////////////////////////////////////////////////
// Casimir666
//
typedef enum
{
Brightness = 0x1,
Contrast = 0x2,
Hue = 0x4,
Saturation = 0x8,
} ControlType;
typedef struct // _VMR9ProcAmpControlRange
{
DWORD dwSize;
DWORD dwProperty;
float MinValue;
float MaxValue;
float DefaultValue;
float StepSize;
} COLORPROPERTY_RANGE;
#define MAX_DVD_POSITION 20
typedef struct
{
ULONGLONG llDVDGuid;
ULONG lTitle;
DVD_HMSF_TIMECODE Timecode;
} DVD_POSITION;
#define MAX_FILE_POSITION 20
typedef struct
{
CString strFile;
LONGLONG llPosition;
} FILE_POSITION;
/////////////////////////////////////////////////////////////////////////////
// CMPlayerCApp:
// See mplayerc.cpp for the implementation of this class
//
// flags for AppSettings::nCS
enum
{
CS_NONE=0,
CS_SEEKBAR=1,
CS_TOOLBAR=CS_SEEKBAR<<1,
CS_INFOBAR=CS_TOOLBAR<<1,
CS_STATSBAR=CS_INFOBAR<<1,
CS_STATUSBAR=CS_STATSBAR<<1,
CS_LAST=CS_STATUSBAR
};
enum
{
CLSW_NONE=0,
CLSW_OPEN=1,
CLSW_PLAY=CLSW_OPEN<<1,
CLSW_CLOSE=CLSW_PLAY<<1,
CLSW_STANDBY=CLSW_CLOSE<<1,
CLSW_HIBERNATE=CLSW_STANDBY<<1,
CLSW_SHUTDOWN=CLSW_HIBERNATE<<1,
CLSW_LOGOFF=CLSW_SHUTDOWN<<1,
CLSW_AFTERPLAYBACK_MASK=CLSW_CLOSE|CLSW_STANDBY|CLSW_SHUTDOWN|CLSW_HIBERNATE|CLSW_LOGOFF,
CLSW_FULLSCREEN=CLSW_LOGOFF<<1,
CLSW_NEW=CLSW_FULLSCREEN<<1,
CLSW_HELP=CLSW_NEW<<1,
CLSW_DVD=CLSW_HELP<<1,
CLSW_CD=CLSW_DVD<<1,
CLSW_ADD=CLSW_CD<<1,
CLSW_MINIMIZED=CLSW_ADD<<1,
CLSW_REGEXTVID=CLSW_MINIMIZED<<1, // 16
CLSW_REGEXTAUD=CLSW_REGEXTVID<<1,
CLSW_UNREGEXT=CLSW_REGEXTAUD<<1,
CLSW_STARTVALID=CLSW_UNREGEXT<<2,
CLSW_NOFOCUS=CLSW_STARTVALID<<1,
CLSW_FIXEDSIZE=CLSW_NOFOCUS<<1,
CLSW_MONITOR=CLSW_FIXEDSIZE<<1,
CLSW_D3DFULLSCREEN=CLSW_MONITOR<<1,
CLSW_ADMINOPTION=CLSW_D3DFULLSCREEN<<1,
CLSW_SLAVE=CLSW_ADMINOPTION<<1,
CLSW_AUDIORENDER=CLSW_SLAVE<<1,
CLSW_UNRECOGNIZEDSWITCH=CLSW_AUDIORENDER<<1
};
enum
{
VIDRNDT_DS_DEFAULT,
VIDRNDT_DS_OLDRENDERER,
VIDRNDT_DS_OVERLAYMIXER,
VIDRNDT_DS_VMR7WINDOWED,
VIDRNDT_DS_VMR9WINDOWED,
VIDRNDT_DS_VMR7RENDERLESS,
VIDRNDT_DS_VMR9RENDERLESS,
VIDRNDT_DS_DXR,
VIDRNDT_DS_NULL_COMP,
VIDRNDT_DS_NULL_UNCOMP,
VIDRNDT_DS_EVR,
VIDRNDT_DS_EVR_CUSTOM,
VIDRNDT_DS_MADVR,
VIDRNDT_DS_SYNC
};
// Enumeration for MCE remotecontrol (careful : add 0x010000 for all keys!)
enum MCE_RAW_INPUT
{
MCE_DETAILS = 0x010209,
MCE_GUIDE = 0x01008D,
MCE_TVJUMP = 0x010025,
MCE_STANDBY = 0x010082,
MCE_OEM1 = 0x010080,
MCE_OEM2 = 0x010081,
MCE_MYTV = 0x010046,
MCE_MYVIDEOS = 0x01004A,
MCE_MYPICTURES = 0x010049,
MCE_MYMUSIC = 0x010047,
MCE_RECORDEDTV = 0x010048,
MCE_DVDANGLE = 0x01004B,
MCE_DVDAUDIO = 0x01004C,
MCE_DVDMENU = 0x010024,
MCE_DVDSUBTITLE = 0x01004D,
MCE_RED = 0x01005B,
MCE_GREEN = 0x01005C,
MCE_YELLOW = 0x01005D,
MCE_BLUE = 0x01005E,
MCE_MEDIA_NEXTTRACK = 0x0100B5,
MCE_MEDIA_PREVIOUSTRACK = 0x0100B6,
};
#define AUDRNDT_NULL_COMP _T("Null Audio Renderer (Any)")
#define AUDRNDT_NULL_UNCOMP _T("Null Audio Renderer (Uncompressed)")
#define AUDRNDT_MPC _T("MPC Audio Renderer")
enum
{
SRC_CDDA = 1,
SRC_CDXA = SRC_CDDA<<1,
SRC_VTS = SRC_CDXA<<1,
SRC_FLIC = SRC_VTS<<1,
SRC_D2V = SRC_FLIC<<1,
SRC_DTSAC3 = SRC_D2V<<1,
SRC_MATROSKA = SRC_DTSAC3<<1,
SRC_SHOUTCAST = SRC_MATROSKA<<1,
SRC_REALMEDIA = SRC_SHOUTCAST<<1,
SRC_AVI = SRC_REALMEDIA<<1,
SRC_ROQ = SRC_AVI<<1,
SRC_OGG = SRC_ROQ<<1,
SRC_NUT = SRC_OGG<<1,
SRC_MPEG = SRC_NUT<<1,
SRC_DIRAC = SRC_MPEG<<1,
SRC_MPA = SRC_DIRAC<<1,
SRC_DSM = SRC_MPA<<1,
SRC_SUBS = SRC_DSM<<1,
SRC_MP4 = SRC_SUBS<<1,
SRC_FLV = SRC_MP4<<1,
SRC_FLAC = SRC_FLV<<1,
SRC_LAST = SRC_FLAC<<1
};
enum
{
TRA_MPEG1 = 1,
TRA_MPEG2 = TRA_MPEG1<<1,
TRA_RV = TRA_MPEG2<<1,
TRA_RA = TRA_RV<<1,
TRA_MPA = TRA_RA<<1,
TRA_LPCM = TRA_MPA<<1,
TRA_AC3 = TRA_LPCM<<1,
TRA_DTS = TRA_AC3<<1,
TRA_AAC = TRA_DTS<<1,
TRA_PS2AUD = TRA_AAC<<1,
TRA_DIRAC = TRA_PS2AUD<<1,
TRA_VORBIS = TRA_DIRAC<<1,
TRA_FLAC = TRA_VORBIS<<1,
TRA_NELLY = TRA_FLAC<<1,
TRA_AMR = TRA_NELLY<<1,
TRA_PCM = TRA_AMR<<1,
TRA_LAST = TRA_PCM<<1
};
enum
{
DXVA_H264 = 1,
DXVA_VC1 = DXVA_H264<<1,
DXVA_MPEG2 = DXVA_VC1<<1,
DXVA_LAST = DXVA_MPEG2<<1
};
enum
{
FFM_H264 = 1,
FFM_VC1 = FFM_H264<<1,
FFM_FLV4 = FFM_VC1<<1,
FFM_VP62 = FFM_FLV4<<1,
FFM_VP8 = FFM_VP62<<1,
FFM_XVID = FFM_VP8<<1,
FFM_DIVX = FFM_XVID<<1,
FFM_MSMPEG4 = FFM_DIVX<<1,
FFM_WMV = FFM_MSMPEG4<<1,
FFM_SVQ3 = FFM_WMV<<1,
FFM_H263 = FFM_SVQ3<<1,
FFM_THEORA = FFM_H263<<1,
FFM_AMVV = FFM_THEORA<<1,
FFM_LAST = FFM_AMVV<<1
};
typedef enum
{
DVS_HALF,
DVS_NORMAL,
DVS_DOUBLE,
DVS_STRETCH,
DVS_FROMINSIDE,
DVS_FROMOUTSIDE,
DVS_ZOOM1,
DVS_ZOOM2
} dvstype;
typedef enum
{
FAV_FILE,
FAV_DVD,
FAV_DEVICE
} favtype;
#pragma pack(push, 1)
typedef struct
{
bool fValid;
CSize size;
int bpp, freq;
DWORD dmDisplayFlags;
} dispmode;
typedef struct
{
bool bEnabled;
dispmode dmFullscreenRes24Hz;
dispmode dmFullscreenRes25Hz;
dispmode dmFullscreenRes30Hz;
dispmode dmFullscreenResOther;
bool bApplyDefault;
dispmode dmFullscreenRes23d976Hz;
dispmode dmFullscreenRes29d97Hz;
} AChFR; //AutoChangeFullscrRes
class wmcmd : public ACCEL
{
ACCEL backup;
UINT appcmdorg;
UINT mouseorg;
public:
DWORD dwname;
UINT appcmd;
enum {NONE,LDOWN,LUP,LDBLCLK,MDOWN,MUP,MDBLCLK,RDOWN,RUP,RDBLCLK,X1DOWN,X1UP,X1DBLCLK,X2DOWN,X2UP,X2DBLCLK,WUP,WDOWN,LAST};
UINT mouse;
CStringA rmcmd;
int rmrepcnt;
wmcmd(WORD cmd = 0)
{
this->cmd = cmd;
}
wmcmd(WORD cmd, WORD key, BYTE fVirt, DWORD dwname, UINT appcmd = 0, UINT mouse = NONE, LPCSTR rmcmd = "", int rmrepcnt = 5)
{
this->cmd = cmd;
this->key = key;
this->fVirt = fVirt;
this->appcmd = appcmdorg = appcmd;
this->dwname = dwname;
this->mouse = mouseorg = mouse;
this->rmcmd = rmcmd;
this->rmrepcnt = rmrepcnt;
backup = *this;
}
bool operator == (const wmcmd& wc) const
{
return(cmd > 0 && cmd == wc.cmd);
}
CString GetName()
{
return ResStr (dwname);
}
void Restore()
{
*(ACCEL*)this = backup;
appcmd = appcmdorg;
mouse = mouseorg;
rmcmd.Empty();
rmrepcnt = 5;
}
bool IsModified()
{
return(memcmp((const ACCEL*)this, &backup, sizeof(ACCEL)) || appcmd != appcmdorg || mouse != mouseorg || !rmcmd.IsEmpty() || rmrepcnt != 5);
}
};
#pragma pack(pop)
#include
class CRemoteCtrlClient : public CAsyncSocket
{
protected:
CCritSec m_csLock;
CWnd* m_pWnd;
enum {DISCONNECTED, CONNECTED, CONNECTING} m_nStatus;
CString m_addr;
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnCommand(CStringA str) = 0;
void ExecuteCommand(CStringA cmd, int repcnt);
public:
CRemoteCtrlClient();
void SetHWND(HWND hWnd);
void Connect(CString addr);
int GetStatus()
{
return(m_nStatus);
}
};
class CWinLircClient : public CRemoteCtrlClient
{
protected:
virtual void OnCommand(CStringA str);
public:
CWinLircClient();
};
class CUIceClient : public CRemoteCtrlClient
{
protected:
virtual void OnCommand(CStringA str);
public:
CUIceClient();
};
extern void GetCurDispMode(dispmode& dm, CString& DisplayName);
extern bool GetDispMode(int i, dispmode& dm, CString& DisplayName);
extern void SetDispMode(dispmode& dm, CString& DisplayName);
extern void SetAudioRender(int AudioDevNo);
extern void SetHandCursor(HWND m_hWnd, UINT nID);
class CMPlayerCApp : public CWinApp
{
ATL::CMutex m_mutexOneInstance;
CAtlList m_cmdln;
void PreProcessCommandLine();
void SendCommandLine(HWND hWnd);
UINT GetVKFromAppCommand(UINT nAppCommand);
// === CASIMIR666 : Ajout CMPlayerCApp
COLORPROPERTY_RANGE m_ColorControl[4];
static UINT GetRemoteControlCodeMicrosoft(UINT nInputcode, HRAWINPUT hRawInput);
static UINT GetRemoteControlCodeSRM7500(UINT nInputcode, HRAWINPUT hRawInput);
public:
CMPlayerCApp();
void ShowCmdlnSwitches();
bool StoreSettingsToIni();
bool StoreSettingsToRegistry();
CString GetIniPath();
bool IsIniValid();
bool GetAppSavePath(CString& path);
// === CASIMIR666 : Ajout CMPlayerCApp
CRenderersData m_Renderers;
CString m_strVersion;
CString m_AudioRendererDisplayName_CL;
typedef UINT (*PTR_GetRemoteControlCode)(UINT nInputcode, HRAWINPUT hRawInput);
PTR_GetRemoteControlCode GetRemoteControlCode;
COLORPROPERTY_RANGE* GetColorControl(ControlType nFlag);
static void SetLanguage (int nLanguage);
static LPCTSTR GetSatelliteDll(int nLang);
static int GetDefLanguage();
static bool IsVSFilterInstalled();
static bool HasEVR();
static HRESULT GetElevationType(TOKEN_ELEVATION_TYPE* ptet);
static void RunAsAdministrator(LPCTSTR strCommand, LPCTSTR strArgs, bool bWaitProcess);
void RegisterHotkeys();
void UnregisterHotkeys();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMPlayerCApp)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
// Implementation
class Settings
{
friend class CMPlayerCApp;
bool fInitialized;
class CRecentFileAndURLList : public CRecentFileList
{
public:
CRecentFileAndURLList(UINT nStart, LPCTSTR lpszSection,
LPCTSTR lpszEntryFormat, int nSize,
int nMaxDispLen = AFX_ABBREV_FILENAME_LEN);
virtual void Add(LPCTSTR lpszPathName); // we have to override CRecentFileList::Add because the original version can't handle URLs
};
public:
// cmdline params
int nCLSwitches;
CAtlList slFiles, slDubs, slSubs, slFilters;
// Initial position (used by command line flags)
__int64 rtShift;
__int64 rtStart;
ULONG lDVDTitle;
ULONG lDVDChapter;
DVD_HMSF_TIMECODE DVDPosition;
CSize fixedWindowSize;
bool HasFixedWindowSize() const
{
return fixedWindowSize.cx > 0 || fixedWindowSize.cy > 0;
}
// int iFixedWidth, iFixedHeight;
int iMonitor;
CString sPnSPreset;
void ParseCommandLine(CAtlList& cmdln);
// Added a Debug display to the screen (/debug option)
bool ShowDebugInfo;
bool fXpOrBetter;
int iDXVer;
int iAdminOption;
int nCS;
bool fHideCaptionMenu;
bool fHideNavigation;
int iDefaultVideoSize;
bool fKeepAspectRatio;
bool fCompMonDeskARDiff;
CRecentFileAndURLList MRU;
CRecentFileAndURLList MRUDub;
CAutoPtrList filters;
CRenderersSettings m_RenderersSettings;
int iDSVideoRendererType;
int iRMVideoRendererType;
int iQTVideoRendererType;
int nVolume;
int nBalance;
bool fMute;
int nLoops;
bool fLoopForever;
bool fRewind;
int iZoomLevel;
// int iVideoRendererType;
CStringW AudioRendererDisplayName;
bool fAutoloadAudio;
bool fAutoloadSubtitles;
bool fBlockVSFilter;
bool fEnableWorkerThreadForOpening;
bool fReportFailedPins;
CStringW f_hmonitor;
bool fAssociatedWithIcons;
CStringW f_lastOpenDir;
bool fAllowMultipleInst;
int iTitleBarTextStyle;
bool fTitleBarTextTitle;
int iOnTop;
bool fTrayIcon;
bool fRememberZoomLevel;
bool fShowBarsWhenFullScreen;
int nShowBarsWhenFullScreenTimeOut;
AChFR AutoChangeFullscrRes;
bool fExitFullScreenAtTheEnd;
bool fRestoreResAfterExit;
bool fRememberWindowPos;
bool fRememberWindowSize;
bool fSnapToDesktopEdges;
CRect rcLastWindowPos;
UINT lastWindowType;
CSize AspectRatio;
bool fKeepHistory;
CString sDVDPath;
bool fUseDVDPath;
LCID idMenuLang, idAudioLang, idSubtitlesLang;
bool fAutoSpeakerConf;
STSStyle subdefstyle;
bool fOverridePlacement;
int nHorPos, nVerPos;
int nSubDelayInterval;
bool fEnableSubtitles;
bool fUseDefaultSubtitlesStyle;
bool fDisableXPToolbars;
bool fUseWMASFReader;
int nJumpDistS;
int nJumpDistM;
int nJumpDistL;
bool fLimitWindowProportions;
bool fNotifyMSN;
bool fNotifyGTSdll;
bool fEnableAudioSwitcher;
bool fDownSampleTo441;
bool fAudioTimeShift;
int tAudioTimeShift;
bool fCustomChannelMapping;
DWORD pSpeakerToChannelMap[18][18];
bool fAudioNormalize;
bool fAudioNormalizeRecover;
float AudioBoost;
bool fIntRealMedia;
//bool fRealMediaRenderless;
int iQuickTimeRenderer;
float RealMediaQuickTimeFPS;
CStringArray m_pnspresets;
CList wmcmds;
HACCEL hAccel;
bool fWinLirc;
CString WinLircAddr;
CWinLircClient WinLircClient;
bool fUIce;
CString UIceAddr;
CUIceClient UIceClient;
bool fGlobalMedia;
CMediaFormats Formats;
UINT SrcFilters, TraFilters, DXVAFilters, FFmpegFilters;
CString logofn;
UINT logoid;
bool logoext;
bool fHideCDROMsSubMenu;
DWORD priority;
bool launchfullscreen;
BOOL fEnableWebServer;
int nWebServerPort;
int nCmdlnWebServerPort;
bool fWebServerPrintDebugInfo;
bool fWebServerUseCompression;
bool fWebServerLocalhostOnly;
CString WebRoot, WebDefIndex;
CString WebServerCGI;
CString SnapShotPath, SnapShotExt;
int ThumbRows, ThumbCols, ThumbWidth;
CString ISDb;
struct Shader
{
CString label;
CString target;
CString srcdata;
};
CAtlList m_shaders;
CString m_shadercombine;
CString m_shadercombineScreenSpace;
// === CASIMIR666 : nouveau settings
bool fD3DFullscreen;
bool fMonitorAutoRefreshRate;
bool fLastFullScreen;
bool fEnableEDLEditor;
float dBrightness;
float dContrast;
float dHue;
float dSaturation;
CString strShaderList;
CString strShaderListScreenSpace;
bool m_bToggleShader;
bool m_bToggleShaderScreenSpace;
bool fRememberDVDPos;
bool fRememberFilePos;
bool fShowOSD;
int iLanguage;
// BDA configuration
int iDefaultCaptureDevice; // Default capture device (analog=0, 1=digital)
CString strAnalogVideo;
CString strAnalogAudio;
int iAnalogCountry;
CString BDANetworkProvider;
CString BDATuner;
CString BDAReceiver;
int DVBLastChannel;
CAtlList DVBChannels;
HWND hMasterWnd;
bool IsD3DFullscreen();
CString SelectedAudioRender();
void ResetPositions();
DVD_POSITION* CurrentDVDPosition();
bool NewDvd(ULONGLONG llDVDGuid);
FILE_POSITION* CurrentFilePosition();
bool NewFile(LPCTSTR strFileName);
void SaveCurrentDVDPosition();
void SaveCurrentFilePosition();
void DeserializeHex (LPCTSTR strVal, BYTE* pBuffer, int nBufSize);
CString SerializeHex (BYTE* pBuffer, int nBufSize);
private :
DVD_POSITION DvdPosition[MAX_DVD_POSITION];
int nCurrentDvdPosition;
FILE_POSITION FilePosition[MAX_FILE_POSITION];
int nCurrentFilePosition;
__int64 ConvertTimeToMSec(CString& time);
void ExtractDVDStartPos(CString& strParam);
void CreateCommands();
public:
Settings();
virtual ~Settings();
void UpdateData(bool fSave);
void GetFav(favtype ft, CAtlList& sl);
void SetFav(favtype ft, CAtlList& sl);
void AddFav(favtype ft, CString s);
CDVBChannel* FindChannelByPref(int nPrefNumber);
bool m_fPreventMinimize;
bool m_fUseWin7TaskBar;
bool m_fExitAfterPlayback;
bool m_fNextInDirAfterPlayback;
bool m_fDontUseSearchInFolder;
int nOSD_Size;
CString m_OSD_Font;
CStringW m_subtitlesLanguageOrder;
CStringW m_audiosLanguageOrder;
int fnChannels;
CString D3D9RenderDevice;
} m_s;
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnAppAbout();
afx_msg void OnFileExit();
afx_msg void OnHelpShowcommandlineswitches();
};
#define AfxGetMyApp() static_cast(AfxGetApp())
#define AfxGetAppSettings() static_cast(AfxGetApp())->m_s
#define AppSettings CMPlayerCApp::Settings