Index: content/browser/renderer_host/media/audio_sync_reader.cc |
diff --git a/content/browser/renderer_host/media/audio_sync_reader.cc b/content/browser/renderer_host/media/audio_sync_reader.cc |
index dea8ae2a2075a8b5f7cbfcd0efca8bad86dd1672..4f855c599427c2ce3016282b465c7ef1af27fe70 100644 |
--- a/content/browser/renderer_host/media/audio_sync_reader.cc |
+++ b/content/browser/renderer_host/media/audio_sync_reader.cc |
@@ -26,7 +26,10 @@ AudioSyncReader::AudioSyncReader(base::SharedMemory* shared_memory, |
mute_audio_(CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kMuteAudio)), |
renderer_callback_count_(0), |
- renderer_missed_callback_count_(0) { |
+ renderer_missed_callback_count_(0), |
+ // TODO(dalecurtis): Cap it at 20ms? |
+ maximum_wait_time_(params.GetBufferDuration() / 2), |
henrika (OOO until Aug 14)
2013/08/20 07:50:30
Just checking; what is the unit of GetBufferDurati
DaleCurtis
2013/09/11 01:16:03
base::TimeDelta
|
+ buffer_index_(0) { |
packet_size_ = media::PacketSizeInBytes(shared_memory_->requested_size()); |
int input_memory_size = 0; |
int output_memory_size = AudioBus::CalculateMemorySize(params); |
@@ -68,16 +71,15 @@ void AudioSyncReader::UpdatePendingBytes(uint32 bytes) { |
if (socket_) { |
socket_->Send(&bytes, sizeof(bytes)); |
+ buffer_index_++; |
tommi (sloooow) - chröme
2013/08/20 10:55:57
nit: ++buffer_index_;
DaleCurtis
2013/09/11 01:16:03
Done.
|
} |
} |
int AudioSyncReader::Read(bool block, const AudioBus* source, AudioBus* dest) { |
++renderer_callback_count_; |
- if (!DataReady()) { |
+ if (!WaitTillDataReady()) { |
++renderer_missed_callback_count_; |
- |
- if (block) |
- WaitTillDataReady(); |
+ return 0; |
} |
// Copy optional synchronized live audio input for consumption by renderer |
@@ -173,28 +175,36 @@ bool AudioSyncReader::PrepareForeignSocketHandle( |
} |
#endif |
-void AudioSyncReader::WaitTillDataReady() { |
+bool AudioSyncReader::WaitTillDataReady() { |
+ if (!socket_) |
tommi (sloooow) - chröme
2013/08/20 10:55:57
is this something exected or unexpected (i.e. [D]C
DaleCurtis
2013/09/11 01:16:03
Set during Init() and never changed. Checks remov
|
+ return false; |
+ |
+ size_t bytes_received = 0; |
+ uint32 renderer_buffer_index = 0; |
+ |
base::TimeTicks start = base::TimeTicks::Now(); |
- const base::TimeDelta kMaxWait = base::TimeDelta::FromMilliseconds(20); |
-#if defined(OS_WIN) |
- // Sleep(0) on Windows lets the other threads run. |
- const base::TimeDelta kSleep = base::TimeDelta::FromMilliseconds(0); |
-#else |
- // We want to sleep for a bit here, as otherwise a backgrounded renderer won't |
- // get enough cpu to send the data and the high priority thread in the browser |
- // will use up a core causing even more skips. |
- const base::TimeDelta kSleep = base::TimeDelta::FromMilliseconds(2); |
-#endif |
- base::TimeDelta time_since_start; |
do { |
- base::PlatformThread::Sleep(kSleep); |
- time_since_start = base::TimeTicks::Now() - start; |
- } while (!DataReady() && time_since_start < kMaxWait); |
+ bytes_received = socket_->Receive( |
tommi (sloooow) - chröme
2013/08/20 10:55:57
Since we're using sockets, we should be able to ch
DaleCurtis
2013/08/20 18:27:51
Not sure I follow which "multiple" items you want
tommi (sloooow) - chröme
2013/08/21 12:33:26
Sorry, for some reason I parsed this loop as cycli
|
+ &renderer_buffer_index, sizeof(renderer_buffer_index), |
+ maximum_wait_time_); |
DaveMoore
2013/08/19 22:49:43
Does it mean anything (skipping) if something othe
DaleCurtis
2013/08/19 23:08:22
It means we timed out on one or more previous call
|
+ } while (bytes_received > 0 && renderer_buffer_index != buffer_index_); |
+ |
+ base::TimeDelta time_since_start = base::TimeTicks::Now() - start; |
UMA_HISTOGRAM_CUSTOM_TIMES("Media.AudioOutputControllerDataNotReady", |
time_since_start, |
base::TimeDelta::FromMilliseconds(1), |
base::TimeDelta::FromMilliseconds(1000), |
50); |
+ |
+ // Receive() timed out or another unknown error occurred. |
henrika (OOO until Aug 14)
2013/08/20 07:50:30
Could you add some more details about what can cau
DaleCurtis
2013/09/11 01:16:03
Done.
|
+ if (!bytes_received) { |
+ DVLOG(2) << "AudioSyncReader::WaitTillDataReady() timed out."; |
+ return false; |
+ } |
+ |
+ DCHECK_EQ(bytes_received, sizeof(renderer_buffer_index)); |
+ DCHECK(DataReady()); |
+ return true; |
} |
} // namespace content |