audio_manager_mac.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
6#define MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
7
8#include <CoreAudio/AudioHardware.h>
9#include <string>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "base/message_loop_proxy.h"
14#include "media/audio/audio_manager_base.h"
15#include "media/audio/mac/aggregate_device_manager.h"
16#include "media/audio/mac/audio_device_listener_mac.h"
17
18namespace media {
19
20// Mac OS X implementation of the AudioManager singleton. This class is internal
21// to the audio output and only internal users can call methods not exposed by
22// the AudioManager class.
23class MEDIA_EXPORT AudioManagerMac : public AudioManagerBase {
24 public:
25  AudioManagerMac();
26
27  // Implementation of AudioManager.
28  virtual bool HasAudioOutputDevices() OVERRIDE;
29  virtual bool HasAudioInputDevices() OVERRIDE;
30  virtual void GetAudioInputDeviceNames(media::AudioDeviceNames* device_names)
31      OVERRIDE;
32  virtual AudioParameters GetInputStreamParameters(
33      const std::string& device_id) OVERRIDE;
34
35  // Implementation of AudioManagerBase.
36  virtual AudioOutputStream* MakeLinearOutputStream(
37      const AudioParameters& params) OVERRIDE;
38  virtual AudioOutputStream* MakeLowLatencyOutputStream(
39      const AudioParameters& params) OVERRIDE;
40  virtual AudioInputStream* MakeLinearInputStream(
41      const AudioParameters& params, const std::string& device_id) OVERRIDE;
42  virtual AudioInputStream* MakeLowLatencyInputStream(
43      const AudioParameters& params, const std::string& device_id) OVERRIDE;
44
45  static bool GetDefaultInputDevice(AudioDeviceID* device);
46  static bool GetDefaultOutputDevice(AudioDeviceID* device);
47  static bool GetDefaultDevice(AudioDeviceID* device, bool input);
48
49  static bool GetDefaultOutputChannels(int* channels);
50
51  static bool GetDeviceChannels(AudioDeviceID device,
52                                AudioObjectPropertyScope scope,
53                                int* channels);
54
55  static int HardwareSampleRateForDevice(AudioDeviceID device_id);
56  static int HardwareSampleRate();
57
58 protected:
59  virtual ~AudioManagerMac();
60
61  virtual AudioParameters GetPreferredOutputStreamParameters(
62      const AudioParameters& input_params) OVERRIDE;
63
64 private:
65  bool HasUnifiedDefaultIO();
66
67  // Helper methods for constructing AudioDeviceListenerMac on the audio thread.
68  void CreateDeviceListener();
69  void DestroyDeviceListener();
70  void HandleDeviceChanges();
71
72  scoped_ptr<AudioDeviceListenerMac> output_device_listener_;
73
74  // Track the output sample-rate and the default output device
75  // so we can intelligently handle device notifications only when necessary.
76  int current_sample_rate_;
77  AudioDeviceID current_output_device_;
78
79  AggregateDeviceManager aggregate_device_manager_;
80
81  DISALLOW_COPY_AND_ASSIGN(AudioManagerMac);
82};
83
84}  // namespace media
85
86#endif  // MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
87