audio_capturer.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #ifndef __AUDIO_CAPTURER_H__
  2. #define __AUDIO_CAPTURER_H__
  3. #include <audioclient.h>
  4. #include <combaseapi.h>
  5. #include <mmdeviceapi.h>
  6. #include <memory>
  7. #include <thread>
  8. class AudioCapturer {
  9. public:
  10. enum Type {
  11. Microphone,
  12. Speaker
  13. };
  14. using CallBack = void (*)(void* data, size_t size, void* userInfo);
  15. bool Init(Type deviceType, CallBack callback, void* userInfo = nullptr);
  16. bool Start();
  17. const WAVEFORMATEX& GetFormat() const { return _formatex.Format; }
  18. void Stop();
  19. private:
  20. bool _isInit = false;
  21. CallBack _callback;
  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. void* _userInfo = nullptr;
  31. bool _CreateDeviceEnumerator(IMMDeviceEnumerator** enumerator);
  32. bool _CreateDevice(IMMDeviceEnumerator* enumerator, IMMDevice** device);
  33. bool _CreateAudioClient(IMMDevice* device, IAudioClient** audioClient);
  34. bool _IsFormatSupported(IAudioClient* audioClient);
  35. bool _GetPreferFormat(IAudioClient* audioClient,
  36. WAVEFORMATEXTENSIBLE* formatex);
  37. bool _InitAudioClient(IAudioClient* audioClient,
  38. WAVEFORMATEXTENSIBLE* formatex);
  39. bool _CreateAudioCaptureClient(IAudioClient* audioClient,
  40. IAudioCaptureClient** audioCaptureClient);
  41. bool _ThreadRun(IAudioClient* audio_client,
  42. IAudioCaptureClient* audio_capture_client);
  43. };
  44. #endif