root/media/audio/win/audio_device_listener_win.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


// Copyright (c) 2012 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.

#ifndef MEDIA_AUDIO_WIN_AUDIO_DEVICE_LISTENER_WIN_H_
#define MEDIA_AUDIO_WIN_AUDIO_DEVICE_LISTENER_WIN_H_

#include <MMDeviceAPI.h>
#include <string>

#include "base/basictypes.h"
#include "base/callback.h"
#include "base/threading/thread_checker.h"
#include "base/win/scoped_comptr.h"
#include "media/base/media_export.h"

using base::win::ScopedComPtr;

namespace media {

// IMMNotificationClient implementation for listening for default device changes
// and forwarding to AudioManagerWin so it can notify downstream clients.  Only
// output (eRender) device changes are supported currently.  Core Audio support
// is required to construct this object.  Must be constructed and destructed on
// a single COM initialized thread.
// TODO(dalecurtis, henrika): Support input device changes.
class MEDIA_EXPORT AudioDeviceListenerWin : public IMMNotificationClient {
 public:
  // The listener callback will be called from a system level multimedia thread,
  // thus the callee must be thread safe.  |listener| is a permanent callback
  // and must outlive AudioDeviceListenerWin.
  explicit AudioDeviceListenerWin(const base::Closure& listener_cb);
  virtual ~AudioDeviceListenerWin();

 private:
  friend class AudioDeviceListenerWinTest;

  // IMMNotificationClient implementation.
  STDMETHOD_(ULONG, AddRef)();
  STDMETHOD_(ULONG, Release)();
  STDMETHOD(QueryInterface)(REFIID iid, void** object);
  STDMETHOD(OnPropertyValueChanged)(LPCWSTR device_id, const PROPERTYKEY key);
  STDMETHOD(OnDeviceAdded)(LPCWSTR device_id);
  STDMETHOD(OnDeviceRemoved)(LPCWSTR device_id);
  STDMETHOD(OnDeviceStateChanged)(LPCWSTR device_id, DWORD new_state);
  STDMETHOD(OnDefaultDeviceChanged)(EDataFlow flow, ERole role,
                                    LPCWSTR new_default_device_id);

  base::Closure listener_cb_;
  ScopedComPtr<IMMDeviceEnumerator> device_enumerator_;
  std::string default_render_device_id_;
  std::string default_capture_device_id_;
  std::string default_communications_render_device_id_;
  std::string default_communications_capture_device_id_;

  // AudioDeviceListenerWin must be constructed and destructed on one thread.
  base::ThreadChecker thread_checker_;

  DISALLOW_COPY_AND_ASSIGN(AudioDeviceListenerWin);
};

}  // namespace media

#endif  // MEDIA_AUDIO_WIN_AUDIO_DEVICE_LISTENER_WIN_H_

/* [<][>][^][v][top][bottom][index][help] */