// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_FILTERS_AUDIO_CLOCK_H_ #define MEDIA_FILTERS_AUDIO_CLOCK_H_ #include <stdint.h> #include <cmath> #include "base/containers/circular_deque.h" #include "base/time/time.h" #include "media/base/media_export.h" namespace media { // Models a queue of buffered audio in a playback pipeline for use with // estimating the amount of delay in wall clock time. Takes changes in playback // rate into account to handle scenarios where multiple rates may be present in // a playback pipeline with large delay. // // // USAGE // // Prior to starting audio playback, construct an AudioClock with an initial // media timestamp and a sample rate matching the sample rate the audio device // was opened at. // // Each time the audio rendering callback is executed, call WroteAudio() once // (and only once!) containing information on what was written: // 1) How many frames of audio data requested // 2) How many frames of audio data provided // 3) The playback rate of the audio data provided // 4) The current amount of delay // // After a call to WroteAudio(), clients can inspect the resulting media // timestamp. This can be used for UI purposes, synchronizing video, etc... // // // DETAILS // // Silence (whether caused by the initial audio delay or failing to write the // amount of requested frames due to underflow) is also modeled and will cause // the media timestamp to stop increasing until all known silence has been // played. AudioClock's model is initialized with silence during the first call // to WroteAudio() using the delay value. // // Playback rates are tracked for translating frame durations into media // durations. Since silence doesn't affect media timestamps, it also isn't // affected by playback rates. class MEDIA_EXPORT AudioClock { … }; } // namespace media #endif // MEDIA_FILTERS_AUDIO_CLOCK_H_