00001
00002
00003
00004
00005
00006 #ifndef __CSOURCE__
00007 #define __CSOURCE__
00008
00009 class CSourceStream;
00010
00011 class CSource : public CBaseFilter {
00012 public:
00013
00014 CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr);
00015 CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid);
00016 #ifdef UNICODE
00017 CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr);
00018 CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid);
00019 #endif
00020 ~CSource();
00021
00022 int GetPinCount(void);
00023 CBasePin *GetPin(int n);
00024
00025 CCritSec* pStateLock(void) { return &m_cStateLock; }
00026
00027 HRESULT AddPin(CSourceStream *);
00028 HRESULT RemovePin(CSourceStream *);
00029
00030 STDMETHODIMP FindPin(
00031 LPCWSTR Id,
00032 IPin ** ppPin
00033 );
00034
00035 int FindPinNumber(IPin *iPin);
00036
00037 protected:
00038
00039 int m_iPins;
00040
00041 CSourceStream **m_paStreams;
00042
00043 CCritSec m_cStateLock;
00044
00045 };
00046
00047 class CSourceStream : public CAMThread, public CBaseOutputPin {
00048 public:
00049
00050 CSourceStream(TCHAR *pObjectName,
00051 HRESULT *phr,
00052 CSource *pms,
00053 LPCWSTR pName);
00054 #ifdef UNICODE
00055 CSourceStream(CHAR *pObjectName,
00056 HRESULT *phr,
00057 CSource *pms,
00058 LPCWSTR pName);
00059 #endif
00060 virtual ~CSourceStream(void);
00061
00062 protected:
00063
00064 CSource *m_pFilter;
00065
00066 virtual HRESULT FillBuffer(IMediaSample *pSamp) PURE;
00067
00068 virtual HRESULT OnThreadCreate(void) {return NOERROR;};
00069 virtual HRESULT OnThreadDestroy(void) {return NOERROR;};
00070 virtual HRESULT OnThreadStartPlay(void) {return NOERROR;};
00071
00072 HRESULT Active(void);
00073 HRESULT Inactive(void);
00074
00075 public:
00076
00077 enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};
00078 HRESULT Init(void) { return CallWorker(CMD_INIT); }
00079 HRESULT Exit(void) { return CallWorker(CMD_EXIT); }
00080 HRESULT Run(void) { return CallWorker(CMD_RUN); }
00081 HRESULT Pause(void) { return CallWorker(CMD_PAUSE); }
00082 HRESULT Stop(void) { return CallWorker(CMD_STOP); }
00083
00084 protected:
00085 Command GetRequest(void) { return (Command) CAMThread::GetRequest(); }
00086 BOOL CheckRequest(Command *pCom) { return CAMThread::CheckRequest( (DWORD *) pCom); }
00087
00088 virtual DWORD ThreadProc(void);
00089
00090 virtual HRESULT DoBufferProcessingLoop(void);
00091
00092 virtual HRESULT CheckMediaType(const CMediaType *pMediaType);
00093 virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
00094
00095 virtual HRESULT GetMediaType(CMediaType *pMediaType) {return E_UNEXPECTED;}
00096
00097 STDMETHODIMP QueryId(
00098 LPWSTR * Id
00099 );
00100 };
00101
00102 #endif
00103