Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: media/filters/audio_renderer_base.h

Issue 155695: Replace the guts of AudioRendererBase with calls to scaling algorithm. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/audio_renderer_algorithm_base.cc ('k') | media/filters/audio_renderer_base.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 // AudioRendererBase takes care of the tricky queuing work and provides simple 5 // AudioRendererBase takes care of the tricky queuing work and provides simple
6 // methods for subclasses to peek and poke at audio data. In addition to 6 // methods for subclasses to peek and poke at audio data. In addition to
7 // AudioRenderer interface methods this classes doesn't implement, subclasses 7 // AudioRenderer interface methods this classes doesn't implement, subclasses
8 // must also implement the following methods: 8 // must also implement the following methods:
9 // OnInitialized 9 // OnInitialized
10 // OnStop 10 // OnStop
11 // 11 //
12 // The general assumption is that subclasses start a callback-based audio thread 12 // The general assumption is that subclasses start a callback-based audio thread
13 // which needs to be filled with decoded audio data. AudioDecoderBase provides 13 // which needs to be filled with decoded audio data. AudioDecoderBase provides
14 // FillBuffer which handles filling the provided buffer, dequeuing items, 14 // FillBuffer which handles filling the provided buffer, dequeuing items,
15 // scheduling additional reads and updating the clock. In a sense, 15 // scheduling additional reads and updating the clock. In a sense,
16 // AudioRendererBase is the producer and the subclass is the consumer. 16 // AudioRendererBase is the producer and the subclass is the consumer.
17 17
18 #ifndef MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_ 18 #ifndef MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_
19 #define MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_ 19 #define MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_
20 20
21 #include <deque> 21 #include <deque>
22 22
23 #include "base/lock.h" 23 #include "base/lock.h"
24 #include "media/base/buffers.h" 24 #include "media/base/buffers.h"
25 #include "media/base/factory.h" 25 #include "media/base/factory.h"
26 #include "media/base/filters.h" 26 #include "media/base/filters.h"
27 #include "media/filters/audio_renderer_algorithm_base.h"
27 28
28 namespace media { 29 namespace media {
29 30
30 class AudioRendererBase : public AudioRenderer { 31 class AudioRendererBase : public AudioRenderer {
31 public: 32 public:
32 // MediaFilter implementation. 33 // MediaFilter implementation.
33 virtual void Play(FilterCallback* callback); 34 virtual void Play(FilterCallback* callback);
34 virtual void Pause(FilterCallback* callback); 35 virtual void Pause(FilterCallback* callback);
35 virtual void Stop(); 36 virtual void Stop();
36 37
37 virtual void Seek(base::TimeDelta time, FilterCallback* callback); 38 virtual void Seek(base::TimeDelta time, FilterCallback* callback);
38 39
39 // AudioRenderer implementation. 40 // AudioRenderer implementation.
40 virtual void Initialize(AudioDecoder* decoder, FilterCallback* callback); 41 virtual void Initialize(AudioDecoder* decoder, FilterCallback* callback);
41 42
42 protected: 43 protected:
43 // The default maximum size of the queue.
44 static const size_t kDefaultMaxQueueSize;
45
46 // Only allow a factory to create this class. 44 // Only allow a factory to create this class.
47 explicit AudioRendererBase(size_t max_queue_size); 45 AudioRendererBase();
48 virtual ~AudioRendererBase(); 46 virtual ~AudioRendererBase();
49 47
50 // Called by Initialize(). |media_format| is the format of the AudioDecoder. 48 // Called by Initialize(). |media_format| is the format of the AudioDecoder.
51 // Subclasses should return true if they were able to initialize, false 49 // Subclasses should return true if they were able to initialize, false
52 // otherwise. 50 // otherwise.
53 virtual bool OnInitialize(const MediaFormat& media_format) = 0; 51 virtual bool OnInitialize(const MediaFormat& media_format) = 0;
54 52
55 // Called by Stop(). Subclasses should perform any necessary cleanup during 53 // Called by Stop(). Subclasses should perform any necessary cleanup during
56 // this time, such as stopping any running threads. 54 // this time, such as stopping any running threads.
57 virtual void OnStop() = 0; 55 virtual void OnStop() = 0;
58 56
59 // Called when a AudioDecoder::Read() completes and decrements 57 // Called when a AudioDecoder::Read() completes and decrements
60 // |pending_reads_|. 58 // |pending_reads_|.
61 virtual void OnReadComplete(Buffer* buffer_in); 59 virtual void OnReadComplete(Buffer* buffer_in);
62 60
63 // Fills the given buffer with audio data by dequeuing buffers and copying the 61 // Fills the given buffer with audio data by delegating to its |algorithm_|.
64 // data into the |dest|. FillBuffer() also takes care of updating the clock. 62 // FillBuffer() also takes care of updating the clock. Returns the number of
65 // Returns the number of bytes copied into |dest|, which may be less than 63 // bytes copied into |dest|, which may be less than or equal to |len|.
66 // equal to |len|.
67 // 64 //
68 // If this method is returns less bytes than |len| (including zero), it could 65 // If this method is returns less bytes than |len| (including zero), it could
69 // be a sign that the pipeline is stalled or unable to stream the data fast 66 // be a sign that the pipeline is stalled or unable to stream the data fast
70 // enough. In such scenarios, the callee should zero out unused portions 67 // enough. In such scenarios, the callee should zero out unused portions
71 // of their buffer to playback silence. 68 // of their buffer to playback silence.
72 // 69 //
73 // FillBuffer() updates the pipeline's playback timestamp. If FillBuffer() is 70 // FillBuffer() updates the pipeline's playback timestamp. If FillBuffer() is
74 // not called at the same rate as audio samples are played, then the reported 71 // not called at the same rate as audio samples are played, then the reported
75 // timestamp in the pipeline will be ahead of the actual audio playback. In 72 // timestamp in the pipeline will be ahead of the actual audio playback. In
76 // this case |playback_delay| should be used to indicate when in the future 73 // this case |playback_delay| should be used to indicate when in the future
77 // should the filled buffer be played. If FillBuffer() is called as the audio 74 // should the filled buffer be played. If FillBuffer() is called as the audio
78 // hardware plays the buffer, then |playback_delay| should be zero. 75 // hardware plays the buffer, then |playback_delay| should be zero.
79 // 76 //
80 // Safe to call on any thread. 77 // Safe to call on any thread.
81 size_t FillBuffer(uint8* dest, 78 size_t FillBuffer(uint8* dest,
82 size_t len, 79 size_t len,
83 float rate,
84 const base::TimeDelta& playback_delay); 80 const base::TimeDelta& playback_delay);
85 81
86 // Helper to parse a media format and return whether we were successful 82 // Helper to parse a media format and return whether we were successful
87 // retrieving all the information we care about. 83 // retrieving all the information we care about.
88 static bool ParseMediaFormat(const MediaFormat& media_format, 84 static bool ParseMediaFormat(const MediaFormat& media_format,
89 int* channels_out, int* sample_rate_out, 85 int* channels_out, int* sample_rate_out,
90 int* sample_bits_out); 86 int* sample_bits_out);
91 87
88 // Get/Set the playback rate of |algorithm_|.
89 virtual void SetPlaybackRate(float playback_rate);
90 virtual float GetPlaybackRate();
91
92 private: 92 private:
93 // Helper method that schedules an asynchronous read from the decoder and 93 // Helper method that schedules an asynchronous read from the decoder and
94 // increments |pending_reads_|. 94 // increments |pending_reads_|.
95 // 95 //
96 // Safe to call from any thread. 96 // Safe to call from any thread.
97 void ScheduleRead_Locked(); 97 void ScheduleRead_Locked();
98 98
99 // Audio decoder. 99 // Audio decoder.
100 scoped_refptr<AudioDecoder> decoder_; 100 scoped_refptr<AudioDecoder> decoder_;
101 101
102 // Maximum queue size, configuration parameter passed in during construction. 102 // Algorithm for scaling audio.
103 size_t max_queue_size_; 103 scoped_ptr<AudioRendererAlgorithmBase> algorithm_;
104 104
105 // Queued audio data.
106 typedef std::deque< scoped_refptr<Buffer> > BufferQueue;
107 BufferQueue queue_;
108 Lock lock_; 105 Lock lock_;
109 106
110 // Remembers the amount of remaining audio data for the front buffer.
111 size_t data_offset_;
112
113 // Simple state tracking variable. 107 // Simple state tracking variable.
114 enum State { 108 enum State {
115 kUninitialized, 109 kUninitialized,
116 kPaused, 110 kPaused,
117 kSeeking, 111 kSeeking,
118 kPlaying, 112 kPlaying,
119 kStopped, 113 kStopped,
120 kError, 114 kError,
121 }; 115 };
122 State state_; 116 State state_;
(...skipping 12 matching lines...) Expand all
135 // Filter callbacks. 129 // Filter callbacks.
136 scoped_ptr<FilterCallback> pause_callback_; 130 scoped_ptr<FilterCallback> pause_callback_;
137 scoped_ptr<FilterCallback> seek_callback_; 131 scoped_ptr<FilterCallback> seek_callback_;
138 132
139 DISALLOW_COPY_AND_ASSIGN(AudioRendererBase); 133 DISALLOW_COPY_AND_ASSIGN(AudioRendererBase);
140 }; 134 };
141 135
142 } // namespace media 136 } // namespace media
143 137
144 #endif // MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_ 138 #endif // MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_
OLDNEW
« no previous file with comments | « media/filters/audio_renderer_algorithm_base.cc ('k') | media/filters/audio_renderer_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698