summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-19 09:26:48 +0000
committerxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-19 09:26:48 +0000
commit3d783275af588a122715d3c9d33ca291704888cd (patch)
tree2342ec7b54ad5053e36ad6d848c967c950e38029 /media
parent9b105e953c894527510337c6bb8d8a8989f3bcbc (diff)
downloadchromium_src-3d783275af588a122715d3c9d33ca291704888cd.zip
chromium_src-3d783275af588a122715d3c9d33ca291704888cd.tar.gz
chromium_src-3d783275af588a122715d3c9d33ca291704888cd.tar.bz2
Pass through small buffer sizes without FIFO on Linux.
TBR=dalecurtis@chromium.org BUG=150570 TEST=content_unittests, manual tests: WebRTC on linux works fine. Review URL: https://codereview.chromium.org/10910306 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@157524 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r--media/audio/linux/audio_manager_linux.cc20
-rw-r--r--media/audio/linux/audio_manager_linux.h2
-rw-r--r--media/audio/win/audio_manager_win.h1
3 files changed, 22 insertions, 1 deletions
diff --git a/media/audio/linux/audio_manager_linux.cc b/media/audio/linux/audio_manager_linux.cc
index b126ed1..e7da931 100644
--- a/media/audio/linux/audio_manager_linux.cc
+++ b/media/audio/linux/audio_manager_linux.cc
@@ -10,7 +10,9 @@
#include "base/nix/xdg_util.h"
#include "base/process_util.h"
#include "base/stl_util.h"
+#include "media/audio/audio_parameters.h"
#include "media/audio/audio_output_dispatcher.h"
+#include "media/audio/audio_util.h"
#include "media/audio/linux/alsa_input.h"
#include "media/audio/linux/alsa_output.h"
#include "media/audio/linux/alsa_wrapper.h"
@@ -342,4 +344,22 @@ AudioManager* CreateAudioManager() {
return new AudioManagerLinux();
}
+AudioParameters AudioManagerLinux::GetPreferredLowLatencyOutputStreamParameters(
+ const AudioParameters& input_params) {
+ // Since Linux doesn't actually have a low latency path the hardware buffer
+ // size is quite large in order to prevent glitches with general usage. Some
+ // clients, such as WebRTC, have a more limited use case and work acceptably
+ // with a smaller buffer size. The check below allows clients which want to
+ // try a smaller buffer size on Linux to do so.
+ int buffer_size = std::min(
+ static_cast<size_t>(input_params.frames_per_buffer()),
+ GetAudioHardwareBufferSize());
+
+ // TODO(dalecurtis): This should include bits per channel and channel layout
+ // eventually.
+ return AudioParameters(
+ AudioParameters::AUDIO_PCM_LOW_LATENCY, input_params.channel_layout(),
+ GetAudioHardwareSampleRate(), 16, buffer_size);
+}
+
} // namespace media
diff --git a/media/audio/linux/audio_manager_linux.h b/media/audio/linux/audio_manager_linux.h
index bfa3655..2d71605 100644
--- a/media/audio/linux/audio_manager_linux.h
+++ b/media/audio/linux/audio_manager_linux.h
@@ -39,6 +39,8 @@ class MEDIA_EXPORT AudioManagerLinux : public AudioManagerBase {
const AudioParameters& params, const std::string& device_id) OVERRIDE;
virtual AudioInputStream* MakeLowLatencyInputStream(
const AudioParameters& params, const std::string& device_id) OVERRIDE;
+ virtual AudioParameters GetPreferredLowLatencyOutputStreamParameters(
+ const AudioParameters& input_params) OVERRIDE;
protected:
virtual ~AudioManagerLinux();
diff --git a/media/audio/win/audio_manager_win.h b/media/audio/win/audio_manager_win.h
index ffe79a3e..6a4efcb 100644
--- a/media/audio/win/audio_manager_win.h
+++ b/media/audio/win/audio_manager_win.h
@@ -39,7 +39,6 @@ class MEDIA_EXPORT AudioManagerWin : public AudioManagerBase {
const AudioParameters& params, const std::string& device_id) OVERRIDE;
virtual AudioInputStream* MakeLowLatencyInputStream(
const AudioParameters& params, const std::string& device_id) OVERRIDE;
-
virtual AudioParameters GetPreferredLowLatencyOutputStreamParameters(
const AudioParameters& input_params) OVERRIDE;