audio_manager_mac.h revision 58537e28ecd584eab876aee8be7156509866d23a
1cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich// Use of this source code is governed by a BSD-style license that can be
3172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich// found in the LICENSE file.
4cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
5cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#ifndef MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
6172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#define MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
7172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
8cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include <CoreAudio/AudioHardware.h>
9172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <string>
10cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
11cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include "base/basictypes.h"
12172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include "base/compiler_specific.h"
13cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include "base/message_loop/message_loop_proxy.h"
14cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include "media/audio/audio_manager_base.h"
15172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include "media/audio/mac/aggregate_device_manager.h"
16cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#include "media/audio/mac/audio_device_listener_mac.h"
17cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
18172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichnamespace media {
19cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
20cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project// Mac OS X implementation of the AudioManager singleton. This class is internal
21172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich// to the audio output and only internal users can call methods not exposed by
22cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project// the AudioManager class.
23cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Projectclass MEDIA_EXPORT AudioManagerMac : public AudioManagerBase {
24172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich public:
25cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  AudioManagerMac();
26cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
27172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  // Implementation of AudioManager.
28cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual bool HasAudioOutputDevices() OVERRIDE;
29cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual bool HasAudioInputDevices() OVERRIDE;
30172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  virtual void GetAudioInputDeviceNames(media::AudioDeviceNames* device_names)
31cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      OVERRIDE;
32cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual void GetAudioOutputDeviceNames(media::AudioDeviceNames* device_names)
33172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      OVERRIDE;
34cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual AudioParameters GetInputStreamParameters(
35cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const std::string& device_id) OVERRIDE;
36172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  virtual std::string GetAssociatedOutputDeviceID(
37cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const std::string& input_device_id) OVERRIDE;
38cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
39172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  // Implementation of AudioManagerBase.
40cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual AudioOutputStream* MakeLinearOutputStream(
41cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const AudioParameters& params) OVERRIDE;
42172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  virtual AudioOutputStream* MakeLowLatencyOutputStream(
43cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const AudioParameters& params,
44cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const std::string& device_id,
45172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      const std::string& input_device_id) OVERRIDE;
46cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual AudioInputStream* MakeLinearInputStream(
47cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const AudioParameters& params, const std::string& device_id) OVERRIDE;
48172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  virtual AudioInputStream* MakeLowLatencyInputStream(
49cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const AudioParameters& params, const std::string& device_id) OVERRIDE;
50cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual std::string GetDefaultOutputDeviceID() OVERRIDE;
51172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
52cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  static bool GetDefaultInputDevice(AudioDeviceID* device);
53cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  static bool GetDefaultOutputDevice(AudioDeviceID* device);
54172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  static bool GetDefaultDevice(AudioDeviceID* device, bool input);
55cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
56cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  static bool GetDefaultOutputChannels(int* channels);
57172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
58cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  static bool GetDeviceChannels(AudioDeviceID device,
59cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project                                AudioObjectPropertyScope scope,
60172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich                                int* channels);
61cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
62cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  static int HardwareSampleRateForDevice(AudioDeviceID device_id);
63172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  static int HardwareSampleRate();
64cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
65cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  // Notify streams of a device change if the default output device or its
66172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  // sample rate has changed, otherwise does nothing.
67cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  void HandleDeviceChanges();
68cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
69172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich protected:
70cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  virtual ~AudioManagerMac();
71cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
72172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  virtual AudioParameters GetPreferredOutputStreamParameters(
73cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const std::string& output_device_id,
74cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project      const AudioParameters& input_params) OVERRIDE;
75172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
76cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project private:
77cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  bool HasUnifiedDefaultIO();
78172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
79cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  // Helper methods for constructing AudioDeviceListenerMac on the audio thread.
80cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  void CreateDeviceListener();
81172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  void DestroyDeviceListener();
82cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
83cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  scoped_ptr<AudioDeviceListenerMac> output_device_listener_;
84172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
85cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  // Track the output sample-rate and the default output device
86cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  // so we can intelligently handle device notifications only when necessary.
87172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  int current_sample_rate_;
88cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  AudioDeviceID current_output_device_;
89cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
90172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich  AggregateDeviceManager aggregate_device_manager_;
91cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
92cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project  DISALLOW_COPY_AND_ASSIGN(AudioManagerMac);
93172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich};
94cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project
95cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project}  // namespace media
96172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
97cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project#endif  // MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_
98cfb3b2780016b4e9ab4849e22d9c3acbaf535248The Android Open Source Project