Chromium Code Reviews| Index: content/browser/renderer_host/media/audio_input_sync_writer.cc |
| diff --git a/content/browser/renderer_host/media/audio_input_sync_writer.cc b/content/browser/renderer_host/media/audio_input_sync_writer.cc |
| index 117fbe8fedbbec72e086e7a22597ef126ff2b238..94c7e0cf727951ea46db0bc09d7b2a7032768c87 100644 |
| --- a/content/browser/renderer_host/media/audio_input_sync_writer.cc |
| +++ b/content/browser/renderer_host/media/audio_input_sync_writer.cc |
| @@ -7,12 +7,36 @@ |
| #include <algorithm> |
| #include "base/memory/shared_memory.h" |
| +#include "base/metrics/histogram.h" |
| +#include "base/strings/stringprintf.h" |
| #include "content/browser/renderer_host/media/media_stream_manager.h" |
| using media::AudioBus; |
| namespace content { |
| +namespace { |
| + |
| +enum AudioInputBufferType { |
| + AUDIO_INPUT_SINGLE_BUFFER = 0, |
| + AUDIO_INPUT_CIRCULAR_BUFFER = 1, |
| + NUM_AUDIO_INPUT_BUFFER |
| +}; |
| + |
| +// Log to native log and uma stats that all the buffers are full. |
| +void LogAllBuffersAreFull(int number_of_buffers) { |
| + AudioInputBufferType type = AUDIO_INPUT_SINGLE_BUFFER; |
| + if (number_of_buffers != 1) { |
| + type = AUDIO_INPUT_CIRCULAR_BUFFER; |
| + MediaStreamManager::SendMessageToNativeLog(base::StringPrintf( |
| + "AIS, circular buffers are full. Number of buffers is %d", |
| + number_of_buffers)); |
| + } |
| + UMA_HISTOGRAM_ENUMERATION("Media.AudioInputSyncWriterBuffersAreFull", type, |
| + NUM_AUDIO_INPUT_BUFFER); |
| +} |
| +} |
|
Alexei Svitkine (slow)
2014/08/29 22:22:18
Nit: Add "// namespace" and a blank line before th
no longer working on chromium
2014/09/02 10:00:21
Done.
|
| + |
| AudioInputSyncWriter::AudioInputSyncWriter(base::SharedMemory* shared_memory, |
| int shared_memory_segment_count, |
| const media::AudioParameters& params) |
| @@ -44,14 +68,9 @@ AudioInputSyncWriter::AudioInputSyncWriter(base::SharedMemory* shared_memory, |
| AudioInputSyncWriter::~AudioInputSyncWriter() {} |
| -// TODO(henrika): Combine into one method (including Write). |
| -void AudioInputSyncWriter::UpdateRecordedBytes(uint32 bytes) { |
| - socket_->Send(&bytes, sizeof(bytes)); |
| -} |
| - |
| -void AudioInputSyncWriter::Write(const media::AudioBus* data, |
| - double volume, |
| - bool key_pressed) { |
| +void AudioInputSyncWriter::Write(const media::AudioBus* data, double volume, |
| + bool key_pressed, |
| + uint32 hardware_delay_bytes) { |
| #if !defined(OS_ANDROID) |
| static const base::TimeDelta kLogDelayThreadhold = |
| base::TimeDelta::FromMilliseconds(500); |
| @@ -70,8 +89,7 @@ void AudioInputSyncWriter::Write(const media::AudioBus* data, |
| << interval.InMilliseconds() << "ms."; |
| } |
| } |
| - if (!oss.str().empty()) |
| - MediaStreamManager::SendMessageToNativeLog(oss.str()); |
| + if (!oss.str().empty()) MediaStreamManager::SendMessageToNativeLog(oss.str()); |
| last_write_time_ = base::Time::Now(); |
| #endif |
| @@ -81,6 +99,12 @@ void AudioInputSyncWriter::Write(const media::AudioBus* data, |
| ptr += current_segment_id_ * shared_memory_segment_size_; |
| media::AudioInputBuffer* buffer = |
| reinterpret_cast<media::AudioInputBuffer*>(ptr); |
| + |
| + // The renderer should set the size to 0 after consuming the buffer. In case |
| + // it is not 0, it means buffer has not been consumed yet. |
| + if (buffer->params.size) |
| + LogAllBuffersAreFull(shared_memory_segment_size_); |
| + |
| buffer->params.volume = volume; |
| buffer->params.size = audio_bus_memory_size_; |
| buffer->params.key_pressed = key_pressed; |
| @@ -92,12 +116,13 @@ void AudioInputSyncWriter::Write(const media::AudioBus* data, |
| if (++current_segment_id_ >= shared_memory_segment_count_) |
| current_segment_id_ = 0; |
| -} |
| -void AudioInputSyncWriter::Close() { |
| - socket_->Close(); |
| + // Notify the synchronous peer. |
| + socket_->Send(&hardware_delay_bytes, sizeof(hardware_delay_bytes)); |
| } |
| +void AudioInputSyncWriter::Close() { socket_->Close(); } |
| + |
| bool AudioInputSyncWriter::Init() { |
| socket_.reset(new base::CancelableSyncSocket()); |
| foreign_socket_.reset(new base::CancelableSyncSocket()); |
| @@ -111,8 +136,8 @@ bool AudioInputSyncWriter::PrepareForeignSocketHandle( |
| base::ProcessHandle process_handle, |
| base::SyncSocket::Handle* foreign_handle) { |
| ::DuplicateHandle(GetCurrentProcess(), foreign_socket_->handle(), |
| - process_handle, foreign_handle, |
| - 0, FALSE, DUPLICATE_SAME_ACCESS); |
| + process_handle, foreign_handle, 0, FALSE, |
| + DUPLICATE_SAME_ACCESS); |
| return (*foreign_handle != 0); |
| } |