home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Game_Audio / audio_sdk / src / AudioLib / WMA.h < prev   
C/C++ Source or Header  |  2002-07-14  |  4KB  |  179 lines

  1. /***********************************************************\
  2. Copyright (C) James Boer, 2002. 
  3. All rights reserved worldwide.
  4.  
  5. This software is provided "as is" without express or implied
  6. warranties. You may freely copy and compile this source into
  7. applications you distribute provided that the copyright text
  8. below is included in the resulting source code, for example:
  9. "Portions Copyright (C) James Boer, 2002"
  10. \***********************************************************/
  11. #ifndef __WMA_H__
  12. #define __WMA_H__
  13.  
  14. #ifdef USE_WMA
  15.  
  16.  
  17. #include "Audio.h"
  18. #include "IAudioLoader.h"
  19. #include "WMSDK.h"
  20.  
  21.  
  22. namespace Audio
  23. {
  24.  
  25. class WMACallback : public IWMReaderCallback, public IWMReaderCallbackAdvanced
  26. {
  27. public:
  28.     WMACallback();
  29.     virtual ~WMACallback();
  30.     void Clear();
  31.  
  32.     HRESULT __stdcall QueryInterface(
  33.         const struct _GUID& guid, 
  34.         void** ppInterface);
  35.     ULONG __stdcall AddRef();
  36.     ULONG __stdcall Release();
  37.  
  38.     HRESULT __stdcall OnStatus(
  39.         WMT_STATUS  Status,
  40.         HRESULT  hr,
  41.         WMT_ATTR_DATATYPE  dwType,
  42.         BYTE*  pValue,
  43.         void*  pvContext);
  44.  
  45.     HRESULT __stdcall OnSample(
  46.         DWORD  dwOutputNum,
  47.         QWORD  cnsSampleTime,
  48.         QWORD  cnsSampleDuration,
  49.         DWORD  dwFlags,
  50.         INSSBuffer*  pSample,
  51.         void*  pvContext);
  52.  
  53.      HRESULT __stdcall OnStreamSample( 
  54.         WORD wStreamNum,
  55.         QWORD cnsSampleTime,
  56.         QWORD cnsSampleDuration,
  57.         DWORD dwFlags,
  58.         INSSBuffer __RPC_FAR *pSample,
  59.         void __RPC_FAR *pvContext);
  60.     
  61.     HRESULT __stdcall OnTime( 
  62.         QWORD qwCurrentTime,
  63.         void __RPC_FAR *pvContext);
  64.  
  65.    HRESULT __stdcall OnStreamSelection( 
  66.         WORD wStreamCount,
  67.         WORD __RPC_FAR *pStreamNumbers,
  68.         WMT_STREAM_SELECTION __RPC_FAR *pSelections,
  69.         void __RPC_FAR *pvContext);
  70.  
  71.     HRESULT __stdcall OnOutputPropsChanged( 
  72.         DWORD dwOutputNum,
  73.         WM_MEDIA_TYPE __RPC_FAR *pMediaType,
  74.         void __RPC_FAR *pvContext );
  75.  
  76.     HRESULT __stdcall AllocateForOutput( 
  77.         DWORD dwOutputNum,
  78.         DWORD cbBuffer,
  79.         INSSBuffer __RPC_FAR *__RPC_FAR *ppBuffer,
  80.         void __RPC_FAR *pvContext);
  81.  
  82.     HRESULT __stdcall AllocateForStream( 
  83.         WORD wStreamNum,
  84.         DWORD cbBuffer,
  85.         INSSBuffer __RPC_FAR *__RPC_FAR *ppBuffer,
  86.         void __RPC_FAR *pvContext);
  87.  
  88.  
  89. private:
  90.     LONG    m_iRefCount;
  91. };
  92.  
  93.  
  94.  
  95. class WMA : public IAudioLoader
  96. {
  97. DEFINE_POOL(WMA);
  98.  
  99. public:
  100.     void Clear();
  101.  
  102.     // This Open function is used if the source is to be streamed from the disk
  103.     bool Open(std::string sFileName);
  104.     bool Open(BYTE* pbData, uint32 dwDataSize);
  105.     bool Close();
  106.  
  107.     bool Read(uint8* pBuffer, uint32 dwSizeToRead, uint32* pdwSizeRead );
  108.  
  109.     uint32            GetSize();
  110.     bool            Reset();
  111.     WAVEFORMATEX*    GetFormat();
  112.     bool            IsEOF();
  113.  
  114.     void            Destroy();
  115.  
  116.     friend class WMACallback;
  117.  
  118. protected:
  119.     virtual ~WMA();
  120. private:
  121.     WMA();
  122.  
  123.     bool PreOpen();
  124.     bool PostOpen();
  125.  
  126.     bool OpenReader();
  127.  
  128.     HRESULT OnStatus(
  129.         WMT_STATUS  Status,
  130.         HRESULT  hr,
  131.         WMT_ATTR_DATATYPE  dwType,
  132.         BYTE*  pValue);
  133.  
  134.     HRESULT OnSample(
  135.         DWORD  dwOutputNum,
  136.         QWORD  cnsSampleTime,
  137.         QWORD  cnsSampleDuration,
  138.         DWORD  dwFlags,
  139.         INSSBuffer*  pSample);
  140.  
  141.     HRESULT STDMETHODCALLTYPE OnTime( 
  142.         QWORD qwCurrentTime);
  143. private:
  144.     
  145.     IWMReader*            m_pReader;
  146.     IWMReaderAdvanced*    m_pReaderAdvanced;
  147.     IWMReaderAdvanced2*    m_pReaderAdvanced2;
  148.     IWMHeaderInfo*        m_pHeaderInfo;
  149.     WAVEFORMATEX        m_WaveFormatEx;
  150.     WMACallback            m_Callback;
  151.  
  152.     HANDLE                m_hWaitEvent;
  153.     HANDLE                m_hRespondEvent;
  154.  
  155.     bool                m_bOpen;
  156.  
  157.     HRESULT                m_hrCallbackResult;
  158.  
  159.     uint32                m_nStreamSize;
  160.     uint32                m_nBytesRead;
  161.  
  162.     bool                m_bFirstRead;
  163.     uint8*                m_pBuffer;
  164.     uint32                m_nBufferSize;
  165.     uint32                m_nWritePtr;
  166.     uint32                m_nTargetPtr;
  167.     bool                m_bEOF;
  168.     uint64                m_qwTime;
  169.  
  170.     CRITICAL_SECTION    m_csTerm;
  171.  
  172. };
  173.  
  174. }; // namespace Audio
  175.  
  176. #endif // USE_WMA
  177.  
  178.  
  179. #endif // __WMA_H__