| Index: media/filters/audio_clock.h
|
| diff --git a/media/filters/audio_clock.h b/media/filters/audio_clock.h
|
| index 625da7d183ee0abc032f116e1dc964b3521587e1..5aacd16ccad9ae9277aa3bfe050ad3eb8b947445 100644
|
| --- a/media/filters/audio_clock.h
|
| +++ b/media/filters/audio_clock.h
|
| @@ -18,20 +18,16 @@ namespace media {
|
| // a playback pipeline with large delay.
|
| class MEDIA_EXPORT AudioClock {
|
| public:
|
| - explicit AudioClock(int sample_rate);
|
| + AudioClock(base::TimeDelta start_timestamp, int sample_rate);
|
| ~AudioClock();
|
|
|
| - // |frames| amount of audio data scaled to |playback_rate| was written.
|
| + // |frames_written| amount of audio data scaled to |playback_rate| written.
|
| + // |frames_requested| amount of audio data requested by hardware.
|
| // |delay_frames| is the current amount of hardware delay.
|
| - // |timestamp| is the endpoint media timestamp of the audio data written.
|
| - void WroteAudio(int frames,
|
| + void WroteAudio(int frames_written,
|
| + int frames_requested,
|
| 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);
|
| + float playback_rate);
|
|
|
| // Calculates the current media timestamp taking silence and changes in
|
| // playback rate into account.
|
| @@ -41,36 +37,42 @@ class MEDIA_EXPORT AudioClock {
|
| base::TimeDelta CurrentMediaTimestamp(
|
| base::TimeDelta time_since_writing) const;
|
|
|
| - // Returns the last endpoint timestamp provided to WroteAudio().
|
| - base::TimeDelta last_endpoint_timestamp() const {
|
| - return last_endpoint_timestamp_;
|
| - }
|
| + // Returns the amount of contiguous media time buffered at the head of the
|
| + // audio hardware buffer. Silence introduced into the audio hardware buffer is
|
| + // treated as a break in media time.
|
| + base::TimeDelta ContiguousAudioDataBuffered() const;
|
|
|
| - private:
|
| - void TrimBufferedAudioToMatchDelay(int delay_frames);
|
| - void PushBufferedAudio(int frames,
|
| - float playback_rate,
|
| - base::TimeDelta endpoint_timestamp);
|
| -
|
| - const int sample_rate_;
|
| + // Same as above, but also treats changes in playback rate as a break in media
|
| + // time.
|
| + base::TimeDelta ContiguousAudioDataBufferedAtSameRate() const;
|
|
|
| - // 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_;
|
| + // Returns true if there is any audio data buffered by the audio hardware,
|
| + // even if there is silence mixed in.
|
| + bool AudioDataBuffered() const;
|
|
|
| - struct BufferedAudio {
|
| - BufferedAudio(int frames,
|
| - float playback_rate,
|
| - base::TimeDelta endpoint_timestamp);
|
| + private:
|
| + // Even with a ridiculously high sample rate of 256kHz, using 64 bits will
|
| + // permit tracking up to 416999965 days worth of time (that's 1141 millenia).
|
| + //
|
| + // 32 bits on the other hand would top out at measly 2 hours and 20 minutes.
|
| + struct AudioData {
|
| + AudioData(int64_t frames, float playback_rate);
|
|
|
| - int frames;
|
| + int64_t frames;
|
| float playback_rate;
|
| - base::TimeDelta endpoint_timestamp;
|
| };
|
|
|
| - std::deque<BufferedAudio> buffered_audio_;
|
| + // Helpers for operating on a std::deque<AudioData>.
|
| + static void PushAudioData(std::deque<AudioData>* audio_data,
|
| + int64_t frames,
|
| + float playback_rate);
|
| + static int64_t TotalFrames(const std::deque<AudioData>& audio_data);
|
| +
|
| + const base::TimeDelta start_timestamp_;
|
| + const int sample_rate_;
|
| +
|
| + std::deque<AudioData> buffered_;
|
| + std::deque<AudioData> played_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(AudioClock);
|
| };
|
|
|