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

Side by Side Diff: media/audio/android/opensles_input.cc

Issue 15941002: Fix audio capture buffer handling on Android. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 7 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 | « no previous file | no next file » | 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/android/opensles_input.h" 5 #include "media/audio/android/opensles_input.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "media/audio/android/audio_manager_android.h" 8 #include "media/audio/android/audio_manager_android.h"
9 9
10 namespace media { 10 namespace media {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 if (started_) 64 if (started_)
65 return; 65 return;
66 66
67 // Enable the flags before streaming. 67 // Enable the flags before streaming.
68 callback_ = callback; 68 callback_ = callback;
69 active_queue_ = 0; 69 active_queue_ = 0;
70 started_ = true; 70 started_ = true;
71 71
72 SLresult err = SL_RESULT_UNKNOWN_ERROR; 72 SLresult err = SL_RESULT_UNKNOWN_ERROR;
73 // Enqueues |kNumOfQueuesInBuffer| zero buffers to get the ball rolling. 73 // Enqueues |kNumOfQueuesInBuffer| zero buffers to get the ball rolling.
74 for (int i = 0; i < kNumOfQueuesInBuffer - 1; ++i) { 74 for (int i = 0; i < kNumOfQueuesInBuffer; ++i) {
75 err = (*simple_buffer_queue_)->Enqueue( 75 err = (*simple_buffer_queue_)->Enqueue(
76 simple_buffer_queue_, 76 simple_buffer_queue_,
77 audio_data_[i], 77 audio_data_[i],
78 buffer_size_bytes_); 78 buffer_size_bytes_);
79 if (SL_RESULT_SUCCESS != err) { 79 if (SL_RESULT_SUCCESS != err) {
80 HandleError(err); 80 HandleError(err);
81 return; 81 return;
82 } 82 }
83 } 83 }
84 84
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 180
181 // Audio source configuration. 181 // Audio source configuration.
182 SLDataLocator_IODevice mic_locator = { 182 SLDataLocator_IODevice mic_locator = {
183 SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, 183 SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT,
184 SL_DEFAULTDEVICEID_AUDIOINPUT, NULL 184 SL_DEFAULTDEVICEID_AUDIOINPUT, NULL
185 }; 185 };
186 SLDataSource audio_source = { &mic_locator, NULL }; 186 SLDataSource audio_source = { &mic_locator, NULL };
187 187
188 // Audio sink configuration. 188 // Audio sink configuration.
189 SLDataLocator_AndroidSimpleBufferQueue buffer_queue = { 189 SLDataLocator_AndroidSimpleBufferQueue buffer_queue = {
190 SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, // Locator type. 190 SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, // Locator type.
191 static_cast<SLuint32>(kNumOfQueuesInBuffer) // Number of buffers. 191 static_cast<SLuint32>(kNumOfQueuesInBuffer) // Number of buffers.
192 }; 192 };
193 SLDataSink audio_sink = { &buffer_queue, &format_ }; 193 SLDataSink audio_sink = { &buffer_queue, &format_ };
194 194
195 // Create an audio recorder. 195 // Create an audio recorder.
196 const SLuint32 number_of_interfaces = 1; 196 const SLuint32 number_of_interfaces = 1;
197 const SLInterfaceID interface_id[number_of_interfaces] = { 197 const SLInterfaceID interface_id[number_of_interfaces] = {
198 SL_IID_ANDROIDSIMPLEBUFFERQUEUE 198 SL_IID_ANDROIDSIMPLEBUFFERQUEUE
199 }; 199 };
200 const SLboolean interface_required[number_of_interfaces] = { 200 const SLboolean interface_required[number_of_interfaces] = {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 SLAndroidSimpleBufferQueueItf buffer_queue, void* instance) { 251 SLAndroidSimpleBufferQueueItf buffer_queue, void* instance) {
252 OpenSLESInputStream* stream = 252 OpenSLESInputStream* stream =
253 reinterpret_cast<OpenSLESInputStream*>(instance); 253 reinterpret_cast<OpenSLESInputStream*>(instance);
254 stream->ReadBufferQueue(); 254 stream->ReadBufferQueue();
255 } 255 }
256 256
257 void OpenSLESInputStream::ReadBufferQueue() { 257 void OpenSLESInputStream::ReadBufferQueue() {
258 if (!started_) 258 if (!started_)
259 return; 259 return;
260 260
261 // Get the enqueued buffer from the soundcard. 261 // TODO(xians): Get an accurate delay estimation.
262 callback_->OnData(this,
263 audio_data_[active_queue_],
264 buffer_size_bytes_,
265 buffer_size_bytes_,
266 0.0);
267
268 // Done with this buffer. Send it to device for recording.
262 SLresult err = (*simple_buffer_queue_)->Enqueue( 269 SLresult err = (*simple_buffer_queue_)->Enqueue(
263 simple_buffer_queue_, 270 simple_buffer_queue_,
264 audio_data_[active_queue_], 271 audio_data_[active_queue_],
265 buffer_size_bytes_); 272 buffer_size_bytes_);
266 if (SL_RESULT_SUCCESS != err) 273 if (SL_RESULT_SUCCESS != err)
267 HandleError(err); 274 HandleError(err);
268 275
269 // TODO(xians): Get an accurate delay estimation.
270 callback_->OnData(this,
271 audio_data_[active_queue_],
272 buffer_size_bytes_,
273 buffer_size_bytes_,
274 0.0);
275
276 active_queue_ = (active_queue_ + 1) % kNumOfQueuesInBuffer; 276 active_queue_ = (active_queue_ + 1) % kNumOfQueuesInBuffer;
277 } 277 }
278 278
279 void OpenSLESInputStream::SetupAudioBuffer() { 279 void OpenSLESInputStream::SetupAudioBuffer() {
280 DCHECK(!audio_data_[0]); 280 DCHECK(!audio_data_[0]);
281 for (int i = 0; i < kNumOfQueuesInBuffer; ++i) { 281 for (int i = 0; i < kNumOfQueuesInBuffer; ++i) {
282 audio_data_[i] = new uint8[buffer_size_bytes_]; 282 audio_data_[i] = new uint8[buffer_size_bytes_];
283 } 283 }
284 } 284 }
285 285
286 void OpenSLESInputStream::ReleaseAudioBuffer() { 286 void OpenSLESInputStream::ReleaseAudioBuffer() {
287 if (audio_data_[0]) { 287 if (audio_data_[0]) {
288 for (int i = 0; i < kNumOfQueuesInBuffer; ++i) { 288 for (int i = 0; i < kNumOfQueuesInBuffer; ++i) {
289 delete [] audio_data_[i]; 289 delete [] audio_data_[i];
290 audio_data_[i] = NULL; 290 audio_data_[i] = NULL;
291 } 291 }
292 } 292 }
293 } 293 }
294 294
295 void OpenSLESInputStream::HandleError(SLresult error) { 295 void OpenSLESInputStream::HandleError(SLresult error) {
296 DLOG(FATAL) << "OpenSLES error " << error; 296 DLOG(FATAL) << "OpenSLES error " << error;
297 if (callback_) 297 if (callback_)
298 callback_->OnError(this); 298 callback_->OnError(this);
299 } 299 }
300 300
301 } // namespace media 301 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698