Index: remoting/host/audio_capturer_win.h |
diff --git a/remoting/host/audio_capturer_win.h b/remoting/host/audio_capturer_win.h |
index d53920a43d9284f6b4ebd8f7d8f5f626b568a87e..0019242fc48f2f9646f6260ab617a9a43c0fbf91 100644 |
--- a/remoting/host/audio_capturer_win.h |
+++ b/remoting/host/audio_capturer_win.h |
@@ -31,6 +31,30 @@ class AudioCapturerWin : public AudioCapturer { |
bool Start(const PacketCapturedCallback& callback) override; |
private: |
+ // An IMMNotificationClient implementation to detect the event of default |
+ // audio device recently changed. If it indicates a changed happend recently, |
+ // we need to recreate all audio components. |
+ class MMNotificationClient; |
+ |
+ // Executes Deinitialize() and Initialize(). If Initialize() function call |
+ // returns false, Deinitialize() will be called again to ensure we will |
+ // initialize COM components again. |
+ bool ResetAndInitialize(); |
+ |
+ // Resets all COM components to nullptr, so is_initialized() will return |
+ // false. |
+ void Deinitialize(); |
+ |
+ // Initializes default audio device related components. These components must |
+ // be recreated once the default audio device changed. Returns false if |
+ // initialization failed. |
+ bool Initialize(); |
+ |
+ // Whether all components are correctly initialized. If last |
+ // Initialize() function call failed, this function will return false. |
+ // Otherwise this function will return true. |
+ bool is_initialized() const; |
+ |
// Receives all packets from the audio capture endpoint buffer and pushes them |
// to the network. |
void DoCapture(); |
@@ -55,11 +79,14 @@ class AudioCapturerWin : public AudioCapturer { |
AudioSilenceDetector silence_detector_; |
base::win::ScopedCoMem<WAVEFORMATEX> wave_format_ex_; |
+ base::win::ScopedComPtr<IMMDeviceEnumerator> mm_device_enumerator_; |
base::win::ScopedComPtr<IAudioCaptureClient> audio_capture_client_; |
base::win::ScopedComPtr<IAudioClient> audio_client_; |
base::win::ScopedComPtr<IMMDevice> mm_device_; |
base::win::ScopedComPtr<IAudioEndpointVolume> audio_volume_; |
+ const std::unique_ptr<MMNotificationClient> mm_notification_client_; |
+ |
HRESULT last_capture_error_; |
base::ThreadChecker thread_checker_; |