| Index: media/filters/audio_clock.h
|
| diff --git a/media/filters/audio_clock.h b/media/filters/audio_clock.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a0d8212f94869cd8f929d39831b64e86fb1418bc
|
| --- /dev/null
|
| +++ b/media/filters/audio_clock.h
|
| @@ -0,0 +1,76 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// 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 <deque>
|
| +
|
| +#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.
|
| +class MEDIA_EXPORT AudioClock {
|
| + public:
|
| + explicit AudioClock(int sample_rate);
|
| + ~AudioClock();
|
| +
|
| + // |frames| amount of audio data scaled to |playback_rate| was written.
|
| + // |delay_frames| is the current amount of hardware delay.
|
| + // |timestamp| is the endpoint media timestamp of the audio data written.
|
| + void WroteAudio(int frames,
|
| + int delay_frames,
|
| + float playback_rate,
|
| + base::TimeDelta timestamp);
|
| +
|
| + // |frames| amount of silence was written.
|
| + // |delay_frames| is the current amount of hardware delay.
|
| + void WroteSilence(int frames, int delay_frames);
|
| +
|
| + // Calculates the current media timestamp taking silence and changes in
|
| + // playback rate into account.
|
| + base::TimeDelta CurrentMediaTimestamp() const;
|
| +
|
| + // Returns the last endpoint timestamp provided to WroteAudio().
|
| + base::TimeDelta last_endpoint_timestamp() const {
|
| + return last_endpoint_timestamp_;
|
| + }
|
| +
|
| + private:
|
| + void TrimBufferedAudioToMatchDelay(int delay_frames);
|
| + void PushBufferedAudio(int frames,
|
| + float playback_rate,
|
| + base::TimeDelta endpoint_timestamp);
|
| +
|
| + const int sample_rate_;
|
| +
|
| + // Initially set to kNoTimestamp(), otherwise is the last endpoint timestamp
|
| + // delivered to WroteAudio(). A copy is kept outside of |buffered_audio_| to
|
| + // handle the case where all of |buffered_audio_| has been replaced with
|
| + // silence.
|
| + base::TimeDelta last_endpoint_timestamp_;
|
| +
|
| + struct BufferedAudio {
|
| + BufferedAudio(int frames,
|
| + float playback_rate,
|
| + base::TimeDelta endpoint_timestamp);
|
| +
|
| + int frames;
|
| + float playback_rate;
|
| + base::TimeDelta endpoint_timestamp;
|
| + };
|
| +
|
| + std::deque<BufferedAudio> buffered_audio_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AudioClock);
|
| +};
|
| +
|
| +} // namespace media
|
| +
|
| +#endif // MEDIA_FILTERS_AUDIO_CLOCK_H_
|
|
|