PPageAudioSwitcher.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:10k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 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. // PPageAudioSwitcher.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "PPageAudioSwitcher.h"
  26. // CPPageAudioSwitcher dialog
  27. IMPLEMENT_DYNAMIC(CPPageAudioSwitcher, CPPageBase)
  28. CPPageAudioSwitcher::CPPageAudioSwitcher(IFilterGraph* pFG)
  29. : CPPageBase(CPPageAudioSwitcher::IDD, CPPageAudioSwitcher::IDD)
  30. , m_fDownSampleTo441(FALSE)
  31. , m_fCustomChannelMapping(FALSE)
  32. , m_nChannels(0)
  33. , m_fEnableAudioSwitcher(FALSE)
  34. , m_dwChannelMask(0)
  35. , m_tAudioTimeShift(0)
  36. , m_fAudioTimeShift(FALSE)
  37. {
  38. m_pAudioSwitcher = FindFilter(__uuidof(CAudioSwitcherFilter), pFG);
  39. }
  40. CPPageAudioSwitcher::~CPPageAudioSwitcher()
  41. {
  42. }
  43. void CPPageAudioSwitcher::DoDataExchange(CDataExchange* pDX)
  44. {
  45. __super::DoDataExchange(pDX);
  46. DDX_Check(pDX, IDC_CHECK3, m_fDownSampleTo441);
  47. DDX_Check(pDX, IDC_CHECK1, m_fCustomChannelMapping);
  48. DDX_Control(pDX, IDC_EDIT1, m_nChannelsCtrl);
  49. DDX_Text(pDX, IDC_EDIT1, m_nChannels);
  50. DDX_Control(pDX, IDC_SPIN1, m_nChannelsSpinCtrl);
  51. DDX_Control(pDX, IDC_LIST1, m_list);
  52. DDX_Check(pDX, IDC_CHECK2, m_fEnableAudioSwitcher);
  53. DDX_Control(pDX, IDC_CHECK3, m_fDownSampleTo441Ctrl);
  54. DDX_Control(pDX, IDC_CHECK1, m_fCustomChannelMappingCtrl);
  55. DDX_Control(pDX, IDC_EDIT2, m_tAudioTimeShiftCtrl);
  56. DDX_Control(pDX, IDC_SPIN2, m_tAudioTimeShiftSpin);
  57. DDX_Text(pDX, IDC_EDIT2, m_tAudioTimeShift);
  58. DDX_Check(pDX, IDC_CHECK4, m_fAudioTimeShift);
  59. DDX_Control(pDX, IDC_CHECK4, m_fAudioTimeShiftCtrl);
  60. }
  61. BEGIN_MESSAGE_MAP(CPPageAudioSwitcher, CPPageBase)
  62. ON_NOTIFY(NM_CLICK, IDC_LIST1, OnNMClickList1)
  63. ON_WM_DRAWITEM()
  64. ON_EN_CHANGE(IDC_EDIT1, OnEnChangeEdit1)
  65. ON_UPDATE_COMMAND_UI(IDC_CHECK3, OnUpdateAudioSwitcher)
  66. ON_UPDATE_COMMAND_UI(IDC_CHECK4, OnUpdateAudioSwitcher)
  67. ON_UPDATE_COMMAND_UI(IDC_EDIT2, OnUpdateAudioSwitcher)
  68. ON_UPDATE_COMMAND_UI(IDC_SPIN2, OnUpdateAudioSwitcher)
  69. ON_UPDATE_COMMAND_UI(IDC_CHECK1, OnUpdateAudioSwitcher)
  70. ON_UPDATE_COMMAND_UI(IDC_EDIT1, OnUpdateChannelMapping)
  71. ON_UPDATE_COMMAND_UI(IDC_SPIN1, OnUpdateChannelMapping)
  72. ON_UPDATE_COMMAND_UI(IDC_LIST1, OnUpdateChannelMapping)
  73. ON_UPDATE_COMMAND_UI(IDC_STATIC1, OnUpdateChannelMapping)
  74. ON_UPDATE_COMMAND_UI(IDC_STATIC2, OnUpdateChannelMapping)
  75. ON_UPDATE_COMMAND_UI(IDC_STATIC3, OnUpdateChannelMapping)
  76. END_MESSAGE_MAP()
  77. // CPPageAudioSwitcher message handlers
  78. BOOL CPPageAudioSwitcher::OnInitDialog()
  79. {
  80. __super::OnInitDialog();
  81. AppSettings& s = AfxGetAppSettings();
  82. m_fEnableAudioSwitcher = s.fEnableAudioSwitcher;
  83. m_fDownSampleTo441 = s.fDownSampleTo441;
  84. m_fAudioTimeShift = s.fAudioTimeShift;
  85. m_tAudioTimeShift = s.tAudioTimeShift;
  86. m_tAudioTimeShiftSpin.SetRange32(-1000*60*60*24, 1000*60*60*24);
  87. m_fCustomChannelMapping = s.fCustomChannelMapping;
  88. memcpy(m_pSpeakerToChannelMap, s.pSpeakerToChannelMap, sizeof(s.pSpeakerToChannelMap));
  89. if(m_pAudioSwitcher)
  90. m_pAudioSwitcher->GetInputSpeakerConfig(&m_dwChannelMask);
  91. m_nChannels = 1;
  92. m_nChannelsSpinCtrl.SetRange(1, 18);
  93. if(m_pAudioSwitcher)
  94. m_nChannels = m_pAudioSwitcher->GetNumberOfInputChannels();
  95. m_list.InsertColumn(0, _T(""), LVCFMT_LEFT, 100);
  96. m_list.InsertItem(0, _T(""));
  97. m_list.InsertItem(1, _T("Front Left"));
  98. m_list.InsertItem(2, _T("Front Right"));
  99. m_list.InsertItem(3, _T("Front Center"));
  100. m_list.InsertItem(4, _T("Low Frequency"));
  101. m_list.InsertItem(5, _T("Back Left"));
  102. m_list.InsertItem(6, _T("Back Right"));
  103. m_list.InsertItem(7, _T("Front Left of Center"));
  104. m_list.InsertItem(8, _T("Front Right of Center"));
  105. m_list.InsertItem(9, _T("Back Center"));
  106. m_list.InsertItem(10, _T("Side Left"));
  107. m_list.InsertItem(11, _T("Side Right"));
  108. m_list.InsertItem(12, _T("Top Center"));
  109. m_list.InsertItem(13, _T("Top Front Left"));
  110. m_list.InsertItem(14, _T("Top Front Center"));
  111. m_list.InsertItem(15, _T("Top Front Right"));
  112. m_list.InsertItem(16, _T("Top Back Left"));
  113. m_list.InsertItem(17, _T("Top Back Center"));
  114. m_list.InsertItem(18, _T("Top Back Right"));
  115. m_list.SetColumnWidth(0, LVSCW_AUTOSIZE);
  116. for(int i = 1; i <= 18; i++)
  117. {
  118. m_list.InsertColumn(i, _T(""), LVCFMT_CENTER, 16);
  119. CString n;
  120. n.Format(_T("%d"), i);
  121. m_list.SetItemText(0, i, n);
  122. // m_list.SetColumnWidth(i, LVSCW_AUTOSIZE);
  123. // m_list.SetColumnWidth(i, m_list.GetColumnWidth(i)*8/10);
  124. }
  125. UpdateData(FALSE);
  126. return TRUE;  // return TRUE unless you set the focus to a control
  127. // EXCEPTION: OCX Property Pages should return FALSE
  128. }
  129. BOOL CPPageAudioSwitcher::OnApply()
  130. {
  131. UpdateData();
  132. AppSettings& s = AfxGetAppSettings();
  133. s.fEnableAudioSwitcher = !!m_fEnableAudioSwitcher;
  134. s.fDownSampleTo441 = !!m_fDownSampleTo441;
  135. s.fAudioTimeShift = !!m_fAudioTimeShift;
  136. s.tAudioTimeShift = m_tAudioTimeShift;
  137. s.fCustomChannelMapping = !!m_fCustomChannelMapping;
  138. memcpy(s.pSpeakerToChannelMap, m_pSpeakerToChannelMap, sizeof(m_pSpeakerToChannelMap));
  139. if(m_pAudioSwitcher)
  140. {
  141. m_pAudioSwitcher->SetSpeakerConfig(s.fCustomChannelMapping, m_pSpeakerToChannelMap);
  142. m_pAudioSwitcher->EnableDownSamplingTo441(s.fDownSampleTo441);
  143. m_pAudioSwitcher->SetAudioTimeShift(m_fAudioTimeShift ? 10000i64*m_tAudioTimeShift : 0);
  144. }
  145. return __super::OnApply();
  146. }
  147. void CPPageAudioSwitcher::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult)
  148. {
  149. LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR;
  150. if(lpnmlv->iItem > 0 && lpnmlv->iSubItem > 0 && lpnmlv->iSubItem <= m_nChannels)
  151. {
  152. UpdateData();
  153. m_pSpeakerToChannelMap[m_nChannels-1][lpnmlv->iItem-1] ^= 1<<(lpnmlv->iSubItem-1);
  154. m_list.RedrawItems(lpnmlv->iItem, lpnmlv->iItem);
  155. SetModified();
  156. if(GetKeyState(VK_SHIFT) & 0x8000)
  157. {
  158. OnApply();
  159. }
  160. }
  161. *pResult = 0;
  162. }
  163. void CPPageAudioSwitcher::OnEnChangeEdit1()
  164. {
  165. if(IsWindow(m_list.m_hWnd))
  166. {
  167. UpdateData();
  168. m_list.Invalidate();
  169. }
  170. }
  171. #include <math.h>
  172. void CPPageAudioSwitcher::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
  173. {
  174. if(nIDCtl != IDC_LIST1) return;
  175. // if(lpDrawItemStruct->itemID == 0)
  176. // UpdateData();
  177. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  178. pDC->SetBkMode(TRANSPARENT);
  179. CPen p(PS_INSIDEFRAME, 1, 0xe0e0e0);
  180. CPen* old = pDC->SelectObject(&p);
  181. pDC->MoveTo(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom-1);
  182. pDC->LineTo(lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom-1);
  183. CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();
  184. int nColumnCount = pHeader->GetItemCount();
  185. for(int i = 0; i < nColumnCount; i++)
  186. {
  187. CRect r, rb;
  188. m_list.GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_BOUNDS, rb);
  189. m_list.GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, r);
  190. pDC->MoveTo(r.right-1, r.top);
  191. pDC->LineTo(r.right-1, r.bottom-1);
  192. CSize s = pDC->GetTextExtent(m_list.GetItemText(lpDrawItemStruct->itemID, i));
  193. if(i == 0)
  194. {
  195. r.left = rb.left;
  196. if(lpDrawItemStruct->itemID == 0)
  197. {
  198. pDC->MoveTo(0, 0);
  199. pDC->LineTo(r.right, r.bottom-1);
  200. }
  201. else
  202. {
  203. pDC->SetTextColor(m_list.IsWindowEnabled() ? 0 : 0xb0b0b0);
  204. pDC->TextOut(r.left+1, (r.top+r.bottom-s.cy)/2, m_list.GetItemText(lpDrawItemStruct->itemID, i));
  205. }
  206. }
  207. else
  208. {
  209. pDC->SetTextColor(i > m_nChannels ? 0xe0e0e0 : (!m_list.IsWindowEnabled() ? 0xb0b0b0 : 0));
  210. if(lpDrawItemStruct->itemID == 0)
  211. {
  212. pDC->TextOut((r.left+r.right-s.cx)/2, (r.top+r.bottom-s.cy)/2, m_list.GetItemText(lpDrawItemStruct->itemID, i));
  213. }
  214. else
  215. {
  216. if(m_dwChannelMask & (1<<(lpDrawItemStruct->itemID-1)))
  217. {
  218. int nBitsSet = 0;
  219. for(int j = 1; j <= (1<<(lpDrawItemStruct->itemID-1)); j <<= 1)
  220. {
  221. if(m_dwChannelMask & j)
  222. nBitsSet++;
  223. }
  224. if(nBitsSet == i)
  225. {
  226. COLORREF tmp = pDC->GetTextColor();
  227. pDC->SetTextColor(0xe0e0e0);
  228. CFont f;
  229. f.CreatePointFont(MulDiv(100, 96, pDC->GetDeviceCaps(LOGPIXELSX)), _T("Marlett"));
  230. CFont* old = pDC->SelectObject(&f);
  231. s = pDC->GetTextExtent(_T("g"));
  232. pDC->TextOut((r.left+r.right-s.cx)/2, (r.top+r.bottom-s.cy)/2, _T("g"));
  233. pDC->SetTextColor(tmp);
  234. }
  235. }
  236. if(m_pSpeakerToChannelMap[m_nChannels-1][lpDrawItemStruct->itemID-1] & (1<<(i-1)))
  237. {
  238. CFont f;
  239. f.CreatePointFont(MulDiv(100, 96, pDC->GetDeviceCaps(LOGPIXELSX)), _T("Marlett"));
  240. CFont* old = pDC->SelectObject(&f);
  241. s = pDC->GetTextExtent(_T("a"));
  242. pDC->TextOut((r.left+r.right-s.cx)/2, (r.top+r.bottom-s.cy)/2, _T("a"));
  243. pDC->SelectObject(old);
  244. }
  245. }
  246. }
  247. }
  248. pDC->SelectObject(old);
  249. }
  250. void CPPageAudioSwitcher::OnUpdateAudioSwitcher(CCmdUI* pCmdUI)
  251. {
  252. // UpdateData();
  253. pCmdUI->Enable(IsDlgButtonChecked(IDC_CHECK2)/*m_fEnableAudioSwitcher*/);
  254. }
  255. void CPPageAudioSwitcher::OnUpdateChannelMapping(CCmdUI* pCmdUI)
  256. {
  257. // UpdateData();
  258. pCmdUI->Enable(IsDlgButtonChecked(IDC_CHECK2)/*m_fEnableAudioSwitcher*/ 
  259. && IsDlgButtonChecked(IDC_CHECK1)/*m_fCustomChannelMapping*/);
  260. }