#pragma once #include #include "iaudiorenderinterface.h" #include "../libaudioqueue/libaudioqueue.h" #pragma comment(lib,"avrt.lib") #include #include #include #include #include enum eSpeakerSamplingDepthRate{ eSixteenBitsCD, //2通道,16位,44100Hz,每秒采样大小176400字节,采集声音每次返回buffer大小448*4=1792字节,转为8k采样率,单声道后buffer大小162字节和163字节交替 eSixteenBitsDVD, //2通道,16位,48000Hz,每秒采样大小192000字节,采集声音每次返回buffer大小480*4=1920字节,转为8k采样率,单声道后buffer大小160字节 eSixteenBitsStatdioLow, //2通道,16位,96000Hz,每秒采样大小384000字节,采集声音每次返回buffer大小960*4=3840字节,转为8k采样率,单声道后buffer大小160字节 eSixteenBitsStatdioHigh, //2通道,16位,192000Hz,每秒采样大小768000字节,采集声音每次返回buffer大小1920*4=7680字节,转为8k采样率,单声道后buffer大小160字节 eTwentyfourStatdioA, //2通道,24位,44100Hz eTwentyfourStatdioB, //2通道,24位,48000Hz eTwentyfourStatdioC, //2通道,24位,96000Hz eTwentyfourStatdioD //2通道,24位,192000Hz }; enum eChannelNumber{ eSingleChannel = 1, eDoubleChannel = 2 }; class AudioRenderImpl : public IAudioRender, public IRenderCallback { public: AudioRenderImpl(); virtual int StartRender(int iQueue, void* pFrameformat, const char*pSwitchName); BOOL AdjustFormatTo16Bits(WAVEFORMATEX *pwfx); static DWORD WINAPI pfThreadFunc(LPVOID lpThreadParameter); uint32_t ConvertDouble2SingleChannel(char* pDstBuf, const uint32_t uDstLen, const unsigned char* pSrcBuf, uint32_t uSrcLen, uint32_t uBitDeepth); eSpeakerSamplingDepthRate GetSpeakerSampleRate(uint32_t udepth, uint32_t usamplerate); uint32_t TranslateBuffer2DestFrameFormat(spx_int16_t* pOutAudio, spx_uint32_t* pAudioLen, spx_uint32_t uAudioBufferLen, unsigned char* pCbBuffer, const uint32_t uBufferLen, SpeexResamplerState *st, const audio_frame* pDestFrameFormat); bool InitAudioFrame(audio_frame* pframe); void RenderFunc(); int InitQueueInfo(int iQueue); virtual int StopRender(); virtual int ReStartRender(); void Close(); void LogRenderInfo(); virtual void Debug(const char *fmt, ...); virtual void OnRenderFailed(); virtual void OnAudioRenderExcption(); virtual void Release(); ~AudioRenderImpl(); private: HANDLE m_hThread; HANDLE m_hTask; HANDLE m_hTimerWakeUp; IAudioCaptureClient * m_pAudioCaptureClient; IAudioClient * m_pAudioClient; WAVEFORMATEX * m_pwfx; HANDLE m_hEventStop; IMMDevice* m_pMMDevice; int m_iQueueNumber; audio_frame* m_frame_format; Clibaudioqueue *m_audio_cap; char m_strFilePathName[MAX_PATH]; bool m_bRecordPCM; };