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

多媒体编程

开发平台:

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. // SaveDlg.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "SaveDlg.h"
  26. #include "....filtersfilters.h"
  27. // CSaveDlg dialog
  28. IMPLEMENT_DYNAMIC(CSaveDlg, CCmdUIDialog)
  29. CSaveDlg::CSaveDlg(CString in, CString out, CWnd* pParent /*=NULL*/)
  30. : CCmdUIDialog(CSaveDlg::IDD, pParent)
  31. , m_in(in), m_out(out)
  32. , m_nIDTimerEvent(-1)
  33. {
  34. }
  35. CSaveDlg::~CSaveDlg()
  36. {
  37. }
  38. void CSaveDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CCmdUIDialog::DoDataExchange(pDX);
  41. DDX_Control(pDX, IDC_ANIMATE1, m_anim);
  42. DDX_Control(pDX, IDC_PROGRESS1, m_progress);
  43. DDX_Control(pDX, IDC_REPORT, m_report);
  44. DDX_Control(pDX, IDC_FROMTO, m_fromto);
  45. }
  46. BEGIN_MESSAGE_MAP(CSaveDlg, CCmdUIDialog)
  47. ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
  48. ON_MESSAGE(WM_GRAPHNOTIFY, OnGraphNotify)
  49. ON_WM_TIMER()
  50. END_MESSAGE_MAP()
  51. // CSaveDlg message handlers
  52. BOOL CSaveDlg::OnInitDialog()
  53. {
  54. CCmdUIDialog::OnInitDialog();
  55. m_anim.Open(IDR_AVI_FILECOPY);
  56. m_anim.Play(0, -1, -1);
  57. CString str, in = m_in, out = m_out;
  58. if(in.GetLength() > 60) in = in.Left(17) + _T("..") + in.Right(43);
  59. if(out.GetLength() > 60) out = out.Left(17) + _T("..") + out.Right(43);
  60. str.Format(_T("%srn%s"), in, out);
  61. m_fromto.SetWindowText(str);
  62. m_progress.SetRange(0, 100);
  63. if(FAILED(pGB.CoCreateInstance(CLSID_FilterGraph)) || !(pMC = pGB) || !(pME = pGB) || !(pMS = pGB)
  64. || FAILED(pME->SetNotifyWindow((OAHWND)m_hWnd, WM_GRAPHNOTIFY, 0)))
  65. {
  66. m_report.SetWindowText(_T("Error"));
  67. return FALSE;
  68. }
  69. HRESULT hr;
  70. CStringW fnw = m_in;
  71. CComPtr<IFileSourceFilter> pReader;
  72. if(!pReader && m_in.Mid(m_in.ReverseFind('.')+1).MakeLower() == _T("cda"))
  73. {
  74. hr = S_OK;
  75. CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)new CCDDAReader(NULL, &hr);
  76. if(FAILED(hr) || !(pReader = pUnk) || FAILED(pReader->Load(fnw, NULL)))
  77. pReader.Release();
  78. }
  79. if(!pReader)
  80. {
  81. hr = S_OK;
  82. CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)new CCDXAReader(NULL, &hr);
  83. if(FAILED(hr) || !(pReader = pUnk) || FAILED(pReader->Load(fnw, NULL)))
  84. pReader.Release();
  85. }
  86. if(!pReader /*&& ext == _T("ifo")*/)
  87. {
  88. hr = S_OK;
  89. CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)new CVTSReader(NULL, &hr);
  90. if(FAILED(hr) || !(pReader = pUnk) || FAILED(pReader->Load(fnw, NULL)))
  91. pReader.Release();
  92. else
  93. {
  94. CPath pout(m_out);
  95. pout.RenameExtension(_T(".ifo"));
  96. CopyFile(m_in, pout, FALSE);
  97. }
  98. }
  99. if(!pReader)
  100. {
  101. hr = S_OK;
  102. CComPtr<IUnknown> pUnk;
  103. pUnk.CoCreateInstance(CLSID_AsyncReader);
  104. if(FAILED(hr) || !(pReader = pUnk) || FAILED(pReader->Load(fnw, NULL)))
  105. pReader.Release();
  106. }
  107. if(!pReader)
  108. {
  109. hr = S_OK;
  110. CComPtr<IUnknown> pUnk;
  111. pUnk.CoCreateInstance(CLSID_URLReader);
  112. if(CComQIPtr<IBaseFilter> pSrc = pUnk) // url reader has to be in the graph to load the file
  113. {
  114. pGB->AddFilter(pSrc, fnw);
  115. if(FAILED(hr) || !(pReader = pUnk) || FAILED(hr = pReader->Load(fnw, NULL)))
  116. {
  117. pReader.Release();
  118. pGB->RemoveFilter(pSrc);
  119. }
  120. }
  121. }
  122. CComQIPtr<IBaseFilter> pSrc = pReader;
  123. if(FAILED(pGB->AddFilter(pSrc, fnw)))
  124. {
  125. m_report.SetWindowText(_T("Sorry, can't save this file, press cancel"));
  126. return FALSE;
  127. }
  128. CComQIPtr<IBaseFilter> pMid = new CStreamDriveThruFilter(NULL, &hr);
  129. if(FAILED(pGB->AddFilter(pMid, L"StreamDriveThru")))
  130. {
  131. m_report.SetWindowText(_T("Error"));
  132. return FALSE;
  133. }
  134. CComQIPtr<IBaseFilter> pDst;
  135. pDst.CoCreateInstance(CLSID_FileWriter);
  136. CComQIPtr<IFileSinkFilter2> pFSF = pDst;
  137. pFSF->SetFileName(CStringW(m_out), NULL);
  138. pFSF->SetMode(AM_FILE_OVERWRITE);
  139. if(FAILED(pGB->AddFilter(pDst, L"File Writer")))
  140. {
  141. m_report.SetWindowText(_T("Error"));
  142. return FALSE;
  143. }
  144. hr = pGB->Connect(
  145. GetFirstPin((pSrc), PINDIR_OUTPUT), 
  146. GetFirstPin((pMid), PINDIR_INPUT));
  147. hr = pGB->Connect(
  148. GetFirstPin((pMid), PINDIR_OUTPUT), 
  149. GetFirstPin((pDst), PINDIR_INPUT));
  150. pMS = pMid;
  151. pMC->Run();
  152. m_nIDTimerEvent = SetTimer(1, 1000, NULL);
  153. return TRUE;  // return TRUE unless you set the focus to a control
  154. // EXCEPTION: OCX Property Pages should return FALSE
  155. }
  156. void CSaveDlg::OnBnClickedCancel()
  157. {
  158. if(pMC) pMC->Stop();
  159. OnCancel();
  160. }
  161. LRESULT CSaveDlg::OnGraphNotify(WPARAM wParam, LPARAM lParam)
  162. {
  163. LONG evCode, evParam1, evParam2;
  164.     while(pME && SUCCEEDED(pME->GetEvent(&evCode, (LONG_PTR*)&evParam1, (LONG_PTR*)&evParam2, 0)))
  165.     {
  166. HRESULT hr = pME->FreeEventParams(evCode, evParam1, evParam2);
  167.         if(EC_COMPLETE == evCode)
  168.         {
  169. EndDialog(IDOK);
  170. }
  171. else if(EC_ERRORABORT == evCode)
  172. {
  173. TRACE(_T("CSaveDlg::OnGraphNotify / EC_ERRORABORT, hr = %08xn"), (HRESULT)evParam1);
  174. m_report.SetWindowText(_T("Copying unexpectedly terminated!"));
  175. }
  176. }
  177. return 0;
  178. }
  179. void CSaveDlg::OnTimer(UINT nIDEvent)
  180. {
  181. if(nIDEvent == m_nIDTimerEvent && pGB)
  182. {
  183. if(pMS)
  184. {
  185. CString str;
  186. REFERENCE_TIME pos = 0, dur = 0;
  187. pMS->GetCurrentPosition(&pos);
  188. pMS->GetDuration(&dur);
  189. REFERENCE_TIME time = 0;
  190. CComQIPtr<IMediaSeeking>(pGB)->GetCurrentPosition(&time);
  191. REFERENCE_TIME speed = time > 0 ? pos*10000000/time / 1024 : 0i64;
  192. str.Format(_T("%I64d/%I64d KB, %I64d KB/s, %I64d s"), 
  193. pos/1024, dur/1024, speed, speed > 0 ? (dur-pos)/1024 / speed : 0);
  194. m_report.SetWindowText(str);
  195. m_progress.SetPos(dur > 0 ? (int)(100*pos/dur) : 0);
  196. }
  197. }
  198. CCmdUIDialog::OnTimer(nIDEvent);
  199. }