libaudiorender.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #pragma once
  2. #include <speex/speex_resampler.h>
  3. #include "iaudiorenderinterface.h"
  4. #include "../libaudioqueue/libaudioqueue.h"
  5. #pragma comment(lib,"avrt.lib")
  6. #include<Audioclient.h>
  7. #include <mmdeviceapi.h>
  8. #include<avrt.h>
  9. #include <stdio.h>
  10. #include <stdint.h>
  11. enum eSpeakerSamplingDepthRate{
  12. eSixteenBitsCD, //2通道,16位,44100Hz,每秒采样大小176400字节,采集声音每次返回buffer大小448*4=1792字节,转为8k采样率,单声道后buffer大小162字节和163字节交替
  13. eSixteenBitsDVD, //2通道,16位,48000Hz,每秒采样大小192000字节,采集声音每次返回buffer大小480*4=1920字节,转为8k采样率,单声道后buffer大小160字节
  14. eSixteenBitsStatdioLow, //2通道,16位,96000Hz,每秒采样大小384000字节,采集声音每次返回buffer大小960*4=3840字节,转为8k采样率,单声道后buffer大小160字节
  15. eSixteenBitsStatdioHigh, //2通道,16位,192000Hz,每秒采样大小768000字节,采集声音每次返回buffer大小1920*4=7680字节,转为8k采样率,单声道后buffer大小160字节
  16. eTwentyfourStatdioA, //2通道,24位,44100Hz
  17. eTwentyfourStatdioB, //2通道,24位,48000Hz
  18. eTwentyfourStatdioC, //2通道,24位,96000Hz
  19. eTwentyfourStatdioD //2通道,24位,192000Hz
  20. };
  21. enum eChannelNumber{
  22. eSingleChannel = 1,
  23. eDoubleChannel = 2
  24. };
  25. class AudioRenderImpl : public IAudioRender, public IRenderCallback
  26. {
  27. public:
  28. AudioRenderImpl();
  29. virtual int StartRender(int iQueue, void* pFrameformat, const char*pSwitchName);
  30. BOOL AdjustFormatTo16Bits(WAVEFORMATEX *pwfx);
  31. static DWORD WINAPI pfThreadFunc(LPVOID lpThreadParameter);
  32. uint32_t ConvertDouble2SingleChannel(char* pDstBuf, const uint32_t uDstLen, const unsigned char* pSrcBuf, uint32_t uSrcLen, uint32_t uBitDeepth);
  33. eSpeakerSamplingDepthRate GetSpeakerSampleRate(uint32_t udepth, uint32_t usamplerate);
  34. 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);
  35. bool InitAudioFrame(audio_frame* pframe);
  36. void RenderFunc();
  37. int InitQueueInfo(int iQueue);
  38. virtual int StopRender();
  39. virtual int ReStartRender();
  40. void Close();
  41. void LogRenderInfo();
  42. virtual void Debug(const char *fmt, ...);
  43. virtual void OnRenderFailed();
  44. virtual void OnAudioRenderExcption();
  45. virtual void Release();
  46. ~AudioRenderImpl();
  47. private:
  48. HANDLE m_hThread;
  49. HANDLE m_hTask;
  50. HANDLE m_hTimerWakeUp;
  51. IAudioCaptureClient * m_pAudioCaptureClient;
  52. IAudioClient * m_pAudioClient;
  53. WAVEFORMATEX * m_pwfx;
  54. HANDLE m_hEventStop;
  55. IMMDevice* m_pMMDevice;
  56. int m_iQueueNumber;
  57. audio_frame* m_frame_format;
  58. Clibaudioqueue *m_audio_cap;
  59. char m_strFilePathName[MAX_PATH];
  60. bool m_bRecordPCM;
  61. };