ShockwaveGraph.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. #include "stdafx.h"
  22. #include "shockwavegraph.h"
  23. #include "resource.h"
  24. #include "....DSUtilDSUtil.h"
  25. CShockwaveGraph::CShockwaveGraph(HWND hParent, HRESULT& hr)
  26. : m_fs(State_Stopped)
  27. {
  28. hr = S_OK;
  29. if(!m_wndWindowFrame.Create(NULL, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
  30. CRect(0, 0, 0, 0), CWnd::FromHandle(hParent), 0, NULL))
  31. {
  32. hr = E_FAIL;
  33. return;
  34. }
  35. if(!m_wndDestFrame.Create(NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 
  36. CRect(0, 0, 0, 0), &m_wndWindowFrame, 0))
  37. {
  38. hr = E_FAIL;
  39. return;
  40. }
  41. }
  42. CShockwaveGraph::~CShockwaveGraph()
  43. {
  44. m_wndDestFrame.DestroyWindow();
  45. m_wndWindowFrame.DestroyWindow();
  46. }
  47. // IGraphBuilder
  48. STDMETHODIMP CShockwaveGraph::RenderFile(LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList)
  49. {
  50. try {m_wndDestFrame.LoadMovie(0, CString(lpcwstrFile));}
  51. catch(CException* e) {e->Delete(); return E_FAIL;}
  52. return S_OK;
  53. }
  54. // IMediaControl
  55. STDMETHODIMP CShockwaveGraph::Run()
  56. {
  57. try {if(m_fs != State_Running) m_wndDestFrame.Play();}
  58. catch(CException* e) {e->Delete(); return E_FAIL;}
  59. m_fs = State_Running;
  60. m_wndWindowFrame.EnableWindow();
  61. // m_wndDestFrame.EnableWindow();
  62. return S_OK;
  63. }
  64. STDMETHODIMP CShockwaveGraph::Pause()
  65. {
  66. try {if(m_fs == State_Running) m_wndDestFrame.Stop();}
  67. catch(CException* e) {e->Delete(); return E_FAIL;}
  68. m_fs = State_Paused;
  69. return S_OK;
  70. }
  71. STDMETHODIMP CShockwaveGraph::Stop()
  72. {
  73. try {m_wndDestFrame.Stop();}
  74. catch(CException* e) {e->Delete(); return E_FAIL;}
  75. m_fs = State_Stopped;
  76. return S_OK;
  77. }
  78. STDMETHODIMP CShockwaveGraph::GetState(LONG msTimeout, OAFilterState* pfs)
  79. {
  80. OAFilterState fs = m_fs;
  81. try
  82. {
  83. if(m_wndDestFrame.IsPlaying() && m_fs == State_Stopped) m_fs = State_Running;
  84. else if(!m_wndDestFrame.IsPlaying() && m_fs == State_Running) m_fs = State_Stopped;
  85. fs = m_fs;
  86. }
  87. catch(CException* e)
  88. {
  89. e->Delete();
  90. return E_FAIL;
  91. }
  92. return pfs ? *pfs = fs, S_OK : E_POINTER;
  93. }
  94. // IMediaSeeking
  95. STDMETHODIMP CShockwaveGraph::IsFormatSupported(const GUID* pFormat)
  96. {
  97. return !pFormat ? E_POINTER : *pFormat == TIME_FORMAT_FRAME ? S_OK : S_FALSE;
  98. }
  99. STDMETHODIMP CShockwaveGraph::GetTimeFormat(GUID* pFormat)
  100. {
  101. return pFormat ? *pFormat = TIME_FORMAT_FRAME, S_OK : E_POINTER;
  102. }
  103. STDMETHODIMP CShockwaveGraph::GetDuration(LONGLONG* pDuration)
  104. {
  105. CheckPointer(pDuration, E_POINTER);
  106. *pDuration = 0;
  107. try {if(m_wndDestFrame.get_ReadyState() >= READYSTATE_COMPLETE) *pDuration = m_wndDestFrame.get_TotalFrames();}
  108. catch(CException* e) {e->Delete(); return E_FAIL;}
  109. return S_OK;
  110. }
  111. STDMETHODIMP CShockwaveGraph::GetCurrentPosition(LONGLONG* pCurrent)
  112. {
  113. CheckPointer(pCurrent, E_POINTER);
  114. *pCurrent = 0;
  115. try {if(m_wndDestFrame.get_ReadyState() >= READYSTATE_COMPLETE) *pCurrent = m_wndDestFrame.get_FrameNum();}
  116. catch(CException* e) {e->Delete(); return E_FAIL;}
  117. return S_OK;
  118. }
  119. STDMETHODIMP CShockwaveGraph::SetPositions(LONGLONG* pCurrent, DWORD dwCurrentFlags, LONGLONG* pStop, DWORD dwStopFlags)
  120. {
  121. if(dwCurrentFlags&AM_SEEKING_AbsolutePositioning)
  122. {
  123. m_wndDestFrame.put_FrameNum(*pCurrent);
  124. if(m_fs == State_Running && !m_wndDestFrame.IsPlaying()) 
  125. m_wndDestFrame.Play();
  126. else if((m_fs == State_Paused || m_fs == State_Stopped) && m_wndDestFrame.IsPlaying())
  127. m_wndDestFrame.Stop();
  128. m_wndDestFrame.put_Quality(1); // 0=Low, 1=High, 2=AutoLow, 3=AutoHigh
  129. return S_OK;
  130. }
  131. return E_INVALIDARG;
  132. }
  133. // IVideoWindow
  134. STDMETHODIMP CShockwaveGraph::put_Visible(long Visible)
  135. {
  136. if(IsWindow(m_wndDestFrame.m_hWnd))
  137. m_wndDestFrame.ShowWindow(Visible == OATRUE ? SW_SHOWNORMAL : SW_HIDE);
  138. return S_OK;
  139. }
  140. STDMETHODIMP CShockwaveGraph::get_Visible(long* pVisible)
  141. {
  142. return pVisible ? *pVisible = (m_wndDestFrame.IsWindowVisible() ? OATRUE : OAFALSE), S_OK : E_POINTER;
  143. }
  144. STDMETHODIMP CShockwaveGraph::SetWindowPosition(long Left, long Top, long Width, long Height)
  145. {
  146. if(IsWindow(m_wndWindowFrame.m_hWnd))
  147. m_wndWindowFrame.MoveWindow(Left, Top, Width, Height);
  148. return S_OK;
  149. }
  150. // IBasicVideo
  151. STDMETHODIMP CShockwaveGraph::SetDestinationPosition(long Left, long Top, long Width, long Height)// {return E_NOTIMPL;}
  152. {
  153. if(IsWindow(m_wndDestFrame.m_hWnd))
  154. m_wndDestFrame.MoveWindow(Left, Top, Width, Height);
  155. return S_OK;
  156. }
  157. STDMETHODIMP CShockwaveGraph::GetVideoSize(long* pWidth, long* pHeight)
  158. {
  159. if(!pWidth || !pHeight) return E_POINTER;
  160. CRect r;
  161. m_wndWindowFrame.GetWindowRect(r);
  162. if(!r.IsRectEmpty())
  163. {
  164. *pWidth = r.Width();
  165. *pHeight = r.Height();
  166. }
  167. else
  168. {
  169. // no call exists to determine these...
  170. *pWidth = 384;//m_wndDestFrame.get_; 
  171. *pHeight = 288;
  172. NotifyEvent(EC_BG_AUDIO_CHANGED, 2, 0);
  173. }
  174. return S_OK;
  175. }
  176. #include <math.h>
  177. // IBasicAudio
  178. STDMETHODIMP CShockwaveGraph::put_Volume(long lVolume)
  179. {
  180. lVolume = (lVolume == -10000) ? 0 : (int)pow(10.0, ((double)lVolume)/5000+2);
  181. lVolume = lVolume*0x10000/100;
  182. lVolume = max(min(lVolume, 0xffff), 0);
  183. waveOutSetVolume(0, (lVolume<<16)|lVolume);
  184. return S_OK;
  185. }
  186. STDMETHODIMP CShockwaveGraph::get_Volume(long* plVolume)
  187. {
  188. CheckPointer(plVolume, E_POINTER);
  189. waveOutGetVolume(0, (DWORD*)plVolume);
  190. *plVolume = (*plVolume&0xffff + ((*plVolume>>16)&0xffff)) / 2;
  191. *plVolume = *plVolume*100/0x10000;
  192. *plVolume = (int)((log10(1.0*(*plVolume))-2)*5000);
  193. *plVolume = max(min(*plVolume, 0), -10000);
  194. return S_OK;
  195. }
  196. // IAMOpenProgress
  197. STDMETHODIMP CShockwaveGraph::QueryProgress(LONGLONG* pllTotal, LONGLONG* pllCurrent)
  198. {
  199. *pllTotal = 100;
  200. *pllCurrent = m_wndDestFrame.PercentLoaded();
  201. return S_OK;
  202. }
  203. // IGraphEngine
  204. STDMETHODIMP_(engine_t) CShockwaveGraph::GetEngine() {return ShockWave;}