Index: services/media/audio/audio_track_impl.cc |
diff --git a/services/media/audio/audio_track_impl.cc b/services/media/audio/audio_track_impl.cc |
index 7b9a8e0929e6056b5babbe9c393d803c866465a2..87f3418ce93fe807d305a8e51a87f680acda9d2f 100644 |
--- a/services/media/audio/audio_track_impl.cc |
+++ b/services/media/audio/audio_track_impl.cc |
@@ -7,6 +7,7 @@ |
#include "base/logging.h" |
#include "mojo/services/media/common/cpp/linear_transform.h" |
+#include "mojo/services/media/common/cpp/timeline.h" |
#include "services/media/audio/audio_output_manager.h" |
#include "services/media/audio/audio_server_impl.h" |
#include "services/media/audio/audio_track_impl.h" |
@@ -72,7 +73,7 @@ void AudioTrackImpl::Shutdown() { |
// for the service to destroy us. Run some DCHECK sanity checks and get out. |
if (!binding_.is_bound()) { |
DCHECK(!pipe_.IsInitialized()); |
- DCHECK(!rate_control_.is_bound()); |
+ DCHECK(!timeline_control_site_.is_bound()); |
DCHECK(!outputs_.size()); |
return; |
} |
@@ -84,7 +85,7 @@ void AudioTrackImpl::Shutdown() { |
// reset all of our internal state and close any other client connections in |
// the process. |
pipe_.Reset(); |
- rate_control_.Reset(); |
+ timeline_control_site_.Reset(); |
outputs_.clear(); |
DCHECK(owner_); |
@@ -193,6 +194,8 @@ void AudioTrackImpl::Configure(AudioTrackConfigurationPtr configuration, |
return; |
} |
+ frames_per_ns_ = |
+ TimelineRate(cfg->frames_per_second, Timeline::ns_from_seconds(1)); |
// Figure out the rate we need to scale by in order to produce our fixed |
// point timestamps. |
@@ -262,10 +265,9 @@ void AudioTrackImpl::Configure(AudioTrackConfigurationPtr configuration, |
owner_->GetOutputManager().SelectOutputsForTrack(strong_this); |
} |
-void AudioTrackImpl::GetRateControl(InterfaceRequest<RateControl> req) { |
- if (!rate_control_.Bind(req.Pass())) { |
- Shutdown(); |
- } |
+void AudioTrackImpl::GetTimelineControlSite( |
+ InterfaceRequest<MediaTimelineControlSite> req) { |
+ timeline_control_site_.Bind(req.Pass()); |
} |
void AudioTrackImpl::SetGain(float db_gain) { |
@@ -306,6 +308,23 @@ void AudioTrackImpl::RemoveOutput(AudioTrackToOutputLinkPtr link) { |
} |
} |
+void AudioTrackImpl::SnapshotRateTrans(LinearTransform* out, |
+ uint32_t* generation) { |
+ TimelineFunction timeline_function; |
+ timeline_control_site_.SnapshotCurrentFunction( |
+ Timeline::local_now(), &timeline_function, generation); |
+ |
+ // The control site works in ns units. We want the rate in frames per |
+ // nanosecond, so we convert here. |
+ TimelineRate rate_in_frames_per_ns = |
+ timeline_function.rate() * frames_per_ns_; |
+ |
+ *out = LinearTransform(timeline_function.reference_time(), |
+ rate_in_frames_per_ns.subject_delta(), |
+ rate_in_frames_per_ns.reference_delta(), |
+ timeline_function.subject_time() * frames_per_ns_); |
+} |
+ |
void AudioTrackImpl::OnPacketReceived(AudioPipe::AudioPacketRefPtr packet) { |
DCHECK(packet); |
for (const auto& output : outputs_) { |