Index: content/renderer/media/webrtc/processed_local_audio_source.cc |
diff --git a/content/renderer/media/webrtc/processed_local_audio_source.cc b/content/renderer/media/webrtc/processed_local_audio_source.cc |
index 75b7d4a4b6c97d9e0ff69b0321d1562b045a15e4..6bad2e442c916dde899f69d87aeb0084a54aed59 100644 |
--- a/content/renderer/media/webrtc/processed_local_audio_source.cc |
+++ b/content/renderer/media/webrtc/processed_local_audio_source.cc |
@@ -201,12 +201,23 @@ bool ProcessedLocalAudioSource::EnsureSourceIsStarted() { |
// Register this source with the WebRtcAudioDeviceImpl. |
rtc_audio_device->AddAudioCapturer(this); |
+ // Start detecting no callbacks. |
+ base::subtle::Release_Store(&input_callback_is_active_, false); |
+ last_callback_time_ = base::TimeTicks::Now(); |
+ check_alive_timer_.Start( |
+ FROM_HERE, base::TimeDelta::FromSeconds(5), |
+ this, &ProcessedLocalAudioSource::CheckIfInputStreamIsAlive); |
+ DCHECK(check_alive_timer_.IsRunning()); |
+ |
return true; |
} |
void ProcessedLocalAudioSource::EnsureSourceIsStopped() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
+ check_alive_timer_.Stop(); |
+ DCHECK(!check_alive_timer_.IsRunning()); |
+ |
scoped_refptr<media::AudioCapturerSource> source_to_stop; |
{ |
base::AutoLock auto_lock(source_lock_); |
@@ -267,6 +278,10 @@ void ProcessedLocalAudioSource::Capture(const media::AudioBus* audio_bus, |
int audio_delay_milliseconds, |
double volume, |
bool key_pressed) { |
+ base::subtle::Release_Store(&input_callback_is_active_, true); |
ossu-chromium
2017/05/18 13:38:54
Perhaps just store last_callback_time_ atomically?
Henrik Grunell
2017/05/19 06:00:00
Yeah, this is going away. The CL is not ready for
|
+ // TODO: Post task. |
+ last_callback_time_ = base::TimeTicks::Now(); |
+ |
#if defined(OS_WIN) || defined(OS_MACOSX) |
DCHECK_LE(volume, 1.0); |
#elif (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_OPENBSD) |
@@ -373,4 +388,17 @@ int ProcessedLocalAudioSource::GetBufferSize(int sample_rate) const { |
return (sample_rate / 100); |
} |
+void ProcessedLocalAudioSource::CheckIfInputStreamIsAlive() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+// bool active = base::subtle::Acquire_Load(&input_callback_is_active_); |
+ base::TimeDelta time_since_last_callback = |
+ base::TimeTicks::Now() - last_callback_time_; |
+ if (time_since_last_callback > base::TimeDelta::FromSeconds(5)) { |
+// if (!active) { |
+ LOG(ERROR) << "********** Detected missing callbacks. Stopping."; |
+ StopSourceOnError("Detected missing callbacks."); |
+ } |
+} |
+ |
} // namespace content |