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

多媒体编程

开发平台:

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