108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved.
208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
308ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project// found in the LICENSE file.
408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project#ifndef MEDIA_AUDIO_MAC_AUDIO_DEVICE_LISTENER_MAC_H_
608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project#define MEDIA_AUDIO_MAC_AUDIO_DEVICE_LISTENER_MAC_H_
708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project#include <CoreAudio/AudioHardware.h>
908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
1008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project#include "base/basictypes.h"
1108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project#include "base/callback.h"
1208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project#include "base/threading/thread_checker.h"
1308ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project#include "media/base/media_export.h"
1408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
1508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectnamespace media {
1608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
1708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project// AudioDeviceListenerMac facilitates execution of device listener callbacks
18860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root// issued via CoreAudio.
1908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectclass MEDIA_EXPORT AudioDeviceListenerMac {
2001cce891dd313a0fb9d4694283f2a13fb5c43afeAlex Klyubin public:
213c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root  // |listener_cb| will be called when a device change occurs; it's a permanent
2201cce891dd313a0fb9d4694283f2a13fb5c43afeAlex Klyubin  // callback and must outlive AudioDeviceListenerMac.  Note that |listener_cb|
233c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root  // might not be executed on the same thread as construction.
2408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project  explicit AudioDeviceListenerMac(const base::Closure& listener_cb);
2508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project  ~AudioDeviceListenerMac();
2608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
2708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project private:
283c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root  friend class AudioDeviceListenerMacTest;
2908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project  static const AudioObjectPropertyAddress kDeviceChangePropertyAddress;
3008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
313c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root  static OSStatus OnDefaultDeviceChanged(
323c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root      AudioObjectID object, UInt32 num_addresses,
333b1ef2640bbf3a58125b03883759de5b654106a5Brian Carlstrom      const AudioObjectPropertyAddress addresses[], void* context);
343c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root
353c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root  base::Closure listener_cb_;
3601cce891dd313a0fb9d4694283f2a13fb5c43afeAlex Klyubin
3708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project  // AudioDeviceListenerMac must be constructed and destructed on the same
3808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project  // thread.
393c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root  base::ThreadChecker thread_checker_;
403c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root
4108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project  DISALLOW_COPY_AND_ASSIGN(AudioDeviceListenerMac);
4208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project};
433c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root
4408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project}  // namespace media
4508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
463c072fb087eaa1a363fc673c60f5ef65390e356fKenny Root#endif  // MEDIA_AUDIO_MAC_AUDIO_DEVICE_LISTENER_MAC_H_
4708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project