VisAudioSamples.h
上传用户:weixiumei
上传日期:2008-05-15
资源大小:1769k
文件大小:5k
开发平台:

Visual C++

  1. // VisAudioSamples.h
  2. //
  3. // Copyright  2000 Microsoft Corporation, All Rights Reserved
  4. #ifndef __VIS_CORE_AUDIO_SAMPLES_H__
  5. #define __VIS_CORE_AUDIO_SAMPLES_H__
  6. #if _MSC_VER >= 1000
  7. #pragma once
  8. #endif // _MSC_VER >= 1000
  9. #include <vector>
  10. //
  11. // function used to keep a consistent relationship between time and
  12. // sample number through out
  13. // Time is in 100ns ticks
  14. // Rate is in samples/sec
  15. //
  16. VisCoreExport long  AudioSampleNumber( INT64 StartTime, long SampleRate );
  17. VisCoreExport long  AudioSampleCount ( INT64 Duration, long SampleRate );
  18. enum AUDIO_CHANNEL_STATE
  19. {
  20.     AUDIO_CHANNEL_READ_ACCESS  = 0,
  21.     AUDIO_CHANNEL_WRITE_ACCESS = 1
  22. };
  23. enum MEMORY_ACCESS_EVENT
  24. {
  25.     MEMORY_ACCESS_START_READ   = 0,
  26.     MEMORY_ACCESS_END_READ     = 1,
  27.     MEMORY_ACCESS_START_WRITE  = 2,
  28.     MEMORY_ACCESS_END_WRITE    = 3
  29. };
  30. class CVisAudioChannel : public CVisStreamErrorBase
  31. {
  32. public:
  33.     VisCoreExport CVisAudioChannel( UINT uSampleRate, bool fThrow = true );
  34.     VisCoreExport ~CVisAudioChannel();
  35.     VisCoreExport int AddRef();
  36.     VisCoreExport int Release();
  37.     inline UINT   SampleRate(void) const;
  38.     
  39.     // used to read the channel data
  40.     VisCoreExport const float* StartRead( INT64 ilStartTime,
  41.                                           INT64 ilDuration,
  42.                                           UINT* pNumSamples );
  43.     VisCoreExport BOOL   EndRead( INT64 ilStartTime, INT64 ilDuration );
  44.     // used to write channel data
  45.     VisCoreExport float* StartWrite( INT64 ilStartTime,
  46.                                      INT64 ilDuration,
  47.                                      UINT* pNumSamples );
  48.     VisCoreExport  BOOL  EndWrite( INT64 ilStartTime, INT64 ilDuration );
  49.     // verify that data in a certain time range has been written
  50.     VisCoreExport BOOL   BeenWritten( INT64 ilStartTime, INT64 ilDuration );
  51. private:
  52.     BOOL   MemoryAccessEvent( MEMORY_ACCESS_EVENT event );
  53.     long         m_iRefCount;
  54.     UINT         m_uSampleRate;
  55.     INT64        m_ilDuration;
  56.     AUDIO_CHANNEL_STATE m_uMemoryState;
  57.     CRITICAL_SECTION    m_MemoryStateMutex;
  58.     UINT         m_uMemoryAccessCount;
  59.     UINT         m_uWaitingForWrite;
  60.     HANDLE       m_MemoryWriteSema;
  61.     UINT         m_uWaitingForRead;
  62.     HANDLE       m_MemoryReadEvent;
  63.     UINT         m_uTotalSamples;
  64.     UINT*        m_puSamplesWritten;
  65.     float*       m_pfSamples;
  66. };
  67. class CVisAudioData : public CVisStreamErrorBase
  68. {
  69. public:
  70.     VisCoreExport CVisAudioData( bool fThrow = true );
  71.     VisCoreExport CVisAudioData( CVisAudioData& ref, INT64 ilStartOffset, INT64 ilDuration,
  72.                                  bool fThrow = true );
  73.     VisCoreExport ~CVisAudioData( );
  74.     // method to use when reading from a stream
  75.     VisCoreExport BOOL   InitializeFromStream( CVisStreamHandler*,
  76.                                                INT64 StartTime,
  77.                                                INT64 Duration );
  78.     
  79.     // methods used when writing to a stream
  80.     inline BOOL   WriteToStream( CVisStreamHandler* pStream,
  81.                                  INT64 StartTimeInStream );
  82.     // methods used to intialize and access the audio data
  83.     VisCoreExport BOOL   InitializeChannel( UINT uChannelNum, CVisAudioChannel*, 
  84.                                             INT64 StartTime,  INT64 Duration );
  85.     VisCoreExport const float* StartReadChannel ( UINT uChannelNum, INT64 ilOffset, 
  86.                                                   INT64 ilDuration, UINT* pNumSamples ); 
  87.     VisCoreExport BOOL   EndReadChannel    ( UINT uChannelNum, INT64 ilOffset, INT64 ilDuration ); 
  88.     
  89.     VisCoreExport float* StartWriteChannel ( UINT uChannelNum, INT64 ilOffset, 
  90.                                              INT64 ilDuration, UINT* pNumSamples ); 
  91.     VisCoreExport BOOL   EndWriteChannel   ( UINT uChannelNum, INT64 ilOffset, INT64 ilDuration ); 
  92.     
  93.     VisCoreExport CVisAudioData& operator=(const CVisAudioData& Src);
  94.     // accessor methods for private data
  95.     VisCoreExport INT64  StartTime(UINT uChannelNum);
  96.     inline INT64  Duration(void)    const;
  97.     inline UINT   NumChannels(void) const;
  98.     inline UINT   SampleRate(void)  const;
  99.     inline CVisAudioChannel* AudioChannel(UINT i) const;
  100. private:
  101.     void   ClearChannels();
  102.     typedef struct {
  103.         INT64             m_ilStartTime;
  104.         CVisAudioChannel* m_pAudioChan;
  105.     } ChannelInfo;
  106.     typedef std::vector<ChannelInfo> T_AudioChanVec;
  107.         
  108.     INT64              m_ilDuration;
  109.     INT64              m_ilStartTime;
  110.     T_AudioChanVec     m_Channels;
  111.     CVisStreamHandler* m_pVisStreamHandler;
  112. };
  113. #include "VisAudioSamples.inl"
  114. #endif // __VIS_CORE_AUDIO_SAMPLES_H__