strmctxt.h
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:6k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. #pragma once
  2. // -----------------------------------------------------------------------------
  3. //
  4. //      THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  5. //      ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  6. //      THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  7. //      PARTICULAR PURPOSE.
  8. //      Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.
  9. //
  10. // -----------------------------------------------------------------------------
  11. #define VOLSHIFT (32-BITSPERSAMPLE)
  12. extern const DWORD GainMap[];
  13. class StreamContext
  14. {
  15. public:
  16.     LIST_ENTRY  m_Link;               // Link into list of streams
  17.     StreamContext() {};
  18.     virtual ~StreamContext() {};
  19.     LONG AddRef();
  20.     LONG Release();
  21.     virtual HRESULT Open(DeviceContext *pDeviceContext, LPWAVEOPENDESC lpWOD, DWORD dwFlags);
  22.     virtual DWORD Close();
  23.     virtual DWORD GetPos(PMMTIME pmmt);
  24.     virtual DWORD Run();
  25.     virtual DWORD Stop();
  26.     virtual DWORD Reset();
  27.     virtual PBYTE Render(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)=0;
  28.     BOOL StillPlaying() {return (m_lpWaveHdrHead!=NULL);}
  29.     DWORD GetByteCount() {return m_dwByteCount;}
  30.     WAVEFORMATEX *GetWaveFormat() {return &m_WaveFormat;}
  31.     DeviceContext *GetDeviceContext() { return m_pDeviceContext; }
  32.     void DoDriverCallback(UINT msg, DWORD dwParam1, DWORD dwParam2)
  33.     {
  34.         m_pfnCallback(m_hWave,msg,m_dwInstance,dwParam1,dwParam2);
  35.     }
  36.     virtual DoCallbackReturnBuffer(LPWAVEHDR lpHdr)
  37.     {
  38.         DoDriverCallback(WOM_DONE,(DWORD)lpHdr,0);
  39.     }
  40.     virtual DoCallbackStreamOpened()
  41.     {
  42.         DoDriverCallback(WOM_OPEN,0,0);
  43.     }
  44.     virtual DoCallbackStreamClosed()
  45.     {
  46.         DoDriverCallback(WOM_CLOSE,0,0);
  47.     }
  48.     virtual DWORD QueueBuffer(LPWAVEHDR lpWaveHdr);
  49.     PBYTE GetNextBuffer();
  50.     // Default implementation
  51.     void ReturnBuffer(LPWAVEHDR lpHdr)
  52.     {
  53.         lpHdr->dwFlags &= ~WHDR_INQUEUE;
  54.         lpHdr->dwFlags |= WHDR_DONE;
  55.         DoCallbackReturnBuffer(lpHdr);
  56.     }
  57.     DWORD GetGain()
  58.     {
  59.         return m_dwGain;
  60.     }
  61.     DWORD SetGain(DWORD dwGain)
  62.     {
  63.         m_dwGain = dwGain;
  64.         GainChange();
  65.         return MMSYSERR_NOERROR;
  66.     }
  67.     DWORD SetSecondaryGainClass(DWORD GainClass)
  68.     {
  69.         if (GainClass>=SECONDARYGAINCLASSMAX)
  70.         {
  71.             return MMSYSERR_ERROR;
  72.         }
  73.         m_SecondaryGainClass=GainClass;
  74.         GainChange();
  75.         return MMSYSERR_NOERROR;
  76.     }
  77.     DWORD MapGain(DWORD Gain);
  78.     virtual void GainChange()
  79.     {
  80.         m_fxpGain = MapGain(m_dwGain);
  81.     }
  82.     static void ClearBuffer(PBYTE pStart, PBYTE pEnd) {memset(pStart,0,pEnd-pStart);}
  83.     DWORD BreakLoop();
  84.     DWORD ForceSpeaker (BOOL bForceSpeaker);
  85. protected:
  86.     LONG            m_RefCount;
  87.     BOOL            m_bRunning;         // Is stream running or stopped
  88.     DWORD           m_dwFlags;          // allocation flags
  89.     HWAVE           m_hWave;            // handle for stream
  90.     DRVCALLBACK*    m_pfnCallback;      // client's callback
  91.     DWORD           m_dwInstance;       // client's instance data
  92.     WAVEFORMATEX    m_WaveFormat;       // Format of wave data
  93.     LPWAVEHDR   m_lpWaveHdrHead;
  94.     LPWAVEHDR   m_lpWaveHdrCurrent;
  95.     LPWAVEHDR   m_lpWaveHdrTail;
  96.     PBYTE       m_lpCurrData;            // position in current buffer
  97.     PBYTE       m_lpCurrDataEnd;         // end of current buffer
  98.     DWORD       m_dwByteCount;          // byte count since last reset
  99.     DeviceContext *m_pDeviceContext;   // Device which this stream renders to
  100.     // Loopcount shouldn't really be here, since it's really for wave output only, but it makes things easier
  101.     DWORD       m_dwLoopCount;          // Number of times left through loop
  102.     DWORD       m_dwGain;
  103.     DWORD       m_SecondaryGainClass;
  104.     DWORD       m_fxpGain;
  105.     BOOL        m_bForceSpeaker;
  106. };
  107. class WaveStreamContext : public StreamContext
  108. {
  109. public:
  110.     HRESULT Open(DeviceContext *pDeviceContext, LPWAVEOPENDESC lpWOD, DWORD dwFlags);
  111.     DWORD GetRate(DWORD *pdwMultiplier);
  112.     virtual DWORD SetRate(DWORD dwMultiplier) = 0;
  113.     PBYTE Render(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast);
  114.     virtual PBYTE Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast)=0;
  115. protected:
  116.     PCM_TYPE m_SampleType;       // Enum of sample type, e.g. M8, M16, S8, S16
  117.     ULONG    m_SampleSize;       // # of bytes per sample in client buffer
  118.     DWORD    m_DeltaT;   // Sample rate conversion factor
  119.     DWORD    m_dwMultiplier;
  120.     LONG     m_PrevSamp[OUTCHANNELS];
  121.     LONG     m_CurrSamp[OUTCHANNELS];
  122.     LONG     m_CurrT;
  123. };
  124. class InputStreamContext : public WaveStreamContext
  125. {
  126. public:
  127.     DWORD SetRate(DWORD dwMultiplier);
  128.     DWORD Stop();   // On input, stop has special handling
  129.     PBYTE Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast);
  130.     virtual DoCallbackReturnBuffer(LPWAVEHDR lpHdr)
  131.     {
  132.         DoDriverCallback(WIM_DATA,(DWORD)lpHdr,0);
  133.     }
  134.     virtual DoCallbackStreamOpened()
  135.     {
  136.         DoDriverCallback(WIM_OPEN,0,0);
  137.     }
  138.     virtual DoCallbackStreamClosed()
  139.     {
  140.         DoDriverCallback(WIM_CLOSE,0,0);
  141.     }
  142. };
  143. class OutputStreamContext : public WaveStreamContext
  144. {
  145. public:
  146.     HRESULT Open(DeviceContext *pDeviceContext, LPWAVEOPENDESC lpWOD, DWORD dwFlags);
  147.     DWORD Reset();
  148.     DWORD SetRate(DWORD dwMultiplier);
  149. };
  150. class OutputStreamContextM8 : public OutputStreamContext
  151. {
  152. public:
  153.     PBYTE Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast);
  154. };
  155. class OutputStreamContextM16 : public OutputStreamContext
  156. {
  157. public:
  158.     PBYTE Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast);
  159. };
  160. class OutputStreamContextS8 : public OutputStreamContext
  161. {
  162. public:
  163.     PBYTE Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast);
  164. };
  165. class OutputStreamContextS16 : public OutputStreamContext
  166. {
  167. public:
  168.     PBYTE Render2(PBYTE pBuffer, PBYTE pBufferEnd, PBYTE pBufferLast);
  169. };