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

Unified Diff: media/audio/audio_input_device.cc

Issue 1293503002: Check buffer index in shared memory for input audio. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Now the Win compile error should really be fixed. Created 5 years, 4 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
diff --git a/media/audio/audio_input_device.cc b/media/audio/audio_input_device.cc
index 9f46b55a1b9f365facd573b5f0783cd15f9923af..1294c9f764edf801adfe00cc25e9b4815660f37f 100644
--- a/media/audio/audio_input_device.cc
+++ b/media/audio/audio_input_device.cc
@@ -39,6 +39,7 @@ class AudioInputDevice::AudioThreadCallback
private:
int current_segment_id_;
+ uint32 last_buffer_id_;
ScopedVector<media::AudioBus> audio_buses_;
CaptureCallback* capture_callback_;
@@ -272,6 +273,7 @@ AudioInputDevice::AudioThreadCallback::AudioThreadCallback(
: AudioDeviceThread::Callback(audio_parameters, memory, memory_length,
total_segments),
current_segment_id_(0),
+ last_buffer_id_(UINT32_MAX),
capture_callback_(capture_callback) {
}
@@ -294,27 +296,34 @@ void AudioInputDevice::AudioThreadCallback::MapSharedMemory() {
}
void AudioInputDevice::AudioThreadCallback::Process(uint32 pending_data) {
+ CHECK_EQ(current_segment_id_, static_cast<int>(pending_data));
+
// 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.
uint8* ptr = static_cast<uint8*>(shared_memory_.memory());
ptr += current_segment_id_ * segment_length_;
AudioInputBuffer* buffer = reinterpret_cast<AudioInputBuffer*>(ptr);
+
// Usually this will be equal but in the case of low sample rate (e.g. 8kHz,
// the buffer may be bigger (on mac at least)).
DCHECK_GE(buffer->params.size,
segment_length_ - sizeof(AudioInputBufferParameters));
- double volume = buffer->params.volume;
- bool key_pressed = buffer->params.key_pressed;
+
+ // Verify correct sequence.
+ CHECK_EQ(last_buffer_id_ + 1, buffer->params.id);
+ last_buffer_id_ = buffer->params.id;
// Use pre-allocated audio bus wrapping existing block of shared memory.
media::AudioBus* audio_bus = audio_buses_[current_segment_id_];
- // Deliver captured data to the client in floating point format
- // and update the audio-delay measurement.
- int audio_delay_milliseconds = pending_data / bytes_per_ms_;
+ // Deliver captured data to the client in floating point format and update
+ // the audio delay measurement.
capture_callback_->Capture(
- audio_bus, audio_delay_milliseconds, volume, key_pressed);
+ audio_bus,
+ buffer->params.hardware_delay_bytes / bytes_per_ms_, // Delay in ms
+ buffer->params.volume,
+ buffer->params.key_pressed);
if (++current_segment_id_ >= total_segments_)
current_segment_id_ = 0;

Powered by Google App Engine
This is Rietveld 408576698