audio_manager_openbsd.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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#include "media/audio/openbsd/audio_manager_openbsd.h" 6 7#include <fcntl.h> 8 9#include "base/command_line.h" 10#include "base/file_path.h" 11#include "base/stl_util.h" 12#include "media/audio/audio_output_dispatcher.h" 13#include "media/audio/audio_parameters.h" 14#include "media/audio/audio_util.h" 15#include "media/audio/pulse/pulse_output.h" 16#include "media/audio/pulse/pulse_stubs.h" 17#include "media/base/channel_layout.h" 18#include "media/base/limits.h" 19#include "media/base/media_switches.h" 20 21using media_audio_pulse::kModulePulse; 22using media_audio_pulse::InitializeStubs; 23using media_audio_pulse::StubPathMap; 24 25namespace media { 26 27// Maximum number of output streams that can be open simultaneously. 28static const int kMaxOutputStreams = 50; 29 30// Default sample rate for input and output streams. 31static const int kDefaultSampleRate = 48000; 32 33static const base::FilePath::CharType kPulseLib[] = 34 FILE_PATH_LITERAL("libpulse.so.0"); 35 36// Implementation of AudioManager. 37static bool HasAudioHardware() { 38 int fd; 39 const char *file; 40 41 if ((file = getenv("AUDIOCTLDEVICE")) == 0 || *file == '\0') 42 file = "/dev/audioctl"; 43 44 if ((fd = open(file, O_RDONLY)) < 0) 45 return false; 46 47 close(fd); 48 return true; 49} 50 51bool AudioManagerOpenBSD::HasAudioOutputDevices() { 52 return HasAudioHardware(); 53} 54 55bool AudioManagerOpenBSD::HasAudioInputDevices() { 56 return HasAudioHardware(); 57} 58 59AudioParameters AudioManagerOpenBSD::GetInputStreamParameters( 60 const std::string& device_id) { 61 static const int kDefaultInputBufferSize = 1024; 62 63 return AudioParameters( 64 AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, 65 kDefaultSampleRate, 16, kDefaultInputBufferSize); 66} 67 68AudioManagerOpenBSD::AudioManagerOpenBSD() 69 : pulse_library_is_initialized_(false) { 70 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 71 StubPathMap paths; 72 73 // Check if the pulse library is avialbale. 74 paths[kModulePulse].push_back(kPulseLib); 75 if (!InitializeStubs(paths)) { 76 DLOG(WARNING) << "Failed on loading the Pulse library and symbols"; 77 return; 78 } 79 80 pulse_library_is_initialized_ = true; 81} 82 83AudioManagerOpenBSD::~AudioManagerOpenBSD() { 84 Shutdown(); 85} 86 87AudioOutputStream* AudioManagerOpenBSD::MakeLinearOutputStream( 88 const AudioParameters& params) { 89 DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format); 90 return MakeOutputStream(params); 91} 92 93AudioOutputStream* AudioManagerOpenBSD::MakeLowLatencyOutputStream( 94 const AudioParameters& params) { 95 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format); 96 return MakeOutputStream(params); 97} 98 99AudioInputStream* AudioManagerOpenBSD::MakeLinearInputStream( 100 const AudioParameters& params, const std::string& device_id) { 101 DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format); 102 NOTIMPLEMENTED(); 103 return NULL; 104} 105 106AudioInputStream* AudioManagerOpenBSD::MakeLowLatencyInputStream( 107 const AudioParameters& params, const std::string& device_id) { 108 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format); 109 NOTIMPLEMENTED(); 110 return NULL; 111} 112 113AudioParameters AudioManagerOpenBSD::GetPreferredOutputStreamParameters( 114 const AudioParameters& input_params) { 115 static const int kDefaultOutputBufferSize = 512; 116 117 ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 118 int sample_rate = kDefaultSampleRate; 119 int buffer_size = kDefaultOutputBufferSize; 120 int bits_per_sample = 16; 121 int input_channels = 0; 122 if (input_params.IsValid()) { 123 sample_rate = input_params.sample_rate(); 124 bits_per_sample = input_params.bits_per_sample(); 125 channel_layout = input_params.channel_layout(); 126 input_channels = input_params.input_channels(); 127 buffer_size = std::min(buffer_size, input_params.frames_per_buffer()); 128 } 129 130 int user_buffer_size = GetUserBufferSize(); 131 if (user_buffer_size) 132 buffer_size = user_buffer_size; 133 134 return AudioParameters( 135 AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, input_channels, 136 sample_rate, bits_per_sample, buffer_size); 137} 138 139AudioOutputStream* AudioManagerOpenBSD::MakeOutputStream( 140 const AudioParameters& params) { 141 if (pulse_library_is_initialized_) 142 return new PulseAudioOutputStream(params, this); 143 144 return NULL; 145} 146 147// TODO(xians): Merge AudioManagerOpenBSD with AudioManagerPulse; 148// static 149AudioManager* CreateAudioManager() { 150 return new AudioManagerOpenBSD(); 151} 152 153} // namespace media 154