summaryrefslogtreecommitdiffstats
path: root/media/audio
diff options
context:
space:
mode:
authorxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-10 14:21:07 +0000
committerxians@chromium.org <xians@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-10 14:21:07 +0000
commitdd1b2700e460f27147ccfea1f6a84fcb95f29214 (patch)
tree3e49ce88cde51f77b9549d9281efe33df650d9b8 /media/audio
parent0d64efba912bd9caf0ac364bfa4f0ac62b894bce (diff)
downloadchromium_src-dd1b2700e460f27147ccfea1f6a84fcb95f29214.zip
chromium_src-dd1b2700e460f27147ccfea1f6a84fcb95f29214.tar.gz
chromium_src-dd1b2700e460f27147ccfea1f6a84fcb95f29214.tar.bz2
Use a dynamic kNoAudioReadAgainTimeoutMs which is equivalent to half of packetsize in MS to be able to use 10ms buffer size for recording in linux.
Also use the same minimum required latency as output does, to make sure it handles the linux kernel timeslice. Bug=None Test=Manual test in browser and chromebook Review URL: http://codereview.chromium.org/8203006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@109423 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio')
-rw-r--r--media/audio/linux/alsa_input.cc22
1 files changed, 13 insertions, 9 deletions
diff --git a/media/audio/linux/alsa_input.cc b/media/audio/linux/alsa_input.cc
index 725ecb4..a986238 100644
--- a/media/audio/linux/alsa_input.cc
+++ b/media/audio/linux/alsa_input.cc
@@ -10,15 +10,13 @@
#include "base/message_loop.h"
#include "base/time.h"
#include "media/audio/audio_manager.h"
+#include "media/audio/linux/alsa_output.h"
#include "media/audio/linux/alsa_util.h"
#include "media/audio/linux/alsa_wrapper.h"
#include "media/audio/linux/audio_manager_linux.h"
static const int kNumPacketsInRingBuffer = 3;
-// If a read failed with no audio data, try again after this duration.
-static const int kNoAudioReadAgainTimeoutMs = 20;
-
static const char kDefaultDevice1[] = "default";
static const char kDefaultDevice2[] = "plug:default";
@@ -55,8 +53,12 @@ bool AlsaPcmInputStream::Open() {
return false;
}
- int latency_us = packet_duration_ms_ * kNumPacketsInRingBuffer *
+ uint32 latency_us = packet_duration_ms_ * kNumPacketsInRingBuffer *
base::Time::kMicrosecondsPerMillisecond;
+
+ // Use the same minimum required latency as output.
+ latency_us = std::max(latency_us, AlsaPcmOutputStream::kMinLatencyMicros);
+
if (device_name_ == kAutoSelectDevice) {
device_handle_ = alsa_util::OpenCaptureDevice(wrapper_, kDefaultDevice1,
params_.channels,
@@ -97,10 +99,10 @@ void AlsaPcmInputStream::Start(AudioInputCallback* callback) {
if (error < 0) {
callback_ = NULL;
} else {
- // We start reading data a little later than when the packet might have got
- // filled, to accommodate some delays in the audio driver. This could
- // also give us a smooth read sequence going forward.
- int64 delay_ms = packet_duration_ms_ + kNoAudioReadAgainTimeoutMs;
+ // We start reading data half |packet_duration_ms_| later than when the
+ // packet might have got filled, to accommodate some delays in the audio
+ // driver. This could also give us a smooth read sequence going forward.
+ int64 delay_ms = packet_duration_ms_ + packet_duration_ms_ / 2;
next_read_time_ = base::Time::Now() + base::TimeDelta::FromMilliseconds(
delay_ms);
MessageLoop::current()->PostDelayedTask(
@@ -171,10 +173,12 @@ void AlsaPcmInputStream::ReadAudio() {
next_read_time_ = base::Time::Now();
read_callback_behind_schedule_ = false;
}
+
+ uint32 next_check_time = packet_duration_ms_ / 2;
MessageLoop::current()->PostDelayedTask(
FROM_HERE,
base::Bind(&AlsaPcmInputStream::ReadAudio, weak_factory_.GetWeakPtr()),
- kNoAudioReadAgainTimeoutMs);
+ next_check_time);
return;
}