source.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:6k
源码类别:

P2P编程

开发平台:

Visual C++

  1. //------------------------------------------------------------------------------
  2. // File: Source.h
  3. //
  4. // Desc: DirectShow base classes - defines classes to simplify creation of
  5. //       ActiveX source filters that support continuous generation of data.
  6. //       No support is provided for IMediaControl or IMediaPosition.
  7. //
  8. // Copyright (c) Microsoft Corporation.  All rights reserved.
  9. //------------------------------------------------------------------------------
  10. //
  11. // Derive your source filter from CSource.
  12. // During construction either:
  13. //    Create some CSourceStream objects to manage your pins
  14. //    Provide the user with a means of doing so eg, an IPersistFile interface.
  15. //
  16. // CSource provides:
  17. //    IBaseFilter interface management
  18. //    IMediaFilter interface management, via CBaseFilter
  19. //    Pin counting for CBaseFilter
  20. //
  21. // Derive a class from CSourceStream to manage your output pin types
  22. //  Implement GetMediaType/1 to return the type you support. If you support multiple
  23. //   types then overide GetMediaType/3, CheckMediaType and GetMediaTypeCount.
  24. //  Implement Fillbuffer() to put data into one buffer.
  25. //
  26. // CSourceStream provides:
  27. //    IPin management via CBaseOutputPin
  28. //    Worker thread management
  29. #ifndef __CSOURCE__
  30. #define __CSOURCE__
  31. class CSourceStream;  // The class that will handle each pin
  32. //
  33. // CSource
  34. //
  35. // Override construction to provide a means of creating
  36. // CSourceStream derived objects - ie a way of creating pins.
  37. class CSource : public CBaseFilter {
  38. public:
  39.     CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr);
  40.     CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid);
  41. #ifdef UNICODE
  42.     CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr);
  43.     CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid);
  44. #endif
  45.     ~CSource();
  46.     int       GetPinCount(void);
  47.     CBasePin *GetPin(int n);
  48.     // -- Utilities --
  49.     CCritSec* pStateLock(void) { return &m_cStateLock; } // provide our critical section
  50.     HRESULT     AddPin(CSourceStream *);
  51.     HRESULT     RemovePin(CSourceStream *);
  52.     STDMETHODIMP FindPin(
  53.         LPCWSTR Id,
  54.         IPin ** ppPin
  55.     );
  56.     int FindPinNumber(IPin *iPin);
  57.     
  58. protected:
  59.     int             m_iPins;       // The number of pins on this filter. Updated by CSourceStream
  60.             // constructors & destructors.
  61.     CSourceStream **m_paStreams;   // the pins on this filter.
  62.     CCritSec m_cStateLock; // Lock this to serialize function accesses to the filter state
  63. };
  64. //
  65. // CSourceStream
  66. //
  67. // Use this class to manage a stream of data that comes from a
  68. // pin.
  69. // Uses a worker thread to put data on the pin.
  70. class CSourceStream : public CAMThread, public CBaseOutputPin {
  71. public:
  72.     CSourceStream(TCHAR *pObjectName,
  73.                   HRESULT *phr,
  74.                   CSource *pms,
  75.                   LPCWSTR pName);
  76. #ifdef UNICODE
  77.     CSourceStream(CHAR *pObjectName,
  78.                   HRESULT *phr,
  79.                   CSource *pms,
  80.                   LPCWSTR pName);
  81. #endif
  82.     virtual ~CSourceStream(void);  // virtual destructor ensures derived class destructors are called too.
  83. protected:
  84.     CSource *m_pFilter; // The parent of this stream
  85.     // *
  86.     // * Data Source
  87.     // *
  88.     // * The following three functions: FillBuffer, OnThreadCreate/Destroy, are
  89.     // * called from within the ThreadProc. They are used in the creation of
  90.     // * the media samples this pin will provide
  91.     // *
  92.     // Override this to provide the worker thread a means
  93.     // of processing a buffer
  94.     virtual HRESULT FillBuffer(IMediaSample *pSamp) PURE;
  95.     // Called as the thread is created/destroyed - use to perform
  96.     // jobs such as start/stop streaming mode
  97.     // If OnThreadCreate returns an error the thread will exit.
  98.     virtual HRESULT OnThreadCreate(void) {return NOERROR;};
  99.     virtual HRESULT OnThreadDestroy(void) {return NOERROR;};
  100.     virtual HRESULT OnThreadStartPlay(void) {return NOERROR;};
  101.     // *
  102.     // * Worker Thread
  103.     // *
  104.     HRESULT Active(void);    // Starts up the worker thread
  105.     HRESULT Inactive(void);  // Exits the worker thread.
  106. public:
  107.     // thread commands
  108.     enum Command {CMD_INIT, CMD_PAUSE, CMD_RUN, CMD_STOP, CMD_EXIT};
  109.     HRESULT Init(void) { return CallWorker(CMD_INIT); }
  110.     HRESULT Exit(void) { return CallWorker(CMD_EXIT); }
  111.     HRESULT Run(void) { return CallWorker(CMD_RUN); }
  112.     HRESULT Pause(void) { return CallWorker(CMD_PAUSE); }
  113.     HRESULT Stop(void) { return CallWorker(CMD_STOP); }
  114. protected:
  115.     Command GetRequest(void) { return (Command) CAMThread::GetRequest(); }
  116.     BOOL    CheckRequest(Command *pCom) { return CAMThread::CheckRequest( (DWORD *) pCom); }
  117.     // override these if you want to add thread commands
  118.     virtual DWORD ThreadProc(void);   // the thread function
  119.     virtual HRESULT DoBufferProcessingLoop(void);    // the loop executed whilst running
  120.     // *
  121.     // * AM_MEDIA_TYPE support
  122.     // *
  123.     // If you support more than one media type then override these 2 functions
  124.     virtual HRESULT CheckMediaType(const CMediaType *pMediaType);
  125.     virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);  // List pos. 0-n
  126.     // If you support only one type then override this fn.
  127.     // This will only be called by the default implementations
  128.     // of CheckMediaType and GetMediaType(int, CMediaType*)
  129.     // You must override this fn. or the above 2!
  130.     virtual HRESULT GetMediaType(CMediaType *pMediaType) {return E_UNEXPECTED;}
  131.     STDMETHODIMP QueryId(
  132.         LPWSTR * Id
  133.     );
  134. };
  135. #endif // __CSOURCE__