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

多媒体编程

开发平台:

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. // 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_AVI1);
  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(FAILED(hr) || !(pReader = pUnk) || FAILED(hr = pReader->Load(fnw, NULL)))
  113. pReader.Release();
  114. }
  115. CComQIPtr<IBaseFilter> pSrc = pReader;
  116. if(FAILED(pGB->AddFilter(pSrc, fnw)))
  117. {
  118. m_report.SetWindowText(_T("Sorry, can't save this file, press cancel"));
  119. return FALSE;
  120. }
  121. CComQIPtr<IBaseFilter> pMid = new CStreamDriveThruFilter(NULL, &hr);
  122. if(FAILED(pGB->AddFilter(pMid, L"StreamDriveThru")))
  123. {
  124. m_report.SetWindowText(_T("Error"));
  125. return FALSE;
  126. }
  127. CComQIPtr<IBaseFilter> pDst;
  128. pDst.CoCreateInstance(CLSID_FileWriter);
  129. CComQIPtr<IFileSinkFilter2> pFSF = pDst;
  130. pFSF->SetFileName(CStringW(m_out), NULL);
  131. pFSF->SetMode(AM_FILE_OVERWRITE);
  132. if(FAILED(pGB->AddFilter(pDst, L"File Writer")))
  133. {
  134. m_report.SetWindowText(_T("Error"));
  135. return FALSE;
  136. }
  137. hr = pGB->Connect(
  138. GetFirstPin((pSrc), PINDIR_OUTPUT), 
  139. GetFirstPin((pMid), PINDIR_INPUT));
  140. hr = pGB->Connect(
  141. GetFirstPin((pMid), PINDIR_OUTPUT), 
  142. GetFirstPin((pDst), PINDIR_INPUT));
  143. pMS = pMid;
  144. pMC->Run();
  145. m_nIDTimerEvent = SetTimer(1, 1000, NULL);
  146. return TRUE;  // return TRUE unless you set the focus to a control
  147. // EXCEPTION: OCX Property Pages should return FALSE
  148. }
  149. void CSaveDlg::OnBnClickedCancel()
  150. {
  151. if(pMC) pMC->Stop();
  152. OnCancel();
  153. }
  154. LRESULT CSaveDlg::OnGraphNotify(WPARAM wParam, LPARAM lParam)
  155. {
  156. LONG evCode, evParam1, evParam2;
  157.     while(pME && SUCCEEDED(pME->GetEvent(&evCode, (LONG_PTR*)&evParam1, (LONG_PTR*)&evParam2, 0)))
  158.     {
  159. HRESULT hr = pME->FreeEventParams(evCode, evParam1, evParam2);
  160.         if(EC_COMPLETE == evCode)
  161.         {
  162. EndDialog(IDOK);
  163. }
  164. else if(EC_ERRORABORT == evCode)
  165. {
  166. TRACE(_T("CSaveDlg::OnGraphNotify / EC_ERRORABORT, hr = %08xn"), (HRESULT)evParam1);
  167. m_report.SetWindowText(_T("Copying unexpectedly terminated!"));
  168. }
  169. }
  170. return 0;
  171. }
  172. void CSaveDlg::OnTimer(UINT nIDEvent)
  173. {
  174. if(nIDEvent == m_nIDTimerEvent && pGB)
  175. {
  176. if(pMS)
  177. {
  178. CString str;
  179. REFERENCE_TIME pos = 0, dur = 0;
  180. pMS->GetCurrentPosition(&pos);
  181. pMS->GetDuration(&dur);
  182. REFERENCE_TIME time = 0;
  183. CComQIPtr<IMediaSeeking>(pGB)->GetCurrentPosition(&time);
  184. REFERENCE_TIME speed = time > 0 ? pos*10000000/time / 1024 : 0i64;
  185. str.Format(_T("%I64d/%I64d KB, %I64d KB/s, %I64d s"), 
  186. pos/1024, dur/1024, speed, speed > 0 ? (dur-pos)/1024 / speed : 0);
  187. m_report.SetWindowText(str);
  188. m_progress.SetPos(dur > 0 ? (int)(100*pos/dur) : 0);
  189. }
  190. }
  191. CCmdUIDialog::OnTimer(nIDEvent);
  192. }