Chromium Code Reviews| Index: remoting/host/win/default_audio_device_change_detector.cc |
| diff --git a/remoting/host/win/default_audio_device_change_detector.cc b/remoting/host/win/default_audio_device_change_detector.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..10aff06a62187c307ab9e9d2748d8af6ec2ee52d |
| --- /dev/null |
| +++ b/remoting/host/win/default_audio_device_change_detector.cc |
| @@ -0,0 +1,87 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "remoting/host/win/default_audio_device_change_detector.h" |
| + |
| +#include <unknwn.h> |
| + |
| +#include "base/logging.h" |
| + |
| +namespace remoting { |
| + |
| +DefaultAudioDeviceChangeDetector::DefaultAudioDeviceChangeDetector( |
| + const base::win::ScopedComPtr<IMMDeviceEnumerator>& enumerator) |
| + : enumerator_(enumerator) { |
| + DCHECK(enumerator_); |
| + HRESULT hr = enumerator_->RegisterEndpointNotificationCallback(this); |
| + if (FAILED(hr)) { |
| + // We cannot predict which kind of error the API may return, but this is not |
| + // a fatal error. |
| + LOG(ERROR) << "Failed to register IMMNotificationClient, we may not be " |
|
joedow
2017/04/24 17:29:41
Should this be a WARNING instead or is ERROR the r
Hzj_jie
2017/04/24 22:45:02
Done.
|
| + "able to detect the new default audio device. Error " |
| + << hr; |
| + } |
| +} |
| + |
| +DefaultAudioDeviceChangeDetector::~DefaultAudioDeviceChangeDetector() { |
| + enumerator_->UnregisterEndpointNotificationCallback(this); |
| +} |
| + |
| +bool DefaultAudioDeviceChangeDetector::GetAndReset() { |
| + bool result = false; |
| + { |
| + base::AutoLock lock(lock_); |
| + result = changed_; |
| + changed_ = false; |
| + } |
| + return result; |
| +} |
| + |
| +HRESULT DefaultAudioDeviceChangeDetector::OnDefaultDeviceChanged( |
| + EDataFlow flow, |
| + ERole role, |
| + LPCWSTR pwstrDefaultDevice) { |
| + { |
| + base::AutoLock lock(lock_); |
| + changed_ = true; |
| + } |
| + return S_OK; |
| +} |
| + |
| +HRESULT DefaultAudioDeviceChangeDetector::QueryInterface(REFIID iid, |
| + void** object) { |
| + if (iid == IID_IUnknown || iid == __uuidof(IMMNotificationClient)) { |
| + *object = static_cast<IMMNotificationClient*>(this); |
| + return S_OK; |
| + } |
| + *object = nullptr; |
| + return E_NOINTERFACE; |
| +} |
| + |
| +HRESULT DefaultAudioDeviceChangeDetector::OnDeviceAdded(LPCWSTR pwstrDeviceId) { |
| + return S_OK; |
| +} |
| + |
| +HRESULT DefaultAudioDeviceChangeDetector::OnDeviceRemoved( |
| + LPCWSTR pwstrDeviceId) { |
| + return S_OK; |
| +} |
| + |
| +HRESULT DefaultAudioDeviceChangeDetector::OnDeviceStateChanged( |
| + LPCWSTR pwstrDeviceId, |
| + DWORD dwNewState) { |
| + return S_OK; |
| +} |
| + |
| +HRESULT DefaultAudioDeviceChangeDetector::OnPropertyValueChanged( |
| + LPCWSTR pwstrDeviceId, |
| + const PROPERTYKEY key) { |
| + return S_OK; |
| +} |
| + |
| +ULONG DefaultAudioDeviceChangeDetector::AddRef() { return 1; } |
| + |
| +ULONG DefaultAudioDeviceChangeDetector::Release() { return 1; } |
| + |
| +} // namespace remoting |