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

Side by Side Diff: media/audio/audio_output_resampler.cc

Issue 10830268: Allow audio system to handle synchronized low-latency audio I/O (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 3 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/audio/audio_output_resampler.h ('k') | media/audio/linux/alsa_output_unittest.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) 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 #include "media/audio/audio_output_resampler.h" 5 #include "media/audio/audio_output_resampler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 void AudioOutputResampler::CloseStream(AudioOutputProxy* stream_proxy) { 120 void AudioOutputResampler::CloseStream(AudioOutputProxy* stream_proxy) {
121 Reset(); 121 Reset();
122 dispatcher_->CloseStream(stream_proxy); 122 dispatcher_->CloseStream(stream_proxy);
123 } 123 }
124 124
125 void AudioOutputResampler::Shutdown() { 125 void AudioOutputResampler::Shutdown() {
126 Reset(); 126 Reset();
127 dispatcher_->Shutdown(); 127 dispatcher_->Shutdown();
128 } 128 }
129 129
130 int AudioOutputResampler::OnMoreData(AudioBus* audio_bus, 130 int AudioOutputResampler::OnMoreData(AudioBus* dest,
131 AudioBuffersState buffers_state) { 131 AudioBuffersState buffers_state) {
132 return OnMoreIOData(NULL, dest, buffers_state);
133 }
134
135 int AudioOutputResampler::OnMoreIOData(AudioBus* source,
136 AudioBus* dest,
137 AudioBuffersState buffers_state) {
132 base::AutoLock auto_lock(source_lock_); 138 base::AutoLock auto_lock(source_lock_);
133 // While we waited for |source_lock_| the callback might have been cleared. 139 // While we waited for |source_lock_| the callback might have been cleared.
134 if (!source_callback_) { 140 if (!source_callback_) {
135 audio_bus->Zero(); 141 dest->Zero();
136 return audio_bus->frames(); 142 return dest->frames();
137 } 143 }
138 144
139 current_buffers_state_ = buffers_state; 145 current_buffers_state_ = buffers_state;
140 146
141 if (!resampler_.get() && !audio_fifo_.get()) { 147 if (!resampler_.get() && !audio_fifo_.get()) {
142 // We have no internal buffers, so clear any outstanding audio data. 148 // We have no internal buffers, so clear any outstanding audio data.
143 outstanding_audio_bytes_ = 0; 149 outstanding_audio_bytes_ = 0;
144 SourceCallback_Locked(audio_bus); 150 SourceCallback_Locked(dest);
145 return audio_bus->frames(); 151 return dest->frames();
146 } 152 }
147 153
148 if (resampler_.get()) 154 if (resampler_.get())
149 resampler_->Resample(audio_bus, audio_bus->frames()); 155 resampler_->Resample(dest, dest->frames());
150 else 156 else
151 ProvideInput(audio_bus); 157 ProvideInput(dest);
152 158
153 // Calculate how much data is left in the internal FIFO and resampler buffers. 159 // Calculate how much data is left in the internal FIFO and resampler buffers.
154 outstanding_audio_bytes_ -= audio_bus->frames() * output_bytes_per_frame_; 160 outstanding_audio_bytes_ -= dest->frames() * output_bytes_per_frame_;
155 // Due to rounding errors while multiplying against |io_ratio_|, 161 // Due to rounding errors while multiplying against |io_ratio_|,
156 // |outstanding_audio_bytes_| might (rarely) slip below zero. 162 // |outstanding_audio_bytes_| might (rarely) slip below zero.
157 if (outstanding_audio_bytes_ < 0) { 163 if (outstanding_audio_bytes_ < 0) {
158 DLOG(ERROR) << "Outstanding audio bytes went negative! Value: " 164 DLOG(ERROR) << "Outstanding audio bytes went negative! Value: "
159 << outstanding_audio_bytes_; 165 << outstanding_audio_bytes_;
160 outstanding_audio_bytes_ = 0; 166 outstanding_audio_bytes_ = 0;
161 } 167 }
162 168
163 // Always return the full number of frames requested, ProvideInput() will pad 169 // Always return the full number of frames requested, ProvideInput() will pad
164 // with silence if it wasn't able to acquire enough data. 170 // with silence if it wasn't able to acquire enough data.
165 return audio_bus->frames(); 171 return dest->frames();
166 } 172 }
167 173
168 void AudioOutputResampler::SourceCallback_Locked(AudioBus* audio_bus) { 174 void AudioOutputResampler::SourceCallback_Locked(AudioBus* audio_bus) {
169 source_lock_.AssertAcquired(); 175 source_lock_.AssertAcquired();
170 176
171 // Adjust playback delay to include the state of the internal buffers used by 177 // Adjust playback delay to include the state of the internal buffers used by
172 // the resampler and/or the FIFO. Since the sample rate and bits per channel 178 // the resampler and/or the FIFO. Since the sample rate and bits per channel
173 // may be different, we need to scale this value appropriately. 179 // may be different, we need to scale this value appropriately.
174 AudioBuffersState new_buffers_state; 180 AudioBuffersState new_buffers_state;
175 new_buffers_state.pending_bytes = io_ratio_ * 181 new_buffers_state.pending_bytes = io_ratio_ *
(...skipping 20 matching lines...) Expand all
196 source_callback_->OnError(stream, code); 202 source_callback_->OnError(stream, code);
197 } 203 }
198 204
199 void AudioOutputResampler::WaitTillDataReady() { 205 void AudioOutputResampler::WaitTillDataReady() {
200 base::AutoLock auto_lock(source_lock_); 206 base::AutoLock auto_lock(source_lock_);
201 if (source_callback_ && !outstanding_audio_bytes_) 207 if (source_callback_ && !outstanding_audio_bytes_)
202 source_callback_->WaitTillDataReady(); 208 source_callback_->WaitTillDataReady();
203 } 209 }
204 210
205 } // namespace media 211 } // namespace media
OLDNEW
« no previous file with comments | « media/audio/audio_output_resampler.h ('k') | media/audio/linux/alsa_output_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698