2 Copyright 2004-2006 Marten Richter
\r
4 This file is part of VOMP.
\r
6 VOMP is free software; you can redistribute it and/or modify
\r
7 it under the terms of the GNU General Public License as published by
\r
8 the Free Software Foundation; either version 2 of the License, or
\r
9 (at your option) any later version.
\r
11 VOMP is distributed in the hope that it will be useful,
\r
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 GNU General Public License for more details.
\r
16 You should have received a copy of the GNU General Public License
\r
17 along with VOMP; if not, write to the Free Software
\r
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
20 #include "dssourcefilter.h"
\r
22 #define AUDIOPIN_NAME L"Audio"
\r
23 #define VIDEOPIN_NAME L"Video"
\r
25 class DsSFEnumPins: public IEnumPins {
\r
27 DsSFEnumPins(DsSourcePin* audio,DsSourcePin* video,DsSourceFilter *filt,ULONG pos=0);
\r
28 virtual ~DsSFEnumPins();
\r
29 virtual HRESULT STDMETHODCALLTYPE Next(ULONG numpin,IPin **pins,ULONG *fetched);
\r
30 virtual HRESULT STDMETHODCALLTYPE Skip(ULONG numpin);
\r
31 virtual HRESULT STDMETHODCALLTYPE Reset();
\r
32 virtual HRESULT STDMETHODCALLTYPE Clone(IEnumPins **enuma);
\r
33 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id,void ** object);
\r
34 virtual ULONG STDMETHODCALLTYPE AddRef();
\r
35 virtual ULONG STDMETHODCALLTYPE Release();
\r
37 DsSourcePin* audiopin;
\r
38 DsSourcePin* videopin;
\r
39 DsSourceFilter *filter;
\r
44 DsSFEnumPins::DsSFEnumPins(DsSourcePin* audio,DsSourcePin* video,DsSourceFilter *filt,ULONG pos){
\r
54 DsSFEnumPins::~DsSFEnumPins(){
\r
59 HRESULT STDMETHODCALLTYPE DsSFEnumPins::Next(ULONG numpin,IPin **pins,ULONG *fetched) {
\r
61 if (fetched==NULL) return E_POINTER;
\r
62 if (pins==NULL) return E_POINTER;
\r
65 for (i=0;(i<numpin)&& (curpos<2);i++) {
\r
67 case 0: audiopin->AddRef(); pins[i]=(IPin*)audiopin;break;
\r
68 case 1: videopin->AddRef(); pins[i]=(IPin*)videopin;break;
\r
73 if ((*fetched)!=numpin) return S_FALSE;
\r
77 HRESULT STDMETHODCALLTYPE DsSFEnumPins::Skip(ULONG numpin){
\r
79 if (curpos>2) return S_FALSE;
\r
82 HRESULT STDMETHODCALLTYPE DsSFEnumPins::Reset(){
\r
86 HRESULT STDMETHODCALLTYPE DsSFEnumPins::Clone(IEnumPins **enuma){
\r
87 if (enuma==NULL) return E_POINTER;
\r
88 *enuma=new DsSFEnumPins(audiopin,videopin,filter,curpos);
\r
93 HRESULT STDMETHODCALLTYPE DsSFEnumPins::QueryInterface(REFIID id,void ** object){
\r
94 if (object==NULL) return E_POINTER;
\r
95 if (id==IID_IUnknown ||id == IID_IEnumPins) {
\r
96 *object=(IUnknown*)this;
\r
97 ((IUnknown*)object)->AddRef();
\r
101 return E_NOINTERFACE;
\r
107 ULONG STDMETHODCALLTYPE DsSFEnumPins::AddRef(){
\r
108 InterlockedIncrement(&refs);
\r
110 if (tempref>1) return tempref;
\r
114 ULONG STDMETHODCALLTYPE DsSFEnumPins::Release(){
\r
115 long tempref=InterlockedDecrement(&refs);
\r
122 if (tempref>1) return tempref;
\r
133 DsSourceFilter::DsSourceFilter()
\r
137 audiopin=new DsSourcePin(this,&res,L"Vomp Audio Out",true);
\r
138 videopin=new DsSourcePin(this,&res,L"Vomp Video Out",false);
\r
141 mystate=State_Stopped;
\r
144 InitializeCriticalSection(&filterlock);
\r
148 DsSourceFilter::~DsSourceFilter()
\r
150 if (audiopin) delete audiopin;
\r
151 if (videopin) delete videopin;
\r
156 DeleteCriticalSection(&filterlock);
\r
160 HRESULT STDMETHODCALLTYPE DsSourceFilter::GetClassID(CLSID *clsid){
\r
161 if (clsid==NULL) return E_POINTER;
\r
162 *clsid=_uuidof(this);
\r
166 HRESULT STDMETHODCALLTYPE DsSourceFilter::QueryInterface(REFIID id,void ** object){
\r
167 if (object==NULL) return E_POINTER;
\r
168 if (id==IID_IUnknown) {
\r
169 *object=(IUnknown*)this;
\r
172 } else if (id==IID_IBaseFilter) {
\r
173 *object=(IBaseFilter*)this;
\r
176 } else if (id==IID_IMediaFilter) {
\r
177 *object=(IMediaFilter*)this;
\r
182 return E_NOINTERFACE;
\r
186 ULONG STDMETHODCALLTYPE DsSourceFilter::AddRef(){
\r
187 InterlockedIncrement(&refs);
\r
189 if (tempref>1) return tempref;
\r
192 ULONG STDMETHODCALLTYPE DsSourceFilter::Release(){
\r
193 long tempref=InterlockedDecrement(&refs);
\r
200 if (tempref>1) return tempref;
\r
206 HRESULT STDMETHODCALLTYPE DsSourceFilter::EnumPins(IEnumPins **enumar){
\r
207 if (enumar==NULL) return E_POINTER;
\r
208 *enumar=new DsSFEnumPins(audiopin,videopin, this);
\r
209 (*enumar)->AddRef();
\r
213 HRESULT STDMETHODCALLTYPE DsSourceFilter::FindPin(LPCWSTR iden,IPin **pin){
\r
214 if (pin==NULL) return E_POINTER;
\r
215 EnterCriticalSection(&filterlock);
\r
217 if (wcscmp(AUDIOPIN_NAME,iden)==NULL) {
\r
218 *pin=(IPin*)audiopin;
\r
220 LeaveCriticalSection(&filterlock);
\r
223 if (wcscmp(VIDEOPIN_NAME,iden)==NULL) {
\r
224 *pin=(IPin*)videopin;
\r
226 LeaveCriticalSection(&filterlock);
\r
231 LeaveCriticalSection(&filterlock);
\r
232 return VFW_E_NOT_FOUND;
\r
234 HRESULT STDMETHODCALLTYPE DsSourceFilter::QueryFilterInfo(FILTER_INFO *info){
\r
235 if (info==NULL) return E_POINTER;
\r
236 wcsncpy(info->achName,L"VompWinFilter", sizeof(info->achName)/sizeof(WCHAR));
\r
237 info->pGraph=filtergraph;
\r
238 if (info->pGraph!=NULL) info->pGraph->AddRef();
\r
242 HRESULT STDMETHODCALLTYPE DsSourceFilter::JoinFilterGraph(IFilterGraph *graph,LPCWSTR name){
\r
244 EnterCriticalSection(&filterlock);
\r
246 //filtergraph->AddRef();
\r
247 //We ignore the name
\r
248 LeaveCriticalSection(&filterlock);
\r
252 HRESULT STDMETHODCALLTYPE DsSourceFilter::QueryVendorInfo(LPWSTR *vendinf) {
\r
258 HRESULT STDMETHODCALLTYPE DsSourceFilter::GetState(DWORD timeout,FILTER_STATE *state){
\r
259 if (state==NULL) return E_POINTER;
\r
260 EnterCriticalSection(&filterlock);
\r
262 LeaveCriticalSection(&filterlock);
\r
266 HRESULT STDMETHODCALLTYPE DsSourceFilter::SetSyncSource(IReferenceClock *uhr){
\r
267 EnterCriticalSection(&filterlock);
\r
268 //MessageBox(0,"Sets ync","",0);
\r
276 LeaveCriticalSection(&filterlock);
\r
280 HRESULT STDMETHODCALLTYPE DsSourceFilter::GetSyncSource(IReferenceClock **uhr){
\r
281 if (uhr==NULL) return E_POINTER;
\r
282 EnterCriticalSection(&filterlock);
\r
283 if (clock!=NULL) clock->AddRef();
\r
285 LeaveCriticalSection(&filterlock);
\r
290 HRESULT STDMETHODCALLTYPE DsSourceFilter::Stop(){
\r
291 EnterCriticalSection(&filterlock);
\r
292 HRESULT aphres=S_OK;
\r
293 HRESULT vphres=S_OK;
\r
295 if (audiopin->IsConnected()){
\r
296 aphres=audiopin->Inactive();
\r
298 if (videopin->IsConnected()){
\r
299 vphres=videopin->Inactive();
\r
302 mystate=State_Stopped;
\r
303 LeaveCriticalSection(&filterlock);
\r
304 if (aphres!=S_OK) return aphres;
\r
305 if (vphres!=S_OK) return vphres;
\r
309 HRESULT STDMETHODCALLTYPE DsSourceFilter::Pause(){
\r
310 EnterCriticalSection(&filterlock);
\r
314 if (audiopin->IsConnected()){
\r
315 aphres=audiopin->Active();
\r
316 if (aphres!=S_OK) {
\r
317 LeaveCriticalSection(&filterlock);
\r
321 if (videopin->IsConnected()){
\r
322 vphres=videopin->Active();
\r
323 if (vphres!=S_OK) {
\r
324 LeaveCriticalSection(&filterlock);
\r
329 mystate=State_Paused;
\r
330 LeaveCriticalSection(&filterlock);
\r
335 HRESULT STDMETHODCALLTYPE DsSourceFilter::Run(REFERENCE_TIME start){
\r
339 EnterCriticalSection(&filterlock);
\r
341 if (mystate==State_Stopped) {
\r
342 HRESULT phres=Pause();
\r
344 LeaveCriticalSection(&filterlock);
\r
352 if (audiopin->IsConnected()){
\r
353 aphres=audiopin->Run(start);
\r
354 if (aphres!=S_OK) {
\r
355 LeaveCriticalSection(&filterlock);
\r
360 if (videopin->IsConnected()){
\r
361 vphres=videopin->Run(start);
\r
362 if (vphres!=S_OK) {
\r
363 LeaveCriticalSection(&filterlock);
\r
368 mystate=State_Running;
\r
369 LeaveCriticalSection(&filterlock);
\r
377 int DsSourceFilter::GetPinCount()
\r
379 return 2; //audio and video
\r
384 int DsSourceFilter::getCurrentAudioMediaSample(IMediaSample** ms)
\r
386 if (!audiopin || !IsActive()) {
\r
389 if (audiopin->getCurrentMediaSample(ms)!=S_OK) {
\r
395 int DsSourceFilter::getCurrentVideoMediaSample(IMediaSample** ms)
\r
397 if (!videopin || !IsActive()) {
\r
400 if (videopin->getCurrentMediaSample(ms)!=S_OK) {
\r
406 int DsSourceFilter::DeliverAudioMediaSample(IMediaSample* ms)
\r
408 if (!audiopin || !IsActive()) {
\r
412 if (audiopin->deliver(ms)!=S_OK) {
\r
421 int DsSourceFilter::DeliverVideoMediaSample(IMediaSample* ms)
\r
423 if (!videopin || !IsActive()) {
\r
427 if (videopin->deliver(ms)!=S_OK) {
\r