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

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

Issue 9395057: Fix muted audio when playback rate != 1.0 or 0.0 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase ToT Created 8 years, 9 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
OLDNEW
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 // 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
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 // Method called by FillBuffer() when it finds that it reached end of stream. 66 // Method called by FillBuffer() when it finds that it reached end of stream.
67 // FillBuffer() cannot immediately signal end of stream event because browser 67 // FillBuffer() cannot immediately signal end of stream event because browser
68 // may have buffered data. 68 // may have buffered data.
69 virtual void OnRenderEndOfStream() = 0; 69 virtual void OnRenderEndOfStream() = 0;
70 70
71 // Callback from the audio decoder delivering decoded audio samples. 71 // Callback from the audio decoder delivering decoded audio samples.
72 void DecodedAudioReady(scoped_refptr<Buffer> buffer); 72 void DecodedAudioReady(scoped_refptr<Buffer> buffer);
73 73
74 // Fills the given buffer with audio data by delegating to its |algorithm_|. 74 // Fills the given buffer with audio data by delegating to its |algorithm_|.
75 // FillBuffer() also takes care of updating the clock. Returns the number of 75 // FillBuffer() also takes care of updating the clock. Returns the number of
76 // bytes copied into |dest|, which may be less than or equal to |len|. 76 // frames copied into |dest|, which may be less than or equal to
77 // |requested_frames|.
77 // 78 //
78 // If this method is returns less bytes than |len| (including zero), it could 79 // If this method returns fewer frames than |requested_frames|, it could
79 // be a sign that the pipeline is stalled or unable to stream the data fast 80 // be a sign that the pipeline is stalled or unable to stream the data fast
80 // enough. In such scenarios, the callee should zero out unused portions 81 // enough. In such scenarios, the callee should zero out unused portions
81 // of their buffer to playback silence. 82 // of their buffer to playback silence.
82 // 83 //
83 // FillBuffer() updates the pipeline's playback timestamp. If FillBuffer() is 84 // FillBuffer() updates the pipeline's playback timestamp. If FillBuffer() is
84 // not called at the same rate as audio samples are played, then the reported 85 // not called at the same rate as audio samples are played, then the reported
85 // timestamp in the pipeline will be ahead of the actual audio playback. In 86 // timestamp in the pipeline will be ahead of the actual audio playback. In
86 // this case |playback_delay| should be used to indicate when in the future 87 // this case |playback_delay| should be used to indicate when in the future
87 // should the filled buffer be played. If FillBuffer() is called as the audio 88 // should the filled buffer be played. If FillBuffer() is called as the audio
88 // hardware plays the buffer, then |playback_delay| should be zero. 89 // hardware plays the buffer, then |playback_delay| should be zero.
89 // 90 //
90 // FillBuffer() calls OnRenderEndOfStream() when it reaches end of stream. 91 // FillBuffer() calls OnRenderEndOfStream() when it reaches end of stream.
91 // It is responsibility of derived class to provide implementation of 92 // It is responsibility of derived class to provide implementation of
92 // OnRenderEndOfStream() that calls SignalEndOfStream() when all the hardware 93 // OnRenderEndOfStream() that calls SignalEndOfStream() when all the hardware
93 // buffers become empty (i.e. when all the data written to the device has 94 // buffers become empty (i.e. when all the data written to the device has
94 // been played). 95 // been played).
95 // 96 //
96 // Safe to call on any thread. 97 // Safe to call on any thread.
97 uint32 FillBuffer(uint8* dest, 98 uint32 FillBuffer(uint8* dest,
98 uint32 len, 99 uint32 requested_frames,
99 const base::TimeDelta& playback_delay); 100 const base::TimeDelta& playback_delay);
100 101
101 // Called by OnRenderEndOfStream() or some callback scheduled by derived class 102 // Called by OnRenderEndOfStream() or some callback scheduled by derived class
102 // to signal end of stream. 103 // to signal end of stream.
103 void SignalEndOfStream(); 104 void SignalEndOfStream();
104 105
105 // Get/Set the playback rate of |algorithm_|. 106 // Get/Set the playback rate of |algorithm_|.
106 virtual void SetPlaybackRate(float playback_rate) OVERRIDE; 107 virtual void SetPlaybackRate(float playback_rate) OVERRIDE;
107 virtual float GetPlaybackRate(); 108 virtual float GetPlaybackRate();
108 109
(...skipping 28 matching lines...) Expand all
137 kStopped, 138 kStopped,
138 kUnderflow, 139 kUnderflow,
139 kRebuffering, 140 kRebuffering,
140 }; 141 };
141 State state_; 142 State state_;
142 143
143 // Keep track of our outstanding read to |decoder_|. 144 // Keep track of our outstanding read to |decoder_|.
144 bool pending_read_; 145 bool pending_read_;
145 146
146 // Keeps track of whether we received and rendered the end of stream buffer. 147 // Keeps track of whether we received and rendered the end of stream buffer.
147 bool recieved_end_of_stream_; 148 bool received_end_of_stream_;
148 bool rendered_end_of_stream_; 149 bool rendered_end_of_stream_;
149 150
150 // Audio time at end of last call to FillBuffer(). 151 // Audio time at end of last call to FillBuffer().
151 // TODO(ralphl): Update this value after seeking. 152 // TODO(ralphl): Update this value after seeking.
152 base::TimeDelta last_fill_buffer_time_; 153 base::TimeDelta last_fill_buffer_time_;
153 154
154 // Filter callbacks. 155 // Filter callbacks.
155 base::Closure pause_callback_; 156 base::Closure pause_callback_;
156 FilterStatusCB seek_cb_; 157 FilterStatusCB seek_cb_;
157 158
158 base::Closure underflow_callback_; 159 base::Closure underflow_callback_;
159 160
160 AudioTimeCB audio_time_cb_; 161 AudioTimeCB audio_time_cb_;
161 162
162 base::TimeDelta seek_timestamp_; 163 base::TimeDelta seek_timestamp_;
163 164
165 uint32 bytes_per_frame_;
166
164 AudioDecoder::ReadCB read_cb_; 167 AudioDecoder::ReadCB read_cb_;
165 168
166 DISALLOW_COPY_AND_ASSIGN(AudioRendererBase); 169 DISALLOW_COPY_AND_ASSIGN(AudioRendererBase);
167 }; 170 };
168 171
169 } // namespace media 172 } // namespace media
170 173
171 #endif // MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_ 174 #endif // MEDIA_FILTERS_AUDIO_RENDERER_BASE_H_
OLDNEW
« no previous file with comments | « media/filters/audio_renderer_algorithm_base_unittest.cc ('k') | media/filters/audio_renderer_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698