[go: nahoru, domu]

blob: 821c3c1681b425b33d357685d45f90c4747bfa4a [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_WEBRTC_OVERRIDES_METRONOME_SOURCE_H_
#define THIRD_PARTY_BLINK_WEBRTC_OVERRIDES_METRONOME_SOURCE_H_
#include <atomic>
#include <set>
#include <vector>
#include "base/functional/callback.h"
#include "base/functional/callback_forward.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/synchronization/lock.h"
#include "base/synchronization/waitable_event.h"
#include "base/task/delayed_task_handle.h"
#include "base/task/sequenced_task_runner.h"
#include "base/thread_annotations.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "third_party/webrtc/api/metronome/metronome.h"
#include "third_party/webrtc/rtc_base/system/rtc_export.h"
namespace blink {
// The MetronomeSource ticks at a constant frequency, scheduling to wake up on
// ticks where listeners have work to do, and not scheduling to wake up on ticks
// where there is no work to do.
//
// When coalescing a large number of wakeup sources onto the MetronomeSource,
// this should reduce package Idle Wake Ups with potential to improve
// performance.
//
// The public API of the class except construction is meant to run on
// `metronome_task_runner`.
//
// `webrtc_component` does not have a test binary. See
// /third_party/blink/renderer/platform/peerconnection/metronome_source_test.cc
// for testing.
class RTC_EXPORT MetronomeSource final {
public:
// Class abstracting requesting a callback on the next tick.
class TickProvider {
public:
virtual ~TickProvider() = default;
// Requests a callback on the next tick. The callback must be run on the
// same sequence that called this method.
virtual void RequestCallOnNextTick(base::OnceClosure callback) = 0;
// Estimate the current tick period. A soft lower bound value is okay here.
virtual base::TimeDelta TickPeriod() = 0;
};
explicit MetronomeSource(std::unique_ptr<TickProvider> tick_provider);
~MetronomeSource();
MetronomeSource(const MetronomeSource&) = delete;
MetronomeSource& operator=(const MetronomeSource&) = delete;
// Creates a webrtc::Metronome which is backed by this metronome.
std::unique_ptr<webrtc::Metronome> CreateWebRtcMetronome();
private:
friend class WebRtcMetronomeAdapter;
// Called by metronome when a callback is available for execution on the next
// tick.
void RequestCallOnNextTick(absl::AnyInvocable<void() &&> callback);
// Called when a tick happens.
void OnMetronomeTick();
// Reschedules an invocation of OnMetronomeTick.
void Reschedule();
// Returns the tick provider's tick period.
base::TimeDelta TickPeriod();
SEQUENCE_CHECKER(metronome_sequence_checker_);
std::vector<absl::AnyInvocable<void() &&>> callbacks_
GUARDED_BY_CONTEXT(metronome_sequence_checker_);
std::unique_ptr<TickProvider> tick_provider_
GUARDED_BY_CONTEXT(metronome_sequence_checker_);
base::WeakPtrFactory<MetronomeSource> weak_factory_{this};
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_WEBRTC_OVERRIDES_METRONOME_SOURCE_H_