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.
5 #ifndef MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
6 #define MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
8 #include <CoreAudio/AudioHardware.h>
12 #include "base/basictypes.h"
13 #include "base/compiler_specific.h"
14 #include "media/audio/audio_manager_base.h"
15 #include "media/audio/mac/audio_device_listener_mac.h"
19 // Mac OS X implementation of the AudioManager singleton. This class is internal
20 // to the audio output and only internal users can call methods not exposed by
21 // the AudioManager class.
22 class MEDIA_EXPORT AudioManagerMac : public AudioManagerBase {
24 AudioManagerMac(AudioLogFactory* audio_log_factory);
26 // Implementation of AudioManager.
27 virtual bool HasAudioOutputDevices() OVERRIDE;
28 virtual bool HasAudioInputDevices() OVERRIDE;
29 virtual void GetAudioInputDeviceNames(
30 AudioDeviceNames* device_names) OVERRIDE;
31 virtual void GetAudioOutputDeviceNames(
32 AudioDeviceNames* device_names) OVERRIDE;
33 virtual AudioParameters GetInputStreamParameters(
34 const std::string& device_id) OVERRIDE;
35 virtual std::string GetAssociatedOutputDeviceID(
36 const std::string& input_device_id) OVERRIDE;
38 // Implementation of AudioManagerBase.
39 virtual AudioOutputStream* MakeLinearOutputStream(
40 const AudioParameters& params) OVERRIDE;
41 virtual AudioOutputStream* MakeLowLatencyOutputStream(
42 const AudioParameters& params,
43 const std::string& device_id) OVERRIDE;
44 virtual AudioInputStream* MakeLinearInputStream(
45 const AudioParameters& params, const std::string& device_id) OVERRIDE;
46 virtual AudioInputStream* MakeLowLatencyInputStream(
47 const AudioParameters& params, const std::string& device_id) OVERRIDE;
48 virtual std::string GetDefaultOutputDeviceID() OVERRIDE;
50 // Used to track destruction of input and output streams.
51 virtual void ReleaseOutputStream(AudioOutputStream* stream) OVERRIDE;
52 virtual void ReleaseInputStream(AudioInputStream* stream) OVERRIDE;
54 static bool GetDefaultInputDevice(AudioDeviceID* device);
55 static bool GetDefaultOutputDevice(AudioDeviceID* device);
56 static bool GetDefaultDevice(AudioDeviceID* device, bool input);
58 static bool GetDefaultOutputChannels(int* channels);
60 static bool GetDeviceChannels(AudioDeviceID device,
61 AudioObjectPropertyScope scope,
64 static int HardwareSampleRateForDevice(AudioDeviceID device_id);
65 static int HardwareSampleRate();
67 // OSX has issues with starting streams as the sytem goes into suspend and
68 // immediately after it wakes up from resume. See http://crbug.com/160920.
69 // As a workaround we delay Start() when it occurs after suspend and for a
70 // small amount of time after resume.
72 // Streams should consult ShouldDeferStreamStart() and if true check the value
73 // again after |kStartDelayInSecsForPowerEvents| has elapsed. If false, the
74 // stream may be started immediately.
75 enum { kStartDelayInSecsForPowerEvents = 1 };
76 bool ShouldDeferStreamStart();
79 virtual ~AudioManagerMac();
81 virtual AudioParameters GetPreferredOutputStreamParameters(
82 const std::string& output_device_id,
83 const AudioParameters& input_params) OVERRIDE;
86 void InitializeOnAudioThread();
87 void ShutdownOnAudioThread();
89 int ChooseBufferSize(int output_sample_rate);
91 // Notify streams of a device change if the default output device or its
92 // sample rate has changed, otherwise does nothing.
93 void HandleDeviceChanges();
95 scoped_ptr<AudioDeviceListenerMac> output_device_listener_;
97 // Track the output sample-rate and the default output device
98 // so we can intelligently handle device notifications only when necessary.
99 int current_sample_rate_;
100 AudioDeviceID current_output_device_;
102 // Helper class which monitors power events to determine if output streams
103 // should defer Start() calls. Required to workaround an OSX bug. See
104 // http://crbug.com/160920 for more details.
105 class AudioPowerObserver;
106 scoped_ptr<AudioPowerObserver> power_observer_;
108 // Tracks all constructed input and output streams so they can be stopped at
109 // shutdown. See ShutdownOnAudioThread() for more details.
110 std::list<AudioInputStream*> input_streams_;
111 std::list<AudioOutputStream*> output_streams_;
113 DISALLOW_COPY_AND_ASSIGN(AudioManagerMac);
118 #endif // MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_