visaudiosamples.h

来自「microsoft vision source code」· C头文件 代码 · 共 143 行

H
143
字号
// VisAudioSamples.h
//
// Copyright  2000 Microsoft Corporation, All Rights Reserved


#ifndef __VIS_CORE_AUDIO_SAMPLES_H__
#define __VIS_CORE_AUDIO_SAMPLES_H__

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include <vector>

//
// function used to keep a consistent relationship between time and
// sample number through out
// Time is in 100ns ticks
// Rate is in samples/sec
//
VisCoreExport long  AudioSampleNumber( INT64 StartTime, long SampleRate );
VisCoreExport long  AudioSampleCount ( INT64 Duration, long SampleRate );

enum AUDIO_CHANNEL_STATE
{
    AUDIO_CHANNEL_READ_ACCESS  = 0,
    AUDIO_CHANNEL_WRITE_ACCESS = 1
};

enum MEMORY_ACCESS_EVENT
{
    MEMORY_ACCESS_START_READ   = 0,
    MEMORY_ACCESS_END_READ     = 1,
    MEMORY_ACCESS_START_WRITE  = 2,
    MEMORY_ACCESS_END_WRITE    = 3
};

class CVisAudioChannel : public CVisStreamErrorBase
{
public:
    VisCoreExport CVisAudioChannel( UINT uSampleRate, bool fThrow = true );
    VisCoreExport ~CVisAudioChannel();

    VisCoreExport int AddRef();
    VisCoreExport int Release();

    inline UINT   SampleRate(void) const;
    
    // used to read the channel data
    VisCoreExport const float* StartRead( INT64 ilStartTime,
                                          INT64 ilDuration,
                                          UINT* pNumSamples );
    VisCoreExport BOOL   EndRead( INT64 ilStartTime, INT64 ilDuration );

    // used to write channel data
    VisCoreExport float* StartWrite( INT64 ilStartTime,
                                     INT64 ilDuration,
                                     UINT* pNumSamples );
    VisCoreExport  BOOL  EndWrite( INT64 ilStartTime, INT64 ilDuration );

    // verify that data in a certain time range has been written
    VisCoreExport BOOL   BeenWritten( INT64 ilStartTime, INT64 ilDuration );

private:
    BOOL   MemoryAccessEvent( MEMORY_ACCESS_EVENT event );

    long         m_iRefCount;

    UINT         m_uSampleRate;
    INT64        m_ilDuration;

    AUDIO_CHANNEL_STATE m_uMemoryState;
    CRITICAL_SECTION    m_MemoryStateMutex;
    UINT         m_uMemoryAccessCount;
    UINT         m_uWaitingForWrite;
    HANDLE       m_MemoryWriteSema;
    UINT         m_uWaitingForRead;
    HANDLE       m_MemoryReadEvent;

    UINT         m_uTotalSamples;
    UINT*        m_puSamplesWritten;
    float*       m_pfSamples;
};

class CVisAudioData : public CVisStreamErrorBase
{
public:
    VisCoreExport CVisAudioData( bool fThrow = true );
    VisCoreExport CVisAudioData( CVisAudioData& ref, INT64 ilStartOffset, INT64 ilDuration,
                                 bool fThrow = true );
    VisCoreExport ~CVisAudioData( );

    // method to use when reading from a stream
    VisCoreExport BOOL   InitializeFromStream( CVisStreamHandler*,
                                               INT64 StartTime,
                                               INT64 Duration );
    
    // methods used when writing to a stream
    inline BOOL   WriteToStream( CVisStreamHandler* pStream,
                                 INT64 StartTimeInStream );


    // methods used to intialize and access the audio data
    VisCoreExport BOOL   InitializeChannel( UINT uChannelNum, CVisAudioChannel*, 
                                            INT64 StartTime,  INT64 Duration );

    VisCoreExport const float* StartReadChannel ( UINT uChannelNum, INT64 ilOffset, 
                                                  INT64 ilDuration, UINT* pNumSamples ); 
    VisCoreExport BOOL   EndReadChannel    ( UINT uChannelNum, INT64 ilOffset, INT64 ilDuration ); 
    
    VisCoreExport float* StartWriteChannel ( UINT uChannelNum, INT64 ilOffset, 
                                             INT64 ilDuration, UINT* pNumSamples ); 
    VisCoreExport BOOL   EndWriteChannel   ( UINT uChannelNum, INT64 ilOffset, INT64 ilDuration ); 
    
    VisCoreExport CVisAudioData& operator=(const CVisAudioData& Src);

    // accessor methods for private data
    VisCoreExport INT64  StartTime(UINT uChannelNum);
    inline INT64  Duration(void)    const;
    inline UINT   NumChannels(void) const;
    inline UINT   SampleRate(void)  const;
    inline CVisAudioChannel* AudioChannel(UINT i) const;

private:
    void   ClearChannels();

    typedef struct {
        INT64             m_ilStartTime;
        CVisAudioChannel* m_pAudioChan;
    } ChannelInfo;
    typedef std::vector<ChannelInfo> T_AudioChanVec;
        
    INT64              m_ilDuration;
    INT64              m_ilStartTime;
    T_AudioChanVec     m_Channels;

    CVisStreamHandler* m_pVisStreamHandler;
};

#include "VisAudioSamples.inl"

#endif // __VIS_CORE_AUDIO_SAMPLES_H__

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?