Index: media/filters/audio_renderer_base.h |
diff --git a/media/filters/audio_renderer_base.h b/media/filters/audio_renderer_base.h |
deleted file mode 100644 |
index 776bee02aaf0a6fe54c197a08e4728b5ff0a00bf..0000000000000000000000000000000000000000 |
--- a/media/filters/audio_renderer_base.h |
+++ /dev/null |
@@ -1,211 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-// Audio rendering unit utilizing an AudioRendererSink to output data. |
-// |
-// This class lives inside three threads during it's lifetime, namely: |
-// 1. Render thread. |
-// This object is created on the render thread. |
-// 2. Pipeline thread |
-// Initialize() is called here with the audio format. |
-// Play/Pause/Seek also happens here. |
-// 3. Audio thread created by the AudioRendererSink. |
-// Render() is called here where audio data is decoded into raw PCM data. |
-// |
-// AudioRendererBase talks to an AudioRendererAlgorithmBase that takes care of |
-// queueing audio data and stretching/shrinking audio data when playback rate != |
-// 1.0 or 0.0. |
- |
-#ifndef MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_ |
-#define MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_ |
- |
-#include <deque> |
- |
-#include "base/synchronization/lock.h" |
-#include "media/base/audio_decoder.h" |
-#include "media/base/audio_renderer_sink.h" |
-#include "media/base/buffers.h" |
-#include "media/base/filters.h" |
-#include "media/filters/audio_renderer_algorithm_base.h" |
- |
-namespace media { |
- |
-class MEDIA_EXPORT AudioRendererBase |
- : public AudioRenderer, |
- NON_EXPORTED_BASE(public media::AudioRendererSink::RenderCallback) { |
- public: |
- // Methods called on Render thread ------------------------------------------ |
- // An AudioRendererSink is used as the destination for the rendered audio. |
- explicit AudioRendererBase(media::AudioRendererSink* sink); |
- virtual ~AudioRendererBase(); |
- |
- // Methods called on pipeline thread ---------------------------------------- |
- // Filter implementation. |
- virtual void Play(const base::Closure& callback) OVERRIDE; |
- virtual void Pause(const base::Closure& callback) OVERRIDE; |
- virtual void Flush(const base::Closure& callback) OVERRIDE; |
- virtual void Stop(const base::Closure& callback) OVERRIDE; |
- virtual void SetPlaybackRate(float rate) OVERRIDE; |
- virtual void Seek(base::TimeDelta time, const PipelineStatusCB& cb) OVERRIDE; |
- |
- // AudioRenderer implementation. |
- virtual void Initialize(const scoped_refptr<AudioDecoder>& decoder, |
- const PipelineStatusCB& init_cb, |
- const base::Closure& underflow_cb, |
- const TimeCB& time_cb) OVERRIDE; |
- virtual bool HasEnded() OVERRIDE; |
- virtual void ResumeAfterUnderflow(bool buffer_more_audio) OVERRIDE; |
- virtual void SetVolume(float volume) OVERRIDE; |
- |
- private: |
- friend class AudioRendererBaseTest; |
- FRIEND_TEST_ALL_PREFIXES(AudioRendererBaseTest, EndOfStream); |
- FRIEND_TEST_ALL_PREFIXES(AudioRendererBaseTest, Underflow_EndOfStream); |
- |
- // Callback from the audio decoder delivering decoded audio samples. |
- void DecodedAudioReady(scoped_refptr<Buffer> buffer); |
- |
- // Fills the given buffer with audio data by delegating to its |algorithm_|. |
- // FillBuffer() also takes care of updating the clock. Returns the number of |
- // frames copied into |dest|, which may be less than or equal to |
- // |requested_frames|. |
- // |
- // If this method returns fewer frames than |requested_frames|, it could |
- // be a sign that the pipeline is stalled or unable to stream the data fast |
- // enough. In such scenarios, the callee should zero out unused portions |
- // of their buffer to playback silence. |
- // |
- // FillBuffer() updates the pipeline's playback timestamp. If FillBuffer() is |
- // not called at the same rate as audio samples are played, then the reported |
- // timestamp in the pipeline will be ahead of the actual audio playback. In |
- // this case |playback_delay| should be used to indicate when in the future |
- // should the filled buffer be played. If FillBuffer() is called as the audio |
- // hardware plays the buffer, then |playback_delay| should be zero. |
- // |
- // FillBuffer() calls SignalEndOfStream() when it reaches end of stream. |
- // |
- // Safe to call on any thread. |
- uint32 FillBuffer(uint8* dest, |
- uint32 requested_frames, |
- const base::TimeDelta& playback_delay); |
- |
- // Called at the end of stream when all the hardware buffers become empty |
- // (i.e. when all the data written to the device has been played). |
- void SignalEndOfStream(); |
- |
- // Get the playback rate of |algorithm_|. |
- float GetPlaybackRate(); |
- |
- // Convert number of bytes to duration of time using information about the |
- // number of channels, sample rate and sample bits. |
- base::TimeDelta ConvertToDuration(int bytes); |
- |
- // Estimate earliest time when current buffer can stop playing. |
- void UpdateEarliestEndTime(int bytes_filled, |
- base::TimeDelta request_delay, |
- base::Time time_now); |
- |
- // Methods called on pipeline thread ---------------------------------------- |
- void DoPlay(); |
- void DoPause(); |
- void DoSeek(); |
- |
- // media::AudioRendererSink::RenderCallback implementation. |
- virtual int Render(const std::vector<float*>& audio_data, |
- int number_of_frames, |
- int audio_delay_milliseconds) OVERRIDE; |
- virtual void OnRenderError() OVERRIDE; |
- |
- // Helper method that schedules an asynchronous read from the decoder and |
- // increments |pending_reads_|. |
- // |
- // Safe to call from any thread. |
- void ScheduleRead_Locked(); |
- |
- // Returns true if the data in the buffer is all before |
- // |seek_timestamp_|. This can only return true while |
- // in the kSeeking state. |
- bool IsBeforeSeekTime(const scoped_refptr<Buffer>& buffer); |
- |
- // Audio decoder. |
- scoped_refptr<AudioDecoder> decoder_; |
- |
- // Algorithm for scaling audio. |
- scoped_ptr<AudioRendererAlgorithmBase> algorithm_; |
- |
- base::Lock lock_; |
- |
- // Simple state tracking variable. |
- enum State { |
- kUninitialized, |
- kPaused, |
- kSeeking, |
- kPlaying, |
- kStopped, |
- kUnderflow, |
- kRebuffering, |
- }; |
- State state_; |
- |
- // Keep track of our outstanding read to |decoder_|. |
- bool pending_read_; |
- |
- // Keeps track of whether we received and rendered the end of stream buffer. |
- bool received_end_of_stream_; |
- bool rendered_end_of_stream_; |
- |
- // The timestamp of the last frame (i.e. furthest in the future) buffered. |
- // TODO(ralphl): Update this value after seeking. |
- base::TimeDelta audio_time_buffered_; |
- |
- // Filter callbacks. |
- base::Closure pause_cb_; |
- PipelineStatusCB seek_cb_; |
- |
- base::Closure underflow_cb_; |
- |
- TimeCB time_cb_; |
- |
- base::TimeDelta seek_timestamp_; |
- |
- uint32 bytes_per_frame_; |
- |
- // Used to calculate audio delay given bytes. |
- uint32 bytes_per_second_; |
- |
- // A flag that indicates this filter is called to stop. |
- bool stopped_; |
- |
- // The sink (destination) for rendered audio. |
- scoped_refptr<media::AudioRendererSink> sink_; |
- |
- // Set to true when OnInitialize() is called. |
- bool is_initialized_; |
- |
- // We're supposed to know amount of audio data OS or hardware buffered, but |
- // that is not always so -- on my Linux box |
- // AudioBuffersState::hardware_delay_bytes never reaches 0. |
- // |
- // As a result we cannot use it to find when stream ends. If we just ignore |
- // buffered data we will notify host that stream ended before it is actually |
- // did so, I've seen it done ~140ms too early when playing ~150ms file. |
- // |
- // Instead of trying to invent OS-specific solution for each and every OS we |
- // are supporting, use simple workaround: every time we fill the buffer we |
- // remember when it should stop playing, and do not assume that buffer is |
- // empty till that time. Workaround is not bulletproof, as we don't exactly |
- // know when that particular data would start playing, but it is much better |
- // than nothing. |
- base::Time earliest_end_time_; |
- |
- AudioParameters audio_parameters_; |
- |
- AudioDecoder::ReadCB read_cb_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AudioRendererBase); |
-}; |
- |
-} // namespace media |
- |
-#endif // MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_ |