Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Unified Diff: media/audio/audio_input_device.cc

Issue 12379071: Use multiple shared memory buffers cyclically for audio capture. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: address a missed comment Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/audio/audio_input_device.cc
===================================================================
--- media/audio/audio_input_device.cc (revision 186364)
+++ media/audio/audio_input_device.cc (working copy)
@@ -11,6 +11,14 @@
#include "media/audio/audio_manager_base.h"
#include "media/base/audio_bus.h"
+namespace {
+// The number of shared memory buffer segments indicated to browser process
+// in order to avoid data overwriting. This number can be any positive number,
+// dependent how fast the renderer process can pick up captured data from
+// shared memory.
+int kRequestedSharedMemoryCount = 10;
DaleCurtis 2013/03/07 02:04:37 static const int or make it an enum. media/ code
wjia(left Chromium) 2013/03/10 18:19:49 anonymous namespace is better than static since it
DaleCurtis 2013/03/11 20:00:47 While the Chromium style guide explicitly says unn
wjia(left Chromium) 2013/03/11 20:34:27 Done.
+}
+
namespace media {
// Takes care of invoking the capture callback on the audio thread.
@@ -22,6 +30,7 @@
AudioThreadCallback(const AudioParameters& audio_parameters,
base::SharedMemoryHandle memory,
int memory_length,
+ int total_segments,
CaptureCallback* capture_callback);
virtual ~AudioThreadCallback();
@@ -31,6 +40,7 @@
virtual void Process(int pending_data) OVERRIDE;
private:
+ int current_segment_id_;
CaptureCallback* capture_callback_;
scoped_ptr<AudioBus> audio_bus_;
DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback);
@@ -104,7 +114,8 @@
void AudioInputDevice::OnStreamCreated(
base::SharedMemoryHandle handle,
base::SyncSocket::Handle socket_handle,
- int length) {
+ int length,
+ int total_segments) {
DCHECK(message_loop()->BelongsToCurrentThread());
#if defined(OS_WIN)
DCHECK(handle);
@@ -127,8 +138,8 @@
DCHECK(audio_thread_.IsStopped());
audio_callback_.reset(
- new AudioInputDevice::AudioThreadCallback(audio_parameters_, handle,
- length, callback_));
+ new AudioInputDevice::AudioThreadCallback(
+ audio_parameters_, handle, length, total_segments, callback_));
audio_thread_.Start(audio_callback_.get(), socket_handle, "AudioInputDevice");
MessageLoop::current()->PostTask(FROM_HERE,
@@ -196,7 +207,7 @@
stream_id_ = 0;
} else {
ipc_->CreateStream(stream_id_, audio_parameters_, device_id,
- agc_is_enabled_);
+ agc_is_enabled_, kRequestedSharedMemoryCount);
}
pending_device_ready_ = false;
@@ -228,7 +239,8 @@
// and create the stream when getting a OnDeviceReady() callback.
if (!session_id_) {
ipc_->CreateStream(stream_id_, audio_parameters_,
- AudioManagerBase::kDefaultDeviceId, agc_is_enabled_);
+ AudioManagerBase::kDefaultDeviceId, agc_is_enabled_,
+ kRequestedSharedMemoryCount);
} else {
ipc_->StartDevice(stream_id_, session_id_);
pending_device_ready_ = true;
@@ -302,8 +314,11 @@
const AudioParameters& audio_parameters,
base::SharedMemoryHandle memory,
int memory_length,
+ int total_segments,
CaptureCallback* capture_callback)
- : AudioDeviceThread::Callback(audio_parameters, memory, memory_length),
+ : AudioDeviceThread::Callback(audio_parameters, memory, memory_length,
+ total_segments),
+ current_segment_id_(0),
capture_callback_(capture_callback) {
audio_bus_ = AudioBus::Create(audio_parameters_);
}
@@ -319,16 +334,20 @@
// The shared memory represents parameters, size of the data buffer and the
// actual data buffer containing audio data. Map the memory into this
// structure and parse out parameters and the data area.
- AudioInputBuffer* buffer =
- reinterpret_cast<AudioInputBuffer*>(shared_memory_.memory());
+ uint8* ptr = reinterpret_cast<uint8*>(shared_memory_.memory());
DaleCurtis 2013/03/07 02:04:37 static_cast ?
wjia(left Chromium) 2013/03/10 18:19:49 Done.
+ ptr += current_segment_id_ * segment_length_;
+ AudioInputBuffer* buffer = reinterpret_cast<AudioInputBuffer*>(ptr);
DCHECK_EQ(buffer->params.size,
- memory_length_ - sizeof(AudioInputBufferParameters));
+ segment_length_ - sizeof(AudioInputBufferParameters));
double volume = buffer->params.volume;
int audio_delay_milliseconds = pending_data / bytes_per_ms_;
int16* memory = reinterpret_cast<int16*>(&buffer->audio[0]);
const int bytes_per_sample = sizeof(memory[0]);
+ if (++current_segment_id_ >= total_segments_)
DaleCurtis 2013/03/07 02:04:37 Same modulus comment.
wjia(left Chromium) 2013/03/10 18:19:49 Same reply. :-)
+ current_segment_id_ = 0;
+
// Deinterleave each channel and convert to 32-bit floating-point
// with nominal range -1.0 -> +1.0.
audio_bus_->FromInterleaved(memory, audio_bus_->frames(), bytes_per_sample);

Powered by Google App Engine
This is Rietveld 408576698