173 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // File: Source.h
 | |
| //
 | |
| // Desc: DirectShow base classes - defines classes to simplify creation of
 | |
| //       ActiveX source filters that support continuous generation of data.
 | |
| //       No support is provided for IMediaControl or IMediaPosition.
 | |
| //
 | |
| // Copyright (c) 1992-2001 Microsoft Corporation.  All rights reserved.
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| //
 | |
| // Derive your source filter from CSource.
 | |
| // During construction either:
 | |
| //    Create some CSourceStream objects to manage your pins
 | |
| //    Provide the user with a means of doing so eg, an IPersistFile interface.
 | |
| //
 | |
| // CSource provides:
 | |
| //    IBaseFilter interface management
 | |
| //    IMediaFilter interface management, via CBaseFilter
 | |
| //    Pin counting for CBaseFilter
 | |
| //
 | |
| // Derive a class from CSourceStream to manage your output pin types
 | |
| //  Implement GetMediaType/1 to return the type you support. If you support multiple
 | |
| //   types then overide GetMediaType/3, CheckMediaType and GetMediaTypeCount.
 | |
| //  Implement Fillbuffer() to put data into one buffer.
 | |
| //
 | |
| // CSourceStream provides:
 | |
| //    IPin management via CBaseOutputPin
 | |
| //    Worker thread management
 | |
| 
 | |
| #ifndef __CSOURCE__
 | |
| #define __CSOURCE__
 | |
| 
 | |
| class CSourceStream;  // The class that will handle each pin
 | |
| 
 | |
| 
 | |
| //
 | |
| // CSource
 | |
| //
 | |
| // Override construction to provide a means of creating
 | |
| // CSourceStream derived objects - ie a way of creating pins.
 | |
| class CSource : public CBaseFilter {
 | |
| public:
 | |
| 
 | |
|     CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr);
 | |
|     CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid);
 | |
| #ifdef UNICODE
 | |
|     CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr);
 | |
|     CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid);
 | |
| #endif
 | |
|     ~CSource();
 | |
| 
 | |
|     int       GetPinCount(void);
 | |
|     CBasePin *GetPin(int n);
 | |
| 
 | |
|     // -- Utilities --
 | |
| 
 | |
|     CCritSec*	pStateLock(void) { return &m_cStateLock; }	// provide our critical section
 | |
| 
 | |
|     HRESULT     AddPin(__in CSourceStream *);
 | |
|     HRESULT     RemovePin(__in CSourceStream *);
 | |
| 
 | |
|     STDMETHODIMP FindPin(
 | |
|         LPCWSTR Id,
 | |
|         __deref_out IPin ** ppPin
 | |
|     );
 | |
| 
 | |
|     int FindPinNumber(__in IPin *iPin);
 | |
|     
 | |
| protected:
 | |
| 
 | |
|     int             m_iPins;       // The number of pins on this filter. Updated by CSourceStream
 | |
|     	   			   // constructors & destructors.
 | |
|     CSourceStream **m_paStreams;   // the pins on this filter.
 | |
| 
 | |
|     CCritSec m_cStateLock;	// Lock this to serialize function accesses to the filter state
 | |
| 
 | |
| };
 | |
| 
 | |
| 
 | |
| //
 | |
| // CSourceStream
 | |
| //
 | |
| // Use this class to manage a stream of data that comes from a
 | |
| // pin.
 | |
| // Uses a worker thread to put data on the pin.
 | |
| class CSourceStream : public CAMThread, public CBaseOutputPin {
 | |
| public:
 | |
| 
 | |
|     CSourceStream(__in_opt LPCTSTR pObjectName,
 | |
|                   __inout HRESULT *phr,
 | |
|                   __inout CSource *pms,
 | |
|                   __in_opt LPCWSTR pName);
 | |
| #ifdef UNICODE
 | |
|     CSourceStream(__in_opt LPCSTR pObjectName,
 | |
|                   __inout HRESULT *phr,
 | |
|                   __inout CSource *pms,
 | |
|                   __in_opt LPCWSTR pName);
 | |
| #endif
 | |
|     virtual ~CSourceStream(void);  // virtual destructor ensures derived class destructors are called too.
 | |
| 
 | |
| protected:
 | |
| 
 | |
|     CSource *m_pFilter;	// The parent of this stream
 | |
| 
 | |
|     // *
 | |
|     // * Data Source
 | |
|     // *
 | |
|     // * The following three functions: FillBuffer, OnThreadCreate/Destroy, are
 | |
|     // * called from within the ThreadProc. They are used in the creation of
 | |
|     // * the media samples this pin will provide
 | |
|     // *
 | |
| 
 | |
|     // Override this to provide the worker thread a means
 | |
|     // of processing a buffer
 | |
|     virtual HRESULT FillBuffer(IMediaSample *pSamp) PURE;
 | |
| 
 | |
|     // Called as the thread is created/destroyed - use to perform
 | |
|     // jobs such as start/stop streaming mode
 | |
|     // If OnThreadCreate returns an error the thread will exit.
 | |
|     virtual HRESULT OnThreadCreate(void) {return NOERROR;};
 | |
|     virtual HRESULT OnThreadDestroy(void) {return NOERROR;};
 | |
|     virtual HRESULT OnThreadStartPlay(void) {return NOERROR;};
 | |
| 
 | |
|     // *
 | |
|     // * Worker Thread
 | |
|     // *
 | |
| 
 | |
|     HRESULT Active(void);    // Starts up the worker thread
 | |
|     HRESULT Inactive(void);  // Exits the worker thread.
 | |
| 
 | |
| public:
 | |
|     // thread commands
 | |
|     enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};
 | |
|     HRESULT Init(void) { return CallWorker(CMD_INIT); }
 | |
|     HRESULT Exit(void) { return CallWorker(CMD_EXIT); }
 | |
|     HRESULT Run(void) { return CallWorker(CMD_RUN); }
 | |
|     HRESULT Pause(void) { return CallWorker(CMD_PAUSE); }
 | |
|     HRESULT Stop(void) { return CallWorker(CMD_STOP); }
 | |
| 
 | |
| protected:
 | |
|     Command GetRequest(void) { return (Command) CAMThread::GetRequest(); }
 | |
|     BOOL    CheckRequest(Command *pCom) { return CAMThread::CheckRequest( (DWORD *) pCom); }
 | |
| 
 | |
|     // override these if you want to add thread commands
 | |
|     virtual DWORD ThreadProc(void);  		// the thread function
 | |
| 
 | |
|     virtual HRESULT DoBufferProcessingLoop(void);    // the loop executed whilst running
 | |
| 
 | |
| 
 | |
|     // *
 | |
|     // * AM_MEDIA_TYPE support
 | |
|     // *
 | |
| 
 | |
|     // If you support more than one media type then override these 2 functions
 | |
|     virtual HRESULT CheckMediaType(const CMediaType *pMediaType);
 | |
|     virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType);  // List pos. 0-n
 | |
| 
 | |
|     // If you support only one type then override this fn.
 | |
|     // This will only be called by the default implementations
 | |
|     // of CheckMediaType and GetMediaType(int, CMediaType*)
 | |
|     // You must override this fn. or the above 2!
 | |
|     virtual HRESULT GetMediaType(__inout CMediaType *pMediaType) {return E_UNEXPECTED;}
 | |
| 
 | |
|     STDMETHODIMP QueryId(
 | |
|         __deref_out LPWSTR * Id
 | |
|     );
 | |
| };
 | |
| 
 | |
| #endif // __CSOURCE__
 | |
| 
 |