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

多媒体编程

开发平台:

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. // PPageInternalFilters.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PPageInternalFilters.h"
  26. #include "ComPropertySheet.h"
  27. #include "....filtersfilters.h"
  28. static struct filter_t
  29. {
  30. LPCTSTR label; 
  31. int type; 
  32. int flag; 
  33. UINT nHintID; 
  34. CUnknown* (WINAPI * CreateInstance)(LPUNKNOWN lpunk, HRESULT* phr);
  35. }
  36. s_filters[] = 
  37. {
  38. {_T("AVI"), 0, SRC_AVI, IDS_SRC_AVI, NULL},
  39. {_T("CDDA (Audio CD)"), 0, SRC_CDDA, IDS_SRC_CDDA, NULL},
  40. {_T("CDXA (VCD/SVCD/XCD)"), 0, SRC_CDXA, IDS_SRC_CDXA, NULL},
  41. __if_exists(CDiracSplitterFilter) {{_T("Dirac"), 0, SRC_DIRAC, IDS_SRC_DIRAC, NULL},}
  42. {_T("DirectShow Media"), 0, SRC_DSM, IDS_SRC_DSM, NULL},
  43. {_T("DTS/AC3"), 0, SRC_DTSAC3, IDS_SRC_DTSAC3, NULL},
  44. {_T("DVD Video Title Set"), 0, SRC_VTS, IDS_SRC_VTS, NULL},
  45. {_T("DVD2AVI Project File"), 0, SRC_D2V, IDS_SRC_D2V, NULL},
  46. {_T("FLI/FLC"), 0, SRC_FLIC, IDS_SRC_FLIC, NULL},
  47. {_T("FLV"), 0, SRC_FLV, IDS_SRC_FLV, NULL},
  48. {_T("Matroska"), 0, SRC_MATROSKA, IDS_SRC_MATROSKA, NULL},
  49. {_T("MP4/MOV"), 0, SRC_MP4, IDS_SRC_MP4, NULL},
  50. {_T("MPEG Audio"), 0, SRC_MPA, IDS_SRC_MPA, NULL},
  51. {_T("MPEG PS/TS/PVA"), 0, SRC_MPEG, 0, NULL},
  52. __if_exists(CNutSplitterFilter) {{_T("Nut"), 0, SRC_NUT, IDS_SRC_NUT, NULL},}
  53. {_T("Ogg"), 0, SRC_OGG, IDS_SRC_OGG, NULL},
  54. {_T("RealMedia"), 0, SRC_REALMEDIA, IDS_SRC_REALMEDIA, NULL},
  55. {_T("RoQ"), 0, SRC_ROQ, IDS_SRC_ROQ, NULL},
  56. {_T("SHOUTcast"), 0, SRC_SHOUTCAST, IDS_SRC_SHOUTCAST, NULL},
  57. __if_exists(CRadGtSplitterFilter) {{_T("Smacker/Bink"), 0, SRC_RADGT, IDS_SRC_RADGT, NULL},}
  58. {_T("AAC"), 1, TRA_AAC, IDS_TRA_AAC, CreateInstance<CMpaDecFilter>},
  59. {_T("AC3"), 1, TRA_AC3, IDS_TRA_AC3, CreateInstance<CMpaDecFilter>},
  60. {_T("DTS"), 1, TRA_DTS, IDS_TRA_DTS, CreateInstance<CMpaDecFilter>},
  61. __if_exists(CDiracVideoDecoder) {{_T("Dirac"), 1, TRA_DIRAC, IDS_TRA_DIRAC, NULL},}
  62. __if_exists(CFLVVideoDecoder) {{_T("FLV4"), 1, TRA_FLV4, 0, NULL},}
  63. {_T("LPCM"), 1, TRA_LPCM, IDS_TRA_LPCM, CreateInstance<CMpaDecFilter>},
  64. {_T("MPEG Audio"), 1, TRA_MPA, IDS_TRA_MPA, CreateInstance<CMpaDecFilter>},
  65. {_T("MPEG-1 Video"), 1, TRA_MPEG1, IDS_TRA_MPEG1, CreateInstance<CMpeg2DecFilter>},
  66. {_T("MPEG-2 Video"), 1, TRA_MPEG2, IDS_TRA_MPEG2, CreateInstance<CMpeg2DecFilter>},
  67. {_T("PS2 Audio (PCM/ADPCM)"), 1, TRA_PS2AUD, IDS_TRA_PS2AUD, CreateInstance<CMpaDecFilter>},
  68. {_T("RealVideo"), 1, TRA_RV, IDS_TRA_RV, NULL},
  69. {_T("RealAudio"), 1, TRA_RA, IDS_TRA_RA, NULL},
  70. {_T("Vorbis"), 1, TRA_VORBIS, 0, NULL /* TODO: CreateInstance<CMpaDecFilter>*/},
  71. __if_exists(CFLVVideoDecoder) {{_T("VP62"), 1, TRA_VP62, 0, NULL},}
  72. };
  73. IMPLEMENT_DYNAMIC(CPPageInternalFiltersListBox, CCheckListBox)
  74. CPPageInternalFiltersListBox::CPPageInternalFiltersListBox()
  75. : CCheckListBox()
  76. {
  77. }
  78. void CPPageInternalFiltersListBox::PreSubclassWindow()
  79. {
  80. __super::PreSubclassWindow();
  81. EnableToolTips(TRUE);
  82. }
  83. INT_PTR CPPageInternalFiltersListBox::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
  84. {
  85. BOOL b = FALSE;
  86. int row = ItemFromPoint(point, b);
  87. if(row < 0) return -1;
  88. CRect r;
  89. GetItemRect(row, r);
  90. pTI->rect = r;
  91. pTI->hwnd = m_hWnd;
  92. pTI->uId = (UINT)row;
  93. pTI->lpszText = LPSTR_TEXTCALLBACK;
  94. pTI->uFlags |= TTF_ALWAYSTIP;
  95. return pTI->uId;
  96. }
  97. BEGIN_MESSAGE_MAP(CPPageInternalFiltersListBox, CCheckListBox)
  98. ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
  99. ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
  100. END_MESSAGE_MAP()
  101. BOOL CPPageInternalFiltersListBox::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
  102. {
  103. TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
  104. TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
  105. filter_t* f = (filter_t*)GetItemDataPtr(pNMHDR->idFrom);
  106. if(f->nHintID == 0) return FALSE;
  107. ::SendMessage(pNMHDR->hwndFrom, TTM_SETMAXTIPWIDTH, 0, (LPARAM)(INT)1000);
  108. static CStringA m_strTipTextA;
  109. static CStringW m_strTipTextW;
  110. m_strTipTextA = CString(MAKEINTRESOURCE(f->nHintID));
  111. m_strTipTextW = CString(MAKEINTRESOURCE(f->nHintID));
  112. if(pNMHDR->code == TTN_NEEDTEXTA) pTTTA->lpszText = (LPSTR)(LPCSTR)m_strTipTextA;
  113. else pTTTW->lpszText = (LPWSTR)(LPCWSTR)m_strTipTextW;
  114. *pResult = 0;
  115. return TRUE;    // message was handled
  116. }
  117. void CPPageInternalFiltersListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  118. {
  119. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  120. CFont* pOldFont = NULL;
  121. if(((filter_t*)lpDrawItemStruct->itemData)->CreateInstance)
  122. {
  123. if(!(HFONT)m_bold)
  124. {
  125. CFont* pFont = pDC->GetCurrentFont();
  126. LOGFONT lf;
  127. pFont->GetLogFont(&lf);
  128. lf.lfWeight = FW_BOLD;
  129. m_bold.CreateFontIndirect(&lf);
  130. }
  131. if((HFONT)m_bold)
  132. {
  133. pOldFont = pDC->SelectObject(&m_bold);
  134. }
  135. }
  136. __super::DrawItem(lpDrawItemStruct);
  137. if(pOldFont)
  138. {
  139. pDC->SelectObject(pOldFont);
  140. }
  141. }
  142. // CPPageInternalFilters dialog
  143. IMPLEMENT_DYNAMIC(CPPageInternalFilters, CPPageBase)
  144. CPPageInternalFilters::CPPageInternalFilters()
  145. : CPPageBase(CPPageInternalFilters::IDD, CPPageInternalFilters::IDD)
  146. {
  147. }
  148. CPPageInternalFilters::~CPPageInternalFilters()
  149. {
  150. }
  151. void CPPageInternalFilters::DoDataExchange(CDataExchange* pDX)
  152. {
  153. __super::DoDataExchange(pDX);
  154. DDX_Control(pDX, IDC_LIST1, m_listSrc);
  155. DDX_Control(pDX, IDC_LIST2, m_listTra);
  156. }
  157. BEGIN_MESSAGE_MAP(CPPageInternalFilters, CPPageBase)
  158. ON_LBN_DBLCLK(IDC_LIST1, &CPPageInternalFilters::OnLbnDblclkList1)
  159. ON_LBN_DBLCLK(IDC_LIST2, &CPPageInternalFilters::OnLbnDblclkList2)
  160. END_MESSAGE_MAP()
  161. // CPPageInternalFilters message handlers
  162. BOOL CPPageInternalFilters::OnInitDialog()
  163. {
  164. __super::OnInitDialog();
  165. AppSettings& s = AfxGetAppSettings();
  166. for(int i = 0; i < countof(s_filters); i++)
  167. {
  168. CCheckListBox* l = 
  169. s_filters[i].type == 0 ? &m_listSrc : 
  170. s_filters[i].type == 1 ? &m_listTra : 
  171. NULL; 
  172. UINT* pflags = 
  173. s_filters[i].type == 0 ? &s.SrcFilters : 
  174. s_filters[i].type == 1 ? &s.TraFilters : 
  175. NULL; 
  176. if(l && pflags)
  177. {
  178. int Index = l->AddString(s_filters[i].label);
  179. l->SetCheck(Index, !!(*pflags & s_filters[i].flag));
  180. l->SetItemDataPtr(Index, &s_filters[i]);
  181. }
  182. }
  183. UpdateData(FALSE);
  184. return TRUE;  // return TRUE unless you set the focus to a control
  185. // EXCEPTION: OCX Property Pages should return FALSE
  186. }
  187. BOOL CPPageInternalFilters::OnApply()
  188. {
  189. UpdateData();
  190. AppSettings& s = AfxGetAppSettings();
  191. s.SrcFilters = s.TraFilters = 0;
  192. CList<filter_t*> fl;
  193. for(int i = 0; i < m_listSrc.GetCount(); i++)
  194. if(m_listSrc.GetCheck(i))
  195. fl.AddTail((filter_t*)m_listSrc.GetItemDataPtr(i));
  196. for(int i = 0; i < m_listTra.GetCount(); i++)
  197. if(m_listTra.GetCheck(i))
  198. fl.AddTail((filter_t*)m_listTra.GetItemDataPtr(i));
  199. POSITION pos = fl.GetHeadPosition();
  200. while(pos)
  201. {
  202. filter_t* f = fl.GetNext(pos);
  203. UINT* pflags = 
  204. f->type == 0 ? &s.SrcFilters : 
  205. f->type == 1 ? &s.TraFilters : 
  206. NULL; 
  207. if(pflags)
  208. *pflags |= f->flag;
  209. }
  210. return __super::OnApply();
  211. }
  212. void CPPageInternalFilters::ShowPPage(CPPageInternalFiltersListBox& l)
  213. {
  214. int i = l.GetCurSel();
  215. if(i < 0) return;
  216. filter_t* f = (filter_t*)l.GetItemDataPtr(i);
  217. if(!f || !f->CreateInstance) return;
  218. HRESULT hr;
  219. CUnknown* pObj = f->CreateInstance(NULL, &hr);
  220. if(!pObj) return;
  221. CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pObj;
  222. if(SUCCEEDED(hr))
  223. {
  224. if(CComQIPtr<ISpecifyPropertyPages> pSPP = pUnk)
  225. {
  226. CComPropertySheet ps(ResStr(IDS_PROPSHEET_PROPERTIES), this);
  227. ps.AddPages(pSPP);
  228. ps.DoModal();
  229. }
  230. }
  231. }
  232. void CPPageInternalFilters::OnLbnDblclkList1()
  233. {
  234. ShowPPage(m_listSrc);
  235. }
  236. void CPPageInternalFilters::OnLbnDblclkList2()
  237. {
  238. ShowPPage(m_listTra);
  239. }