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