mpcinfo.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. // mpcinfo.cpp : Defines the initialization routines for the DLL.
  22. //
  23. #include "stdafx.h"
  24. #include "mpcinfo.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #endif
  28. //
  29. // Note!
  30. //
  31. // If this DLL is dynamically linked against the MFC
  32. // DLLs, any functions exported from this DLL which
  33. // call into MFC must have the AFX_MANAGE_STATE macro
  34. // added at the very beginning of the function.
  35. //
  36. // For example:
  37. //
  38. // extern "C" BOOL PASCAL EXPORT ExportedFunction()
  39. // {
  40. // AFX_MANAGE_STATE(AfxGetStaticModuleState());
  41. // // normal function body here
  42. // }
  43. //
  44. // It is very important that this macro appear in each
  45. // function, prior to any calls into MFC.  This means that
  46. // it must appear as the first statement within the 
  47. // function, even before any object variable declarations
  48. // as their constructors may generate calls into the MFC
  49. // DLL.
  50. //
  51. // Please see MFC Technical Notes 33 and 58 for additional
  52. // details.
  53. //
  54. // CmpcinfoApp
  55. BEGIN_MESSAGE_MAP(CmpcinfoApp, CWinApp)
  56. END_MESSAGE_MAP()
  57. // CmpcinfoApp construction
  58. CmpcinfoApp::CmpcinfoApp()
  59. {
  60. // TODO: add construction code here,
  61. // Place all significant initialization in InitInstance
  62. }
  63. // The one and only CmpcinfoApp object
  64. CmpcinfoApp theApp;
  65. // CmpcinfoApp initialization
  66. BOOL CmpcinfoApp::InitInstance()
  67. {
  68. CWinApp::InitInstance();
  69. return TRUE;
  70. }
  71. #include <dshow.h>
  72. #include <streams.h>
  73. #include <atlbase.h>
  74. static bool GetFilterGraph(IFilterGraph** ppFG)
  75. {
  76. if(!ppFG) return(false);
  77.     CComPtr<IRunningObjectTable> pROT;
  78.     if(FAILED(GetRunningObjectTable(0, &pROT)))
  79. return 1;
  80. CComPtr<IEnumMoniker> pEM;
  81. if(FAILED(pROT->EnumRunning(&pEM)))
  82. return 1;
  83. CComPtr<IBindCtx> pBindCtx;
  84. CreateBindCtx(0, &pBindCtx);
  85. for(CComPtr<IMoniker> pMoniker; S_OK == pEM->Next(1, &pMoniker, NULL); pMoniker = NULL)
  86. {
  87. LPOLESTR pDispName = NULL;
  88. if(FAILED(pMoniker->GetDisplayName(pBindCtx, NULL, &pDispName)))
  89. continue;
  90. CStringW strw(pDispName);
  91. CComPtr<IMalloc> pMalloc;
  92. if(FAILED(CoGetMalloc(1, &pMalloc)))
  93. continue;
  94. pMalloc->Free(pDispName);
  95. if(strw.Find(L"(MPC)") < 0)
  96. continue;
  97. CComPtr<IUnknown> pUnk;
  98. if(S_OK != pROT->GetObject(pMoniker, &pUnk))
  99. continue;
  100. CComQIPtr<IFilterGraph> pFG = pUnk;
  101. if(!pFG)
  102. continue;
  103. *ppFG = pFG.Detach();
  104. break;
  105. }
  106. return(!!*ppFG);
  107. }
  108. extern "C" int WINAPI file(HWND,HWND,char *data,char*,BOOL,BOOL)
  109. {
  110. CComPtr<IFilterGraph> pFG;
  111. if(!GetFilterGraph(&pFG))
  112. return 1;
  113. CString fn;
  114. CComPtr<IEnumFilters> pEF;
  115. if(FAILED(pFG->EnumFilters(&pEF)))
  116. return 1;
  117. ULONG cFetched = 0;
  118. for(CComPtr<IBaseFilter> pBF; S_OK == pEF->Next(1, &pBF, &cFetched); pBF = NULL)
  119. {
  120. if(CComQIPtr<IFileSourceFilter> pFSF = pBF)
  121. {
  122. LPOLESTR pFileName = NULL;
  123. AM_MEDIA_TYPE mt;
  124. if(FAILED(pFSF->GetCurFile(&pFileName, &mt)))
  125. continue;
  126. fn = CStringW(pFileName);
  127. CoTaskMemFree(pFileName);
  128. FreeMediaType(mt);
  129. break;
  130. }
  131. }
  132. if(fn.IsEmpty())
  133. return 1;
  134. sprintf(data, _T("%s"), fn);
  135. return 3;
  136. }
  137. extern "C" int WINAPI size(HWND,HWND,char *data,char*,BOOL,BOOL)
  138. {
  139. if(file(0,0,data,0,0,0) != 3)
  140. return 1;
  141. CString fn = CStringA(data);
  142. data[0] = 0;
  143. HANDLE hFile = CreateFile(fn, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
  144. if(hFile == INVALID_HANDLE_VALUE)
  145. return 1;
  146. LARGE_INTEGER size;
  147. size.QuadPart = 0;
  148. size.LowPart = GetFileSize(hFile, (DWORD*)&size.HighPart);
  149. sprintf(data, _T("%I64d"), size.QuadPart);
  150. CloseHandle(hFile);
  151. return 3;
  152. }
  153. extern "C" int WINAPI pos(HWND,HWND,char *data,char*,BOOL,BOOL)
  154. {
  155. CComPtr<IFilterGraph> pFG;
  156. if(!GetFilterGraph(&pFG))
  157. return 1;
  158. CComQIPtr<IMediaSeeking> pMS = pFG;
  159. REFERENCE_TIME pos, dur;
  160. if(FAILED(pMS->GetCurrentPosition(&pos)) || FAILED(pMS->GetDuration(&dur)))
  161. return 1;
  162. if(dur > 10000000i64*60*60)
  163. {
  164. sprintf(data, _T("%02d:%02d:%02d/%02d:%02d:%02d"), 
  165. (int)(pos/10000000/60/60), (int)(pos/10000000/60)%60, (int)(pos/10000000)%60,
  166. (int)(dur/10000000/60/60), (int)(dur/10000000/60)%60, (int)(dur/10000000)%60);
  167. }
  168. else
  169. {
  170. sprintf(data, _T("%02d:%02d/%02d:%02d"), 
  171. (int)(pos/10000000/60)%60, (int)(pos/10000000)%60,
  172. (int)(dur/10000000/60)%60, (int)(dur/10000000)%60);
  173. }
  174. return 3;
  175. }
  176. extern "C" int WINAPI info(HWND,HWND,char *data,char*,BOOL,BOOL)
  177. {
  178. CStringA ret;
  179. if(file(0,0,data,0,0,0)!=3) return 1;
  180. ret += data;
  181. ret += ", ";
  182. if(size(0,0,data,0,0,0)!=3) return 1;
  183. ret += data;
  184. ret += ", ";
  185. if(pos(0,0,data,0,0,0)!=3) return 1;
  186. ret += data;
  187. strcpy(data, ret);
  188. return 3;
  189. }
  190. extern "C" int WINAPI stopped(HWND,HWND,char *data,char*,BOOL,BOOL)
  191. {
  192. sprintf(data, _T("2"));
  193. CComPtr<IFilterGraph> pFG;
  194. CComQIPtr<IMediaControl> pMC;
  195. OAFilterState fs;
  196. if(!GetFilterGraph(&pFG) || !(pMC = pFG) || FAILED(pMC->GetState(0, &fs)))
  197. return 3;
  198. sprintf(data, _T("%d"), fs == State_Stopped ? 1 : 0);
  199. return 3;
  200. }
  201. extern "C" int WINAPI paused(HWND,HWND,char *data,char*,BOOL,BOOL)
  202. {
  203. sprintf(data, _T("2"));
  204. CComPtr<IFilterGraph> pFG;
  205. CComQIPtr<IMediaControl> pMC;
  206. OAFilterState fs;
  207. if(!GetFilterGraph(&pFG) || !(pMC = pFG) || FAILED(pMC->GetState(0, &fs)))
  208. return 3;
  209. sprintf(data, _T("%d"), fs == State_Paused ? 1 : 0);
  210. return 3;
  211. }
  212. extern "C" int WINAPI running(HWND,HWND,char *data,char*,BOOL,BOOL)
  213. {
  214. sprintf(data, _T("2"));
  215. CComPtr<IFilterGraph> pFG;
  216. CComQIPtr<IMediaControl> pMC;
  217. OAFilterState fs;
  218. if(!GetFilterGraph(&pFG) || !(pMC = pFG) || FAILED(pMC->GetState(0, &fs)))
  219. return 3;
  220. sprintf(data, _T("%d"), fs == State_Running ? 1 : 0);
  221. return 3;
  222. }