Index: media/filters/audio_renderer_impl.h |
diff --git a/media/filters/audio_renderer_impl.h b/media/filters/audio_renderer_impl.h |
deleted file mode 100644 |
index baf1d80e9e03ce4542c56124a5a71c97be24426f..0000000000000000000000000000000000000000 |
--- a/media/filters/audio_renderer_impl.h |
+++ /dev/null |
@@ -1,274 +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 |
-// Where the object is created. |
-// 2. Media thread (provided via constructor) |
-// All AudioDecoder methods are called on this thread. |
-// 3. Audio thread created by the AudioRendererSink. |
-// Render() is called here where audio data is decoded into raw PCM data. |
-// |
-// AudioRendererImpl talks to an AudioRendererAlgorithm 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_IMPL_H_ |
-#define MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ |
- |
-#include <deque> |
- |
-#include "base/gtest_prod_util.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/synchronization/lock.h" |
-#include "media/base/audio_decoder.h" |
-#include "media/base/audio_renderer.h" |
-#include "media/base/audio_renderer_sink.h" |
-#include "media/base/decryptor.h" |
-#include "media/base/media_log.h" |
-#include "media/base/time_source.h" |
-#include "media/filters/audio_renderer_algorithm.h" |
-#include "media/filters/decoder_stream.h" |
- |
-namespace base { |
-class SingleThreadTaskRunner; |
-} |
- |
-namespace media { |
- |
-class AudioBufferConverter; |
-class AudioBus; |
-class AudioClock; |
-class AudioHardwareConfig; |
-class AudioSplicer; |
-class DecryptingDemuxerStream; |
- |
-class MEDIA_EXPORT AudioRendererImpl |
- : public AudioRenderer, |
- public TimeSource, |
- NON_EXPORTED_BASE(public AudioRendererSink::RenderCallback) { |
- public: |
- // |task_runner| is the thread on which AudioRendererImpl will execute. |
- // |
- // |sink| is used as the destination for the rendered audio. |
- // |
- // |decoders| contains the AudioDecoders to use when initializing. |
- AudioRendererImpl( |
- const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
- AudioRendererSink* sink, |
- ScopedVector<AudioDecoder> decoders, |
- const AudioHardwareConfig& hardware_config, |
- const scoped_refptr<MediaLog>& media_log); |
- ~AudioRendererImpl() override; |
- |
- // TimeSource implementation. |
- void StartTicking() override; |
- void StopTicking() override; |
- void SetPlaybackRate(float rate) override; |
- void SetMediaTime(base::TimeDelta time) override; |
- base::TimeDelta CurrentMediaTime() override; |
- base::TimeDelta CurrentMediaTimeForSyncingVideo() override; |
- |
- // AudioRenderer implementation. |
- void Initialize(DemuxerStream* stream, |
- const PipelineStatusCB& init_cb, |
- const SetDecryptorReadyCB& set_decryptor_ready_cb, |
- const StatisticsCB& statistics_cb, |
- const BufferingStateCB& buffering_state_cb, |
- const base::Closure& ended_cb, |
- const PipelineStatusCB& error_cb) override; |
- TimeSource* GetTimeSource() override; |
- void Flush(const base::Closure& callback) override; |
- void StartPlaying() override; |
- void SetVolume(float volume) override; |
- |
- private: |
- friend class AudioRendererImplTest; |
- |
- // Important detail: being in kPlaying doesn't imply that audio is being |
- // rendered. Rather, it means that the renderer is ready to go. The actual |
- // rendering of audio is controlled via Start/StopRendering(). |
- // |
- // kUninitialized |
- // | Initialize() |
- // | |
- // V |
- // kInitializing |
- // | Decoders initialized |
- // | |
- // V Decoders reset |
- // kFlushed <------------------ kFlushing |
- // | StartPlaying() ^ |
- // | | |
- // | | Flush() |
- // `---------> kPlaying --------' |
- enum State { |
- kUninitialized, |
- kInitializing, |
- kFlushing, |
- kFlushed, |
- kPlaying |
- }; |
- |
- // Callback from the audio decoder delivering decoded audio samples. |
- void DecodedAudioReady(AudioBufferStream::Status status, |
- const scoped_refptr<AudioBuffer>& buffer); |
- |
- // Handles buffers that come out of |splicer_|. |
- // Returns true if more buffers are needed. |
- bool HandleSplicerBuffer_Locked(const scoped_refptr<AudioBuffer>& buffer); |
- |
- // Helper functions for AudioDecoder::Status values passed to |
- // DecodedAudioReady(). |
- void HandleAbortedReadOrDecodeError(bool is_decode_error); |
- |
- void StartRendering_Locked(); |
- void StopRendering_Locked(); |
- |
- // AudioRendererSink::RenderCallback implementation. |
- // |
- // NOTE: These are called on the audio callback thread! |
- // |
- // Render() fills the given buffer with audio data by delegating to its |
- // |algorithm_|. Render() also takes care of updating the clock. |
- // Returns the number of frames copied into |audio_bus|, which may be less |
- // than or equal to the initial number of frames in |audio_bus| |
- // |
- // If this method returns fewer frames than the initial number of frames in |
- // |audio_bus|, 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 play back silence. |
- // |
- // Render() updates the pipeline's playback timestamp. If Render() 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 |audio_delay_milliseconds| should be used to indicate when in the |
- // future should the filled buffer be played. |
- int Render(AudioBus* audio_bus, int audio_delay_milliseconds) override; |
- void OnRenderError() override; |
- |
- // Helper methods that schedule an asynchronous read from the decoder as long |
- // as there isn't a pending read. |
- // |
- // Must be called on |task_runner_|. |
- void AttemptRead(); |
- void AttemptRead_Locked(); |
- bool CanRead_Locked(); |
- void ChangeState_Locked(State new_state); |
- |
- // Returns true if the data in the buffer is all before |start_timestamp_|. |
- // This can only return true while in the kPlaying state. |
- bool IsBeforeStartTime(const scoped_refptr<AudioBuffer>& buffer); |
- |
- // Called upon AudioBufferStream initialization, or failure thereof (indicated |
- // by the value of |success|). |
- void OnAudioBufferStreamInitialized(bool succes); |
- |
- // Used to initiate the flush operation once all pending reads have |
- // completed. |
- void DoFlush_Locked(); |
- |
- // Calls |decoder_|.Reset() and arranges for ResetDecoderDone() to get |
- // called when the reset completes. |
- void ResetDecoder(); |
- |
- // Called when the |decoder_|.Reset() has completed. |
- void ResetDecoderDone(); |
- |
- // Called by the AudioBufferStream when a splice buffer is demuxed. |
- void OnNewSpliceBuffer(base::TimeDelta); |
- |
- // Called by the AudioBufferStream when a config change occurs. |
- void OnConfigChange(); |
- |
- // Updates |buffering_state_| and fires |buffering_state_cb_|. |
- void SetBufferingState_Locked(BufferingState buffering_state); |
- |
- scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
- |
- scoped_ptr<AudioSplicer> splicer_; |
- scoped_ptr<AudioBufferConverter> buffer_converter_; |
- |
- // Whether or not we expect to handle config changes. |
- bool expecting_config_changes_; |
- |
- // The sink (destination) for rendered audio. |sink_| must only be accessed |
- // on |task_runner_|. |sink_| must never be called under |lock_| or else we |
- // may deadlock between |task_runner_| and the audio callback thread. |
- scoped_refptr<media::AudioRendererSink> sink_; |
- |
- scoped_ptr<AudioBufferStream> audio_buffer_stream_; |
- |
- // Interface to the hardware audio params. |
- const AudioHardwareConfig& hardware_config_; |
- |
- // Cached copy of hardware params from |hardware_config_|. |
- AudioParameters audio_parameters_; |
- |
- // Callbacks provided during Initialize(). |
- PipelineStatusCB init_cb_; |
- BufferingStateCB buffering_state_cb_; |
- base::Closure ended_cb_; |
- PipelineStatusCB error_cb_; |
- |
- // Callback provided to Flush(). |
- base::Closure flush_cb_; |
- |
- // After Initialize() has completed, all variables below must be accessed |
- // under |lock_|. ------------------------------------------------------------ |
- base::Lock lock_; |
- |
- // Algorithm for scaling audio. |
- float playback_rate_; |
- scoped_ptr<AudioRendererAlgorithm> algorithm_; |
- |
- // Simple state tracking variable. |
- State state_; |
- |
- BufferingState buffering_state_; |
- |
- // Keep track of whether or not the sink is playing and whether we should be |
- // rendering. |
- bool rendering_; |
- bool sink_playing_; |
- |
- // 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_; |
- |
- scoped_ptr<AudioClock> audio_clock_; |
- |
- // The media timestamp to begin playback at after seeking. Set via |
- // SetMediaTime(). |
- base::TimeDelta start_timestamp_; |
- |
- // The media timestamp to signal end of audio playback. Determined during |
- // Render() when writing the final frames of decoded audio data. |
- base::TimeDelta ended_timestamp_; |
- |
- // Set every Render() and used to provide an interpolated time value to |
- // CurrentMediaTimeForSyncingVideo(). |
- base::TimeTicks last_render_ticks_; |
- |
- // Set upon receipt of the first decoded buffer after a StartPlayingFrom(). |
- // Used to determine how long to delay playback. |
- base::TimeDelta first_packet_timestamp_; |
- |
- // End variables which must be accessed under |lock_|. ---------------------- |
- |
- // NOTE: Weak pointers must be invalidated before all other member variables. |
- base::WeakPtrFactory<AudioRendererImpl> weak_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); |
-}; |
- |
-} // namespace media |
- |
-#endif // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ |