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

多媒体编程

开发平台:

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. // PPageAudioDecoder.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include <math.h>
  25. #include "mplayerc.h"
  26. #include "PPageAudioDecoder.h"
  27. #include ".ppageaudiodecoder.h"
  28. // CPPageAudioDecoder dialog
  29. IMPLEMENT_DYNAMIC(CPPageAudioDecoder, CPPageBase)
  30. CPPageAudioDecoder::CPPageAudioDecoder(IFilterGraph* pFG)
  31. : CPPageBase(CPPageAudioDecoder::IDD, CPPageAudioDecoder::IDD)
  32. , m_iSampleFormat(0)
  33. , m_fNormalize(FALSE)
  34. , m_fAc3SpeakerConfig(FALSE)
  35. , m_iAc3SpeakerConfig(0)
  36. , m_fAc3SpeakerConfigLFE(FALSE)
  37. , m_fAc3DynamicRangeControl(FALSE)
  38. , m_fDtsSpeakerConfig(FALSE)
  39. , m_iDtsSpeakerConfig(0)
  40. , m_fDtsSpeakerConfigLFE(FALSE)
  41. , m_fDtsDynamicRangeControl(FALSE)
  42. , m_iAacSpeakerConfig(0)
  43. , m_boost(0)
  44. {
  45. BeginEnumFilters(pFG, pEF, pBF)
  46. if(CComQIPtr<IMpaDecFilter> pMpaDecFilter = pBF)
  47. m_pMDFs.AddTail(pMpaDecFilter);
  48. EndEnumFilters
  49. }
  50. CPPageAudioDecoder::~CPPageAudioDecoder()
  51. {
  52. }
  53. void CPPageAudioDecoder::DoDataExchange(CDataExchange* pDX)
  54. {
  55. __super::DoDataExchange(pDX);
  56. DDX_Radio(pDX, IDC_RADIO1, m_iSampleFormat);
  57. DDX_Check(pDX, IDC_CHECK3, m_fNormalize);
  58. DDX_Radio(pDX, IDC_RADIO5, m_fAc3SpeakerConfig);
  59. DDX_CBIndex(pDX, IDC_COMBO1, m_iAc3SpeakerConfig);
  60. DDX_Check(pDX, IDC_CHECK1, m_fAc3SpeakerConfigLFE);
  61. DDX_Check(pDX, IDC_CHECK2, m_fAc3DynamicRangeControl);
  62. DDX_Control(pDX, IDC_COMBO1, m_ac3sclist);
  63. DDX_Radio(pDX, IDC_RADIO12, m_fDtsSpeakerConfig);
  64. DDX_CBIndex(pDX, IDC_COMBO2, m_iDtsSpeakerConfig);
  65. DDX_Check(pDX, IDC_CHECK17, m_fDtsSpeakerConfigLFE);
  66. DDX_Check(pDX, IDC_CHECK4, m_fDtsDynamicRangeControl);
  67. DDX_Control(pDX, IDC_COMBO2, m_dtssclist);
  68. DDX_Check(pDX, IDC_CHECK5, m_iAacSpeakerConfig);
  69. DDX_Slider(pDX, IDC_SLIDER1, m_boost);
  70. DDX_Control(pDX, IDC_SLIDER1, m_boostctrl);
  71. }
  72. BEGIN_MESSAGE_MAP(CPPageAudioDecoder, CPPageBase)
  73. ON_WM_HSCROLL()
  74. END_MESSAGE_MAP()
  75. // CPPageAudioDecoder message handlers
  76. BOOL CPPageAudioDecoder::OnInitDialog()
  77. {
  78. __super::OnInitDialog();
  79. AppSettings& s = AfxGetAppSettings();
  80. m_iSampleFormat = s.mpasf;
  81. m_fNormalize = s.mpanormalize;
  82. m_fAc3SpeakerConfig = s.ac3sc < 0;
  83. m_iAc3SpeakerConfig = A52_STEREO;
  84. m_fAc3SpeakerConfigLFE = !!(abs(s.ac3sc)&A52_LFE);
  85. m_fAc3DynamicRangeControl = s.ac3drc;
  86. m_fDtsSpeakerConfig = s.dtssc < 0;
  87. m_iDtsSpeakerConfig = DTS_STEREO;
  88. m_fDtsSpeakerConfigLFE = !!(abs(s.dtssc)&DTS_LFE);
  89. m_fDtsDynamicRangeControl = s.dtsdrc;
  90. m_iAacSpeakerConfig = s.aacsc; // FIXME
  91. m_boost = (int)(50.0f*log10(s.mpaboost));
  92. m_boostctrl.SetRange(0, 100);
  93. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("Mono")), A52_MONO);
  94. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("Dual Mono")), A52_CHANNEL);
  95. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("Stereo")), A52_STEREO);
  96. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("Dolby Stereo")), A52_DOLBY);
  97. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("3 Front")), A52_3F);
  98. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("2 Front + 1 Rear")), A52_2F1R);
  99. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("3 Front + 1 Rear")), A52_3F1R);
  100. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("2 Front + 2 Rear")), A52_2F2R);
  101. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("3 Front + 2 Rear")), A52_3F2R);
  102. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("Channel 1")), A52_CHANNEL1);
  103. m_ac3sclist.SetItemData(m_ac3sclist.AddString(_T("Channel 2")), A52_CHANNEL2);
  104. for(int i = 0, j = abs(s.ac3sc)&A52_CHANNEL_MASK; i < m_ac3sclist.GetCount(); i++)
  105. {
  106. if(m_ac3sclist.GetItemData(i) == j)
  107. {
  108. m_iAc3SpeakerConfig = i;
  109. break;
  110. }
  111. }
  112. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("Mono")), DTS_MONO);
  113. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("Dual Mono")), DTS_CHANNEL);
  114. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("Stereo")), DTS_STEREO);
  115. //m_dtssclist.SetItemData(m_dtssclist.AddString(_T("Stereo ..")), DTS_STEREO_SUMDIFF);
  116. //m_dtssclist.SetItemData(m_dtssclist.AddString(_T("Stereo ..")), DTS_STEREO_TOTAL);
  117. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("3 Front")), DTS_3F);
  118. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("2 Front + 1 Rear")), DTS_2F1R);
  119. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("3 Front + 1 Rear")), DTS_3F1R);
  120. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("2 Front + 2 Rear")), DTS_2F2R);
  121. m_dtssclist.SetItemData(m_dtssclist.AddString(_T("3 Front + 2 Rear")), DTS_3F2R);
  122. for(int i = 0, j = abs(s.dtssc)&DTS_CHANNEL_MASK; i < m_dtssclist.GetCount(); i++)
  123. {
  124. if(m_dtssclist.GetItemData(i) == j)
  125. {
  126. m_iDtsSpeakerConfig = i;
  127. break;
  128. }
  129. }
  130. UpdateData(FALSE);
  131. return TRUE;  // return TRUE unless you set the focus to a control
  132. // EXCEPTION: OCX Property Pages should return FALSE
  133. }
  134. BOOL CPPageAudioDecoder::OnApply()
  135. {
  136. UpdateData();
  137. AppSettings& s = AfxGetAppSettings();
  138. s.mpasf = m_iSampleFormat;
  139. s.mpanormalize = !!m_fNormalize;
  140. s.ac3sc = m_ac3sclist.GetItemData(m_ac3sclist.GetCurSel());
  141. s.ac3sc |= m_fAc3SpeakerConfigLFE?A52_LFE:0;
  142. s.ac3sc *= m_fAc3SpeakerConfig?-1:1;
  143. s.ac3drc = !!m_fAc3DynamicRangeControl;
  144. s.dtssc = m_dtssclist.GetItemData(m_dtssclist.GetCurSel());
  145. s.dtssc |= m_fDtsSpeakerConfigLFE?DTS_LFE:0;
  146. s.dtssc *= m_fDtsSpeakerConfig?-1:1;
  147. s.dtsdrc = !!m_fDtsDynamicRangeControl;
  148. s.aacsc = !!m_iAacSpeakerConfig;
  149. s.mpaboost = (float)pow(10.0, (double)m_boost/50);
  150. POSITION pos = m_pMDFs.GetHeadPosition();
  151. while(pos)
  152. {
  153. CComPtr<IMpaDecFilter> pMpaDecFilter = m_pMDFs.GetNext(pos);
  154. pMpaDecFilter->SetSampleFormat((SampleFormat)s.mpasf);
  155. pMpaDecFilter->SetNormalize(s.mpanormalize);
  156. pMpaDecFilter->SetSpeakerConfig(IMpaDecFilter::ac3, s.ac3sc);
  157. pMpaDecFilter->SetDynamicRangeControl(IMpaDecFilter::ac3, s.ac3drc);
  158. pMpaDecFilter->SetSpeakerConfig(IMpaDecFilter::dts, s.dtssc);
  159. pMpaDecFilter->SetDynamicRangeControl(IMpaDecFilter::dts, s.dtsdrc);
  160. pMpaDecFilter->SetSpeakerConfig(IMpaDecFilter::aac, s.aacsc);
  161. pMpaDecFilter->SetBoost(s.mpaboost);
  162. }
  163. return __super::OnApply();
  164. }
  165. void CPPageAudioDecoder::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  166. {
  167. SetModified();
  168. CPPageBase::OnHScroll(nSBCode, nPos, pScrollBar);
  169. }