audio_capturer.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #ifndef __AUDIO_CAPTURER_H__
  2. #define __AUDIO_CAPTURER_H__
  3. #include "iaudiocapturer.h"
  4. #include <audioclient.h>
  5. #include <combaseapi.h>
  6. #include <mmdeviceapi.h>
  7. #include <memory>
  8. #include <thread>
  9. #include <vector>
  10. #include <mutex>
  11. class AudioCapturer : public IAudioCapturer
  12. {
  13. public:
  14. bool Init(Type deviceType) override;
  15. bool Start() override;
  16. void Stop() override;
  17. const AudioFormat& GetFormat() const override { return _format; }
  18. int readAudioData(char* buf, int maxLen) override;
  19. private:
  20. mutable AudioFormat _format;
  21. bool _isInit = false;
  22. Type _deviceType;
  23. IMMDeviceEnumerator* _pDeviceEnumerator = nullptr;
  24. IMMDevice* _pDevice = nullptr;
  25. IAudioClient* _pAudioClient = nullptr;
  26. IAudioCaptureClient* _pAudioCaptureClient = nullptr;
  27. std::thread* _captureThread = nullptr;
  28. bool _loopFlag = false;
  29. WAVEFORMATEXTENSIBLE _formatex;
  30. std::vector<char> _buffer;
  31. std::mutex _bufferMutex;
  32. // 静音播放器相关成员
  33. std::atomic<bool> _silencePlayerRunning{false};
  34. std::thread* _silencePlayerThread = nullptr;
  35. IMMDevice* _pSilenceDevice = nullptr;
  36. IAudioClient* _pSilenceAudioClient = nullptr;
  37. IAudioRenderClient* _pSilenceRenderClient = nullptr;
  38. bool _CreateDeviceEnumerator(IMMDeviceEnumerator** enumerator);
  39. bool _CreateDevice(IMMDeviceEnumerator* enumerator, IMMDevice** device);
  40. bool _CreateAudioClient(IMMDevice* device, IAudioClient** audioClient);
  41. bool _IsFormatSupported(IAudioClient* audioClient);
  42. bool _GetPreferFormat(IAudioClient* audioClient,
  43. WAVEFORMATEXTENSIBLE* formatex);
  44. bool _InitAudioClient(IAudioClient* audioClient,
  45. WAVEFORMATEXTENSIBLE* formatex);
  46. bool _CreateAudioCaptureClient(IAudioClient* audioClient,
  47. IAudioCaptureClient** audioCaptureClient);
  48. bool _ThreadRun(IAudioClient* audio_client,
  49. IAudioCaptureClient* audio_capture_client);
  50. // 静音播放器方法
  51. bool _InitializeSilencePlayer();
  52. void _CleanupSilencePlayer();
  53. void _SilencePlayerThreadFunc();
  54. };
  55. #endif