Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
Confaud.h
Abstract:
Definitions for audio streams
Author:
Mu Han (muhan) 15-September-1998
--*/ #ifndef __CONFAUD_H_
#define __CONFAUD_H_
#include <amrtpdmx.h> // demux guid
#include <amrtpss.h> // AGC events
#define USE_WIDEBAND_CODEC 1
const DWORD g_dwMaxAudioPacketDuration = 80;
const DWORD g_dwAudioThreadPriority = THREAD_PRIORITY_TIME_CRITICAL; const WORD g_wAudioDemuxPins = 5; const WORD g_wAudioChannels = 1; const DWORD g_wAudioCaptureBitPerSample = 16; const DWORD g_dwAudioCaptureNumBufffers = 32; const DWORD g_dwRTPHeaderSize = 12;
const DWORD g_dwG711MSPerPacket = 30; // 30ms samples.
const DWORD g_dwG711BytesPerPacket = 240; // 30ms samples.
const DWORD g_dwG711AudioSampleRate = 8000; const DWORD g_dwMaxG711PacketSize = g_dwMaxAudioPacketDuration * g_dwG711BytesPerPacket / g_dwG711MSPerPacket + g_dwRTPHeaderSize;
const DWORD g_dwGSMMSPerPacket = 40; // 40ms samples.
const DWORD g_dwGSMBytesPerPacket = 65; // 40ms samples.
const DWORD g_dwGSMAudioSampleRate = 8000; const WORD g_wGSMBlockAlignment = 65; // 40ms samples.
const DWORD g_dwGSMBytesPerSecond = g_dwGSMBytesPerPacket * 1000 / g_dwGSMMSPerPacket;
const DWORD g_wGSMSamplesPerBlock = g_dwGSMMSPerPacket * g_dwGSMAudioSampleRate / 1000; const DWORD g_dwMaxGSMPacketSize = g_dwMaxAudioPacketDuration / g_dwGSMMSPerPacket * g_dwGSMBytesPerPacket + g_dwRTPHeaderSize;
#ifdef DVI
const DWORD g_dwDVI4MSPerPacket = 80; // 80 ms samples.
const WORD g_wDVI4BlockAlignment = 324; const DWORD g_dwDVI4BytesPerPacket = g_wDVI4BlockAlignment; const DWORD g_wDVI4BitsPerSample = 4; const DWORD g_dwDVI4AudioSampleRate = 8000; const DWORD g_dwMaxDVI4PacketSize = g_dwDVI4BytesPerPacket + g_dwRTPHeaderSize; const DWORD g_dwDVI4BytesPerSecond = 4000; // ignore header here.
const DWORD g_wDVI4SamplesPerBlock = (g_wDVI4BlockAlignment - 4) * 8 / g_wDVI4BitsPerSample + 1;
#endif
// MSAudio defines
#define WAVE_FORMAT_MSAUDIO1 0x0160
typedef struct msaudio1waveformat_tag { WAVEFORMATEX wfx;
//only counting "new" samples "= half of what will be used due to overlapping
WORD wSamplesPerBlock;
} MSAUDIO1WAVEFORMAT;
#define MSAUDIO1_BITS_PER_SAMPLE 0
#define MSAUDIO1_MAX_CHANNELS 1
#define MSAUDIO1_WFX_EXTRA_BYTES 2
#ifdef USE_WIDEBAND_CODEC
// At 16kHz,
#define FRAME_TIME 64
#define PACKET_SIZE 64
#define BYTES_PER_SECOND 1920
#define SAMPLES_PER_BLOCK 512
#else
// At 8kHz,
#define FRAME_TIME 64
#define PACKET_SIZE 32
#define BYTES_PER_SECOND 960
#define SAMPLES_PER_BLOCK 256
#endif
const DWORD g_dwMSAudioMSPerPacket = FRAME_TIME; // This will make sure that we always capture 1024 byte PCM16 buffers (at 8kHz: 512 samples = 64ms, at 16kHz: 512 samples = 32ms)
const DWORD g_dwMSAudioBytesPerPacket = PACKET_SIZE; // The MS Audio codec will only use 512 bytes of an PCM16 input buffer of size 1024 bytes and generate a 32 bytes frame
const DWORD g_dwMSAudioSampleRate = 16000; const WORD g_wMSAudioBlockAlignment = PACKET_SIZE; // 32 bytes of block alignment.
const DWORD g_dwMSAudioBytesPerSecond = BYTES_PER_SECOND; // 8kHz: Measurements show that a 8000 samples buffer is compressed to 960 bytes
const WORD g_wMSAudioExtraDataSize = 2; const DWORD g_wMSAudioSamplesPerBlock = SAMPLES_PER_BLOCK;
// We only care to be able to send and receive MSAudio packets that contain 64ms worth of data.
const DWORD g_dwMaxMSAudioPacketSize = g_dwMSAudioBytesPerPacket + g_dwRTPHeaderSize; // 8kHz: 32 + 12 bytes
inline DWORD AudioCaptureBufferSize(DWORD dwMillisecondPerPacket, DWORD dwAudioSampleRate) { return dwMillisecondPerPacket * (dwAudioSampleRate / 1000) * (g_wAudioCaptureBitPerSample / 8); }
class ATL_NO_VTABLE CStreamAudioRecv : public CIPConfMSPStream { public:
CStreamAudioRecv();
void FinalRelease();
HRESULT Configure( IN STREAMSETTINGS & StreamSettings );
protected: HRESULT SetUpFilters();
HRESULT ConfigureRTPFilter( IN IBaseFilter * pIBaseFilter );
HRESULT SetUpInternalFilters();
HRESULT ConnectTerminal( IN ITTerminal * pITTerminal );
HRESULT ProcessSSRCMappedEvent( IN DWORD dwSSRC );
HRESULT ProcessSSRCUnmapEvent( IN DWORD dwSSRC );
HRESULT ProcessGraphEvent( IN long lEventCode, IN long lParam1, IN long lParam2 );
HRESULT ProcessParticipantLeave( IN DWORD dwSSRC );
HRESULT NewParticipantPostProcess( IN DWORD dwSSRC, IN ITParticipant *pITParticipant );
protected:
BOOL m_fUseACM; DWORD m_dwMaxPacketSize; DWORD m_dwAudioSampleRate;
BYTE * m_pWaveFormatEx; DWORD m_dwSizeWaveFormatEx;
// a small buffer to queue up pin mapped events.
CMSPArray <DWORD> m_PendingSSRCs; };
class ATL_NO_VTABLE CStreamAudioSend : public CIPConfMSPStream { public: CStreamAudioSend();
virtual HRESULT Configure( IN STREAMSETTINGS &StreamSettings );
protected:
HRESULT SetUpFilters();
HRESULT ConnectTerminal( IN ITTerminal * pITTerminal );
HRESULT CreateSendFilters( IN IPin *pPin );
HRESULT ConfigureRTPFilter( IN IBaseFilter * pIBaseFilter );
HRESULT ConfigureAudioCaptureTerminal( IN ITTerminalControl * pTerminal, OUT IPin ** ppIPin );
HRESULT ProcessAGCEvent( IN AGC_EVENT Event, IN long lPercent );
HRESULT ProcessGraphEvent( IN long lEventCode, IN long lParam1, IN long lParam2 ); protected:
BOOL m_fUseACM; int m_iACMID; DWORD m_dwMSPerPacket; DWORD m_dwMaxPacketSize; DWORD m_dwAudioSampleRate;
};
#endif
|