audio_manager_mac.h revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
12945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer// Use of this source code is governed by a BSD-style license that can be 32945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer// found in the LICENSE file. 42945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer 52945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#ifndef MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_ 62945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#define MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_ 72945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer 82945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include <CoreAudio/AudioHardware.h> 92945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include <string> 102945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer 112945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include "base/basictypes.h" 122945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include "base/compiler_specific.h" 132945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include "base/message_loop/message_loop_proxy.h" 142945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include "media/audio/audio_manager_base.h" 152945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include "media/audio/mac/aggregate_device_manager.h" 162945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer#include "media/audio/mac/audio_device_listener_mac.h" 172945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramer 182945a32ffd0bf079de1b23db12bc8a0de596a167Benjamin Kramernamespace media { 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Mac OS X implementation of the AudioManager singleton. This class is internal 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// to the audio output and only internal users can call methods not exposed by 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// the AudioManager class. 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MEDIA_EXPORT AudioManagerMac : public AudioManagerBase { 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines public: 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AudioManagerMac(); 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Implementation of AudioManager. 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual bool HasAudioOutputDevices() OVERRIDE; 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual bool HasAudioInputDevices() OVERRIDE; 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void GetAudioInputDeviceNames( 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AudioDeviceNames* device_names) OVERRIDE; 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual void GetAudioOutputDeviceNames( 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AudioDeviceNames* device_names) OVERRIDE; 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual AudioParameters GetInputStreamParameters( 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::string& device_id) OVERRIDE; 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual std::string GetAssociatedOutputDeviceID( 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::string& input_device_id) OVERRIDE; 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Implementation of AudioManagerBase. 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual AudioOutputStream* MakeLinearOutputStream( 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const AudioParameters& params) OVERRIDE; 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines virtual AudioOutputStream* MakeLowLatencyOutputStream( 43e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat const AudioParameters& params, 44e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat const std::string& device_id, 45e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat const std::string& input_device_id) OVERRIDE; 46e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat virtual AudioInputStream* MakeLinearInputStream( 47e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat const AudioParameters& params, const std::string& device_id) OVERRIDE; 48e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat virtual AudioInputStream* MakeLowLatencyInputStream( 49e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat const AudioParameters& params, const std::string& device_id) OVERRIDE; 50e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat virtual std::string GetDefaultOutputDeviceID() OVERRIDE; 51e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 52e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat static bool GetDefaultInputDevice(AudioDeviceID* device); 53e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat static bool GetDefaultOutputDevice(AudioDeviceID* device); 54e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat static bool GetDefaultDevice(AudioDeviceID* device, bool input); 55e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 56e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat static bool GetDefaultOutputChannels(int* channels); 57e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 58e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat static bool GetDeviceChannels(AudioDeviceID device, 59e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat AudioObjectPropertyScope scope, 60e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat int* channels); 61e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 62e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat static int HardwareSampleRateForDevice(AudioDeviceID device_id); 63e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat static int HardwareSampleRate(); 64e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 65e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat // Notify streams of a device change if the default output device or its 66e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat // sample rate has changed, otherwise does nothing. 67e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat void HandleDeviceChanges(); 68e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 69e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat protected: 70e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat virtual ~AudioManagerMac(); 71e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 72e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat virtual AudioParameters GetPreferredOutputStreamParameters( 73e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat const std::string& output_device_id, 74e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat const AudioParameters& input_params) OVERRIDE; 75e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 76e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat private: 77e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat bool HasUnifiedDefaultIO(); 78e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 79e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat // Helper methods for constructing AudioDeviceListenerMac on the audio thread. 80e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat void CreateDeviceListener(); 81e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat void DestroyDeviceListener(); 82e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 83e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat int ChooseBufferSize(int output_sample_rate); 84e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 85e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat scoped_ptr<AudioDeviceListenerMac> output_device_listener_; 86e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 87e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat // Track the output sample-rate and the default output device 88e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat // so we can intelligently handle device notifications only when necessary. 89e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat int current_sample_rate_; 90e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat AudioDeviceID current_output_device_; 91e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 92e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat AggregateDeviceManager aggregate_device_manager_; 93e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 94e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat DISALLOW_COPY_AND_ASSIGN(AudioManagerMac); 95e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat}; 96e1e9366281a98cd06b61d5d7e136ce2b1a433ba6Jean-Luc Duprat 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // namespace media 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif // MEDIA_AUDIO_MAC_AUDIO_MANAGER_MAC_H_ 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines