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