chromium/remoting/host/win/default_audio_device_change_detector.cc

// Copyright 2017 The Chromium Authors
// 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 Microsoft::WRL::ComPtr<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(WARNING) << "Failed to register IMMNotificationClient, we may not be "
                    "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