Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
index 5f5473e063b6fb024c50bfca4320a751adce8db6..b9553cbe0bef34ae19dfb167bd3c845198b74f99 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -37,6 +37,8 @@ const double kShortIdlePeriodDurationPercentile = 50; |
// Amount of idle time left in a frame (as a ratio of the vsync interval) above |
// which main thread compositing can be considered fast. |
const double kFastCompositingIdleTimeThreshold = .2; |
+// We do not throttle anything while audio is played and shortly after that. |
+const int kThrottlingDelayAfterAudioIsPlayedInSeconds = 5; |
void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { |
int load_percentage = static_cast<int>(load * 100); |
@@ -157,6 +159,18 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
foreground_main_thread_load_tracker( |
now, |
base::Bind(&ReportForegroundRendererTaskLoad)), |
+ audio_playback_switch( |
+ renderer_scheduler_impl->ControlTaskRunner().get(), |
+ base::TimeDelta::FromSeconds( |
+ kThrottlingDelayAfterAudioIsPlayedInSeconds), |
+ base::Bind(&RendererSchedulerImpl::OnAudioStartedImpl, |
+ // We can't get weak pointer to renderer_scheduler here |
+ // but this callback is guaranteed to be called while |
+ // |audio_playback_switch| is alive, which guarantees that |
+ // renderer_scheduler is still alive. |
+ base::Unretained(renderer_scheduler_impl)), |
Sami
2016/09/29 13:36:07
Could we instead change things so that we can get
altimin
2016/09/29 16:29:43
Note: per Chromium style guide weak pointer factor
|
+ base::Bind(&RendererSchedulerImpl::OnAudioStoppedImpl, |
+ base::Unretained(renderer_scheduler_impl))), |
current_use_case(UseCase::NONE), |
timer_queue_suspend_count(0), |
navigation_task_expected_count(0), |
@@ -476,6 +490,14 @@ void RendererSchedulerImpl::OnRendererForegrounded() { |
ResumeTimerQueueWhenForegrounded(); |
} |
+void RendererSchedulerImpl::OnAudioStarted() { |
+ MainThreadOnly().audio_playback_switch.Enable(); |
Sami
2016/09/29 13:36:07
These could use trace events I think.
|
+} |
+ |
+void RendererSchedulerImpl::OnAudioStopped() { |
+ MainThreadOnly().audio_playback_switch.Disable(); |
+} |
+ |
void RendererSchedulerImpl::SuspendRenderer() { |
helper_.CheckOnValidThread(); |
DCHECK(MainThreadOnly().renderer_backgrounded); |
@@ -1195,6 +1217,14 @@ void RendererSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const { |
this, AsValueLocked(helper_.scheduler_tqm_delegate()->NowTicks())); |
} |
+void RendererSchedulerImpl::OnAudioStartedImpl() { |
alex clarke (OOO till 29th)
2016/09/29 11:16:53
I don't think we need these two functions, why not
altimin
2016/09/29 16:29:43
Done.
|
+ task_queue_throttler()->SetIsAudioActive(true); |
+} |
+ |
+void RendererSchedulerImpl::OnAudioStoppedImpl() { |
+ task_queue_throttler()->SetIsAudioActive(false); |
+} |
+ |
// static |
const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString( |
ExpensiveTaskPolicy expensive_task_policy) { |