| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Audio rendering unit utilizing an AudioRendererSink to output data. | 5 // Audio rendering unit utilizing an AudioRendererSink to output data. |
| 6 // | 6 // |
| 7 // This class lives inside three threads during it's lifetime, namely: | 7 // This class lives inside three threads during it's lifetime, namely: |
| 8 // 1. Render thread | 8 // 1. Render thread |
| 9 // Where the object is created. | 9 // Where the object is created. |
| 10 // 2. Media thread (provided via constructor) | 10 // 2. Media thread (provided via constructor) |
| 11 // All AudioDecoder methods are called on this thread. | 11 // All AudioDecoder methods are called on this thread. |
| 12 // 3. Audio thread created by the AudioRendererSink. | 12 // 3. Audio thread created by the AudioRendererSink. |
| 13 // Render() is called here where audio data is decoded into raw PCM data. | 13 // Render() is called here where audio data is decoded into raw PCM data. |
| 14 // | 14 // |
| 15 // AudioRendererImpl talks to an AudioRendererAlgorithm that takes care of | 15 // AudioRendererImpl talks to an AudioRendererAlgorithm that takes care of |
| 16 // queueing audio data and stretching/shrinking audio data when playback rate != | 16 // queueing audio data and stretching/shrinking audio data when playback rate != |
| 17 // 1.0 or 0.0. | 17 // 1.0 or 0.0. |
| 18 | 18 |
| 19 #ifndef MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ | 19 #ifndef MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ |
| 20 #define MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ | 20 #define MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ |
| 21 | 21 |
| 22 #include <deque> | 22 #include <deque> |
| 23 | 23 |
| 24 #include "base/gtest_prod_util.h" | 24 #include "base/gtest_prod_util.h" |
| 25 #include "base/memory/weak_ptr.h" | |
| 26 #include "base/synchronization/lock.h" | 25 #include "base/synchronization/lock.h" |
| 27 #include "media/base/audio_decoder.h" | 26 #include "media/base/audio_decoder.h" |
| 28 #include "media/base/audio_renderer.h" | 27 #include "media/base/audio_renderer.h" |
| 29 #include "media/base/audio_renderer_sink.h" | 28 #include "media/base/audio_renderer_sink.h" |
| 30 #include "media/base/decryptor.h" | 29 #include "media/base/decryptor.h" |
| 31 #include "media/filters/audio_renderer_algorithm.h" | 30 #include "media/filters/audio_renderer_algorithm.h" |
| 32 | 31 |
| 33 namespace base { | 32 namespace base { |
| 34 class MessageLoopProxy; | 33 class MessageLoopProxy; |
| 35 } | 34 } |
| 36 | 35 |
| 37 namespace media { | 36 namespace media { |
| 38 | 37 |
| 39 class AudioDecoderSelector; | 38 class AudioDecoderSelector; |
| 40 class AudioSplicer; | 39 class AudioSplicer; |
| 41 class DecryptingDemuxerStream; | 40 class DecryptingDemuxerStream; |
| 42 | 41 |
| 43 class MEDIA_EXPORT AudioRendererImpl | 42 class MEDIA_EXPORT AudioRendererImpl |
| 44 : public AudioRenderer, | 43 : public AudioRenderer, |
| 45 NON_EXPORTED_BASE(public AudioRendererSink::RenderCallback) { | 44 NON_EXPORTED_BASE(public AudioRendererSink::RenderCallback) { |
| 46 public: | 45 public: |
| 47 // An AudioRendererSink is used as the destination for the rendered audio. | 46 // An AudioRendererSink is used as the destination for the rendered audio. |
| 48 AudioRendererImpl(const scoped_refptr<base::MessageLoopProxy>& message_loop, | 47 AudioRendererImpl(const scoped_refptr<base::MessageLoopProxy>& message_loop, |
| 49 AudioRendererSink* sink, | 48 AudioRendererSink* sink, |
| 50 const SetDecryptorReadyCB& set_decryptor_ready_cb); | 49 const SetDecryptorReadyCB& set_decryptor_ready_cb); |
| 51 virtual ~AudioRendererImpl(); | |
| 52 | 50 |
| 53 // AudioRenderer implementation. | 51 // AudioRenderer implementation. |
| 54 virtual void Initialize(const scoped_refptr<DemuxerStream>& stream, | 52 virtual void Initialize(const scoped_refptr<DemuxerStream>& stream, |
| 55 const AudioDecoderList& decoders, | 53 const AudioDecoderList& decoders, |
| 56 const PipelineStatusCB& init_cb, | 54 const PipelineStatusCB& init_cb, |
| 57 const StatisticsCB& statistics_cb, | 55 const StatisticsCB& statistics_cb, |
| 58 const base::Closure& underflow_cb, | 56 const base::Closure& underflow_cb, |
| 59 const TimeCB& time_cb, | 57 const TimeCB& time_cb, |
| 60 const base::Closure& ended_cb, | 58 const base::Closure& ended_cb, |
| 61 const base::Closure& disabled_cb, | 59 const base::Closure& disabled_cb, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 75 // instead of some number of silence frames. Must be called prior to | 73 // instead of some number of silence frames. Must be called prior to |
| 76 // Initialize(). | 74 // Initialize(). |
| 77 void DisableUnderflowForTesting(); | 75 void DisableUnderflowForTesting(); |
| 78 | 76 |
| 79 // Allows injection of a custom time callback for non-realtime testing. | 77 // Allows injection of a custom time callback for non-realtime testing. |
| 80 typedef base::Callback<base::Time()> NowCB; | 78 typedef base::Callback<base::Time()> NowCB; |
| 81 void set_now_cb_for_testing(const NowCB& now_cb) { | 79 void set_now_cb_for_testing(const NowCB& now_cb) { |
| 82 now_cb_ = now_cb; | 80 now_cb_ = now_cb; |
| 83 } | 81 } |
| 84 | 82 |
| 83 protected: |
| 84 virtual ~AudioRendererImpl(); |
| 85 |
| 85 private: | 86 private: |
| 86 friend class AudioRendererImplTest; | 87 friend class AudioRendererImplTest; |
| 87 | 88 |
| 88 // Callback from the audio decoder delivering decoded audio samples. | 89 // Callback from the audio decoder delivering decoded audio samples. |
| 89 void DecodedAudioReady(AudioDecoder::Status status, | 90 void DecodedAudioReady(AudioDecoder::Status status, |
| 90 const scoped_refptr<DataBuffer>& buffer); | 91 const scoped_refptr<DataBuffer>& buffer); |
| 91 | 92 |
| 92 // Handles buffers that come out of |splicer_|. | 93 // Handles buffers that come out of |splicer_|. |
| 93 // Returns true if more buffers are needed. | 94 // Returns true if more buffers are needed. |
| 94 bool HandleSplicerBuffer(const scoped_refptr<DataBuffer>& buffer); | 95 bool HandleSplicerBuffer(const scoped_refptr<DataBuffer>& buffer); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 // Note: |decoder_selector| is passed here to keep the AudioDecoderSelector | 153 // Note: |decoder_selector| is passed here to keep the AudioDecoderSelector |
| 153 // alive until OnDecoderSelected() finishes. | 154 // alive until OnDecoderSelected() finishes. |
| 154 void OnDecoderSelected( | 155 void OnDecoderSelected( |
| 155 scoped_ptr<AudioDecoderSelector> decoder_selector, | 156 scoped_ptr<AudioDecoderSelector> decoder_selector, |
| 156 const scoped_refptr<AudioDecoder>& selected_decoder, | 157 const scoped_refptr<AudioDecoder>& selected_decoder, |
| 157 const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream); | 158 const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream); |
| 158 | 159 |
| 159 void ResetDecoder(const base::Closure& callback); | 160 void ResetDecoder(const base::Closure& callback); |
| 160 | 161 |
| 161 scoped_refptr<base::MessageLoopProxy> message_loop_; | 162 scoped_refptr<base::MessageLoopProxy> message_loop_; |
| 162 base::WeakPtrFactory<AudioRendererImpl> weak_factory_; | |
| 163 base::WeakPtr<AudioRendererImpl> weak_this_; | |
| 164 | 163 |
| 165 scoped_ptr<AudioSplicer> splicer_; | 164 scoped_ptr<AudioSplicer> splicer_; |
| 166 | 165 |
| 167 // The sink (destination) for rendered audio. |sink_| must only be accessed | 166 // The sink (destination) for rendered audio. |sink_| must only be accessed |
| 168 // on |message_loop_|. |sink_| must never be called under |lock_| or else we | 167 // on |message_loop_|. |sink_| must never be called under |lock_| or else we |
| 169 // may deadlock between |message_loop_| and the audio callback thread. | 168 // may deadlock between |message_loop_| and the audio callback thread. |
| 170 scoped_refptr<media::AudioRendererSink> sink_; | 169 scoped_refptr<media::AudioRendererSink> sink_; |
| 171 | 170 |
| 172 SetDecryptorReadyCB set_decryptor_ready_cb_; | 171 SetDecryptorReadyCB set_decryptor_ready_cb_; |
| 173 | 172 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 // Variables used only on the audio thread. --------------------------------- | 256 // Variables used only on the audio thread. --------------------------------- |
| 258 int actual_frames_per_buffer_; | 257 int actual_frames_per_buffer_; |
| 259 scoped_array<uint8> audio_buffer_; | 258 scoped_array<uint8> audio_buffer_; |
| 260 | 259 |
| 261 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); | 260 DISALLOW_COPY_AND_ASSIGN(AudioRendererImpl); |
| 262 }; | 261 }; |
| 263 | 262 |
| 264 } // namespace media | 263 } // namespace media |
| 265 | 264 |
| 266 #endif // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ | 265 #endif // MEDIA_FILTERS_AUDIO_RENDERER_IMPL_H_ |
| OLD | NEW |