Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / media / audio / openbsd / audio_manager_openbsd.cc
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/pulse/pulse_output.h"
15 #include "media/audio/pulse/pulse_stubs.h"
16 #include "media/base/channel_layout.h"
17 #include "media/base/limits.h"
18 #include "media/base/media_switches.h"
19
20 using media_audio_pulse::kModulePulse;
21 using media_audio_pulse::InitializeStubs;
22 using media_audio_pulse::StubPathMap;
23
24 namespace media {
25
26 // Maximum number of output streams that can be open simultaneously.
27 static const int kMaxOutputStreams = 50;
28
29 // Default sample rate for input and output streams.
30 static const int kDefaultSampleRate = 48000;
31
32 static const base::FilePath::CharType kPulseLib[] =
33     FILE_PATH_LITERAL("libpulse.so.0");
34
35 // Implementation of AudioManager.
36 static bool HasAudioHardware() {
37   int fd;
38   const char *file;
39
40   if ((file = getenv("AUDIOCTLDEVICE")) == 0 || *file == '\0')
41     file = "/dev/audioctl";
42
43   if ((fd = open(file, O_RDONLY)) < 0)
44     return false;
45
46   close(fd);
47   return true;
48 }
49
50 bool AudioManagerOpenBSD::HasAudioOutputDevices() {
51   return HasAudioHardware();
52 }
53
54 bool AudioManagerOpenBSD::HasAudioInputDevices() {
55   return HasAudioHardware();
56 }
57
58 AudioParameters AudioManagerOpenBSD::GetInputStreamParameters(
59     const std::string& device_id) {
60   static const int kDefaultInputBufferSize = 1024;
61
62   return AudioParameters(
63       AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO,
64       kDefaultSampleRate, 16, kDefaultInputBufferSize);
65 }
66
67 AudioManagerOpenBSD::AudioManagerOpenBSD(AudioLogFactory* audio_log_factory)
68     : AudioManagerBase(audio_log_factory),
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
83 AudioManagerOpenBSD::~AudioManagerOpenBSD() {
84   Shutdown();
85 }
86
87 AudioOutputStream* AudioManagerOpenBSD::MakeLinearOutputStream(
88     const AudioParameters& params) {
89   DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format);
90   return MakeOutputStream(params);
91 }
92
93 AudioOutputStream* AudioManagerOpenBSD::MakeLowLatencyOutputStream(
94     const AudioParameters& params,
95     const std::string& device_id) {
96   DLOG_IF(ERROR, !device_id.empty()) << "Not implemented!";
97   DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format);
98   return MakeOutputStream(params);
99 }
100
101 AudioInputStream* AudioManagerOpenBSD::MakeLinearInputStream(
102     const AudioParameters& params, const std::string& device_id) {
103   DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format);
104   NOTIMPLEMENTED();
105   return NULL;
106 }
107
108 AudioInputStream* AudioManagerOpenBSD::MakeLowLatencyInputStream(
109     const AudioParameters& params, const std::string& device_id) {
110   DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format);
111   NOTIMPLEMENTED();
112   return NULL;
113 }
114
115 AudioParameters AudioManagerOpenBSD::GetPreferredOutputStreamParameters(
116     const std::string& output_device_id,
117     const AudioParameters& input_params) {
118   // TODO(tommi): Support |output_device_id|.
119   DLOG_IF(ERROR, !output_device_id.empty()) << "Not implemented!";
120   static const int kDefaultOutputBufferSize = 512;
121
122   ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
123   int sample_rate = kDefaultSampleRate;
124   int buffer_size = kDefaultOutputBufferSize;
125   int bits_per_sample = 16;
126   int input_channels = 0;
127   if (input_params.IsValid()) {
128     sample_rate = input_params.sample_rate();
129     bits_per_sample = input_params.bits_per_sample();
130     channel_layout = input_params.channel_layout();
131     input_channels = input_params.input_channels();
132     buffer_size = std::min(buffer_size, input_params.frames_per_buffer());
133   }
134
135   int user_buffer_size = GetUserBufferSize();
136   if (user_buffer_size)
137     buffer_size = user_buffer_size;
138
139   return AudioParameters(
140       AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, input_channels,
141       sample_rate, bits_per_sample, buffer_size, AudioParameters::NO_EFFECTS);
142 }
143
144 AudioOutputStream* AudioManagerOpenBSD::MakeOutputStream(
145     const AudioParameters& params) {
146   if (pulse_library_is_initialized_)
147     return new PulseAudioOutputStream(params, this);
148
149   return NULL;
150 }
151
152 // TODO(xians): Merge AudioManagerOpenBSD with AudioManagerPulse;
153 // static
154 AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory) {
155   return new AudioManagerOpenBSD(audio_log_factory);
156 }
157
158 }  // namespace media