1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #pragma once
- #include <speex/speex_resampler.h>
- #include "iaudiorenderinterface.h"
- #include "../libaudioqueue/libaudioqueue.h"
- #pragma comment(lib,"avrt.lib")
- #include<Audioclient.h>
- #include <mmdeviceapi.h>
- #include<avrt.h>
- #include <stdio.h>
- #include <stdint.h>
- 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;
- };
|