audio_manager_openbsd.cc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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. #include "base/metrics/histogram_macros.h"
  5. #include "media/audio/openbsd/audio_manager_openbsd.h"
  6. #include "media/audio/audio_device_description.h"
  7. #include "media/audio/audio_output_dispatcher.h"
  8. #if defined(USE_PULSEAUDIO)
  9. #include "media/audio/pulse/audio_manager_pulse.h"
  10. #endif
  11. #if defined(USE_SNDIO)
  12. #include "media/audio/sndio/sndio_input.h"
  13. #include "media/audio/sndio/sndio_output.h"
  14. #else
  15. #include "media/audio/fake_audio_manager.h"
  16. #endif
  17. #include "media/base/limits.h"
  18. #include "media/base/media_switches.h"
  19. namespace media {
  20. enum OpenBSDAudioIO {
  21. kPulse,
  22. kSndio,
  23. kAudioIOMax = kSndio
  24. };
  25. #if defined(USE_SNDIO)
  26. // Maximum number of output streams that can be open simultaneously.
  27. static const int kMaxOutputStreams = 4;
  28. // Default sample rate for input and output streams.
  29. static const int kDefaultSampleRate = 48000;
  30. void AddDefaultDevice(AudioDeviceNames* device_names) {
  31. DCHECK(device_names->empty());
  32. device_names->push_front(AudioDeviceName::CreateDefault());
  33. }
  34. bool AudioManagerOpenBSD::HasAudioOutputDevices() {
  35. return true;
  36. }
  37. bool AudioManagerOpenBSD::HasAudioInputDevices() {
  38. return true;
  39. }
  40. void AudioManagerOpenBSD::ShowAudioInputSettings() {
  41. NOTIMPLEMENTED();
  42. }
  43. void AudioManagerOpenBSD::GetAudioInputDeviceNames(
  44. AudioDeviceNames* device_names) {
  45. DCHECK(device_names->empty());
  46. AddDefaultDevice(device_names);
  47. }
  48. void AudioManagerOpenBSD::GetAudioOutputDeviceNames(
  49. AudioDeviceNames* device_names) {
  50. AddDefaultDevice(device_names);
  51. }
  52. #if defined(USE_SNDIO)
  53. const char* AudioManagerOpenBSD::GetName() {
  54. return "SNDIO";
  55. }
  56. #endif
  57. AudioParameters AudioManagerOpenBSD::GetInputStreamParameters(
  58. const std::string& device_id) {
  59. static const int kDefaultInputBufferSize = 1024;
  60. int user_buffer_size = GetUserBufferSize();
  61. int buffer_size = user_buffer_size ?
  62. user_buffer_size : kDefaultInputBufferSize;
  63. return AudioParameters(
  64. AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO,
  65. kDefaultSampleRate, 16, buffer_size);
  66. }
  67. AudioManagerOpenBSD::AudioManagerOpenBSD(
  68. scoped_refptr<base::SingleThreadTaskRunner> task_runner,
  69. scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
  70. AudioLogFactory* audio_log_factory)
  71. : AudioManagerBase(std::move(task_runner),
  72. std::move(worker_task_runner),
  73. audio_log_factory) {
  74. DLOG(WARNING) << "AudioManagerOpenBSD";
  75. SetMaxOutputStreamsAllowed(kMaxOutputStreams);
  76. }
  77. AudioManagerOpenBSD::~AudioManagerOpenBSD() {
  78. Shutdown();
  79. }
  80. AudioOutputStream* AudioManagerOpenBSD::MakeLinearOutputStream(
  81. const AudioParameters& params,
  82. const LogCallback& log_callback) {
  83. DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format());
  84. return MakeOutputStream(params);
  85. }
  86. AudioOutputStream* AudioManagerOpenBSD::MakeLowLatencyOutputStream(
  87. const AudioParameters& params,
  88. const std::string& device_id,
  89. const LogCallback& log_callback) {
  90. DLOG_IF(ERROR, !device_id.empty()) << "Not implemented!";
  91. DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format());
  92. return MakeOutputStream(params);
  93. }
  94. AudioInputStream* AudioManagerOpenBSD::MakeLinearInputStream(
  95. const AudioParameters& params,
  96. const std::string& device_id,
  97. const LogCallback& log_callback) {
  98. DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format());
  99. return MakeInputStream(params);
  100. }
  101. AudioInputStream* AudioManagerOpenBSD::MakeLowLatencyInputStream(
  102. const AudioParameters& params,
  103. const std::string& device_id,
  104. const LogCallback& log_callback) {
  105. DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format());
  106. return MakeInputStream(params);
  107. }
  108. AudioParameters AudioManagerOpenBSD::GetPreferredOutputStreamParameters(
  109. const std::string& output_device_id,
  110. const AudioParameters& input_params) {
  111. // TODO(tommi): Support |output_device_id|.
  112. DLOG_IF(ERROR, !output_device_id.empty()) << "Not implemented!";
  113. static const int kDefaultOutputBufferSize = 2048;
  114. ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO;
  115. int sample_rate = kDefaultSampleRate;
  116. int buffer_size = kDefaultOutputBufferSize;
  117. int bits_per_sample = 16;
  118. if (input_params.IsValid()) {
  119. sample_rate = input_params.sample_rate();
  120. bits_per_sample = input_params.bits_per_sample();
  121. channel_layout = input_params.channel_layout();
  122. buffer_size = std::min(buffer_size, input_params.frames_per_buffer());
  123. }
  124. int user_buffer_size = GetUserBufferSize();
  125. if (user_buffer_size)
  126. buffer_size = user_buffer_size;
  127. return AudioParameters(
  128. AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout,
  129. sample_rate, bits_per_sample, buffer_size);
  130. }
  131. AudioInputStream* AudioManagerOpenBSD::MakeInputStream(
  132. const AudioParameters& params) {
  133. DLOG(WARNING) << "MakeInputStream";
  134. return new SndioAudioInputStream(this,
  135. AudioDeviceDescription::kDefaultDeviceId, params);
  136. }
  137. AudioOutputStream* AudioManagerOpenBSD::MakeOutputStream(
  138. const AudioParameters& params) {
  139. DLOG(WARNING) << "MakeOutputStream";
  140. return new SndioAudioOutputStream(params, this);
  141. }
  142. #endif
  143. ScopedAudioManagerPtr CreateAudioManager(
  144. scoped_refptr<base::SingleThreadTaskRunner> task_runner,
  145. scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner,
  146. AudioLogFactory* audio_log_factory) {
  147. DLOG(WARNING) << "CreateAudioManager";
  148. #if defined(USE_PULSEAUDIO)
  149. // Do not move task runners when creating AudioManagerPulse.
  150. // If the creation fails, we need to use the task runners to create other
  151. // AudioManager implementations.
  152. std::unique_ptr<AudioManagerPulse, AudioManagerDeleter> manager(
  153. new AudioManagerPulse(task_runner, worker_task_runner,
  154. audio_log_factory));
  155. if (manager->Init()) {
  156. UMA_HISTOGRAM_ENUMERATION("Media.OpenBSDAudioIO", kPulse, kAudioIOMax + 1);
  157. return std::move(manager);
  158. }
  159. DVLOG(1) << "PulseAudio is not available on the OS";
  160. #endif
  161. #if defined(USE_SNDIO)
  162. UMA_HISTOGRAM_ENUMERATION("Media.OpenBSDAudioIO", kSndio, kAudioIOMax + 1);
  163. return ScopedAudioManagerPtr(
  164. new AudioManagerOpenBSD(std::move(task_runner),
  165. std::move(worker_task_runner),audio_log_factory));
  166. #else
  167. return ScopedAudioManagerPtr(
  168. new FakeAudioManager(std::move(task_runner),
  169. std::move(worker_task_runner), audio_log_factory));
  170. #endif
  171. }
  172. } // namespace media