15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Audio rendering unit utilizing an AudioRendererSink to output data.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class lives inside three threads during it's lifetime, namely:
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1. Render thread
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    Where the object is created.
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2. Media thread (provided via constructor)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//    All AudioDecoder methods are called on this thread.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3. Audio thread created by the AudioRendererSink.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    Render() is called here where audio data is decoded into raw PCM data.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AudioRendererImpl talks to an AudioRendererAlgorithm that takes care of
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// queueing audio data and stretching/shrinking audio data when playback rate !=
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1.0 or 0.0.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/gtest_prod_util.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_decoder.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_renderer.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/audio_renderer_sink.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/decryptor.h"
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/media_log.h"
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "media/base/time_source.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/audio_renderer_algorithm.h"
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/filters/decoder_stream.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass AudioBufferConverter;
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class AudioBus;
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class AudioClock;
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class AudioHardwareConfig;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AudioSplicer;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DecryptingDemuxerStream;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT AudioRendererImpl
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public AudioRenderer,
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      public TimeSource,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NON_EXPORTED_BASE(public AudioRendererSink::RenderCallback) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |task_runner| is the thread on which AudioRendererImpl will execute.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |sink| is used as the destination for the rendered audio.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |decoders| contains the AudioDecoders to use when initializing.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |set_decryptor_ready_cb| is fired when the audio decryptor is available
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (only applicable if the stream is encrypted and we have a decryptor).
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AudioRendererImpl(
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AudioRendererSink* sink,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScopedVector<AudioDecoder> decoders,
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const SetDecryptorReadyCB& set_decryptor_ready_cb,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const AudioHardwareConfig& hardware_params,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<MediaLog>& media_log);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AudioRendererImpl();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TimeSource implementation.
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void StartTicking() OVERRIDE;
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void StopTicking() OVERRIDE;
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetPlaybackRate(float rate) OVERRIDE;
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetMediaTime(base::TimeDelta time) OVERRIDE;
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual base::TimeDelta CurrentMediaTime() OVERRIDE;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual base::TimeDelta CurrentMediaTimeForSyncingVideo() OVERRIDE;
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AudioRenderer implementation.
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Initialize(DemuxerStream* stream,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const PipelineStatusCB& init_cb,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const StatisticsCB& statistics_cb,
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          const BufferingStateCB& buffering_state_cb,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const base::Closure& ended_cb,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const PipelineStatusCB& error_cb) OVERRIDE;
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual TimeSource* GetTimeSource() OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Flush(const base::Closure& callback) OVERRIDE;
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void StartPlaying() OVERRIDE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetVolume(float volume) OVERRIDE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AudioRendererImplTest;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Important detail: being in kPlaying doesn't imply that audio is being
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // rendered. Rather, it means that the renderer is ready to go. The actual
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // rendering of audio is controlled via Start/StopRendering().
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //   kUninitialized
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //         | Initialize()
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //         |
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //         V
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //    kInitializing
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //         | Decoders initialized
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //         |
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //         V            Decoders reset
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //      kFlushed <------------------ kFlushing
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  //         | StartPlaying()             ^
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  //         |                            |
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //         |                            | Flush()
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //         `---------> kPlaying --------'
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  enum State {
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    kUninitialized,
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    kInitializing,
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    kFlushing,
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    kFlushed,
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    kPlaying
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback from the audio decoder delivering decoded audio samples.
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void DecodedAudioReady(AudioBufferStream::Status status,
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         const scoped_refptr<AudioBuffer>& buffer);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Handles buffers that come out of |splicer_|.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if more buffers are needed.
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool HandleSplicerBuffer_Locked(const scoped_refptr<AudioBuffer>& buffer);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper functions for AudioDecoder::Status values passed to
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DecodedAudioReady().
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleAbortedReadOrDecodeError(bool is_decode_error);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void StartRendering_Locked();
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void StopRendering_Locked();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // AudioRendererSink::RenderCallback implementation.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: These are called on the audio callback thread!
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  //
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Render() fills the given buffer with audio data by delegating to its
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // |algorithm_|. Render() also takes care of updating the clock.
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Returns the number of frames copied into |audio_bus|, which may be less
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // than or equal to the initial number of frames in |audio_bus|
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  //
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // If this method returns fewer frames than the initial number of frames in
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // |audio_bus|, it could be a sign that the pipeline is stalled or unable to
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // stream the data fast enough.  In such scenarios, the callee should zero out
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // unused portions of their buffer to play back silence.
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  //
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Render() updates the pipeline's playback timestamp. If Render() is
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // not called at the same rate as audio samples are played, then the reported
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // timestamp in the pipeline will be ahead of the actual audio playback. In
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // this case |audio_delay_milliseconds| should be used to indicate when in the
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // future should the filled buffer be played.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Render(AudioBus* audio_bus,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int audio_delay_milliseconds) OVERRIDE;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnRenderError() OVERRIDE;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper methods that schedule an asynchronous read from the decoder as long
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // as there isn't a pending read.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Must be called on |task_runner_|.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttemptRead();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttemptRead_Locked();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanRead_Locked();
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void ChangeState_Locked(State new_state);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Returns true if the data in the buffer is all before |start_timestamp_|.
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This can only return true while in the kPlaying state.
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool IsBeforeStartTime(const scoped_refptr<AudioBuffer>& buffer);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Called upon AudioBufferStream initialization, or failure thereof (indicated
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // by the value of |success|).
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnAudioBufferStreamInitialized(bool succes);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Used to initiate the flush operation once all pending reads have
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // completed.
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void DoFlush_Locked();
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Calls |decoder_|.Reset() and arranges for ResetDecoderDone() to get
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // called when the reset completes.
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ResetDecoder();
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called when the |decoder_|.Reset() has completed.
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void ResetDecoderDone();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Called by the AudioBufferStream when a splice buffer is demuxed.
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void OnNewSpliceBuffer(base::TimeDelta);
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Called by the AudioBufferStream when a config change occurs.
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void OnConfigChange();
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Updates |buffering_state_| and fires |buffering_state_cb_|.
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetBufferingState_Locked(BufferingState buffering_state);
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AudioSplicer> splicer_;
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<AudioBufferConverter> buffer_converter_;
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Whether or not we expect to handle config changes.
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool expecting_config_changes_;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The sink (destination) for rendered audio. |sink_| must only be accessed
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // on |task_runner_|. |sink_| must never be called under |lock_| or else we
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // may deadlock between |task_runner_| and the audio callback thread.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<media::AudioRendererSink> sink_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<AudioBufferStream> audio_buffer_stream_;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Interface to the hardware audio params.
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const AudioHardwareConfig& hardware_config_;
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Cached copy of hardware params from |hardware_config_|.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AudioParameters audio_parameters_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callbacks provided during Initialize().
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB init_cb_;
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BufferingStateCB buffering_state_cb_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure ended_cb_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB error_cb_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Callback provided to Flush().
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Closure flush_cb_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After Initialize() has completed, all variables below must be accessed
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // under |lock_|. ------------------------------------------------------------
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Lock lock_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Algorithm for scaling audio.
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  float playback_rate_;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AudioRendererAlgorithm> algorithm_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simple state tracking variable.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BufferingState buffering_state_;
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Keep track of whether or not the sink is playing and whether we should be
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // rendering.
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool rendering_;
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool sink_playing_;
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track of our outstanding read to |decoder_|.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pending_read_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track of whether we received and rendered the end of stream buffer.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool received_end_of_stream_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool rendered_end_of_stream_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<AudioClock> audio_clock_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The media timestamp to begin playback at after seeking. Set via
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // SetMediaTime().
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::TimeDelta start_timestamp_;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The media timestamp to signal end of audio playback. Determined during
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Render() when writing the final frames of decoded audio data.
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeDelta ended_timestamp_;
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Set every Render() and used to provide an interpolated time value to
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // CurrentMediaTimeForSyncingVideo().
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeTicks last_render_ticks_;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // End variables which must be accessed under |lock_|. ----------------------
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // NOTE: Weak pointers must be invalidated before all other member variables.
26723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::WeakPtrFactory<AudioRendererImpl> weak_factory_;
26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_
275