//------------------------------------------------------------------------------ // 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__