| 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 #include "media/audio/android/opensles_input.h" | 5 #include "media/audio/android/opensles_input.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "media/audio/android/audio_manager_android.h" | 9 #include "media/audio/android/audio_manager_android.h" |
| 10 #include "media/base/audio_bus.h" | |
| 11 | 10 |
| 12 #define LOG_ON_FAILURE_AND_RETURN(op, ...) \ | 11 #define LOG_ON_FAILURE_AND_RETURN(op, ...) \ |
| 13 do { \ | 12 do { \ |
| 14 SLresult err = (op); \ | 13 SLresult err = (op); \ |
| 15 if (err != SL_RESULT_SUCCESS) { \ | 14 if (err != SL_RESULT_SUCCESS) { \ |
| 16 DLOG(ERROR) << #op << " failed: " << err; \ | 15 DLOG(ERROR) << #op << " failed: " << err; \ |
| 17 return __VA_ARGS__; \ | 16 return __VA_ARGS__; \ |
| 18 } \ | 17 } \ |
| 19 } while (0) | 18 } while (0) |
| 20 | 19 |
| 21 namespace media { | 20 namespace media { |
| 22 | 21 |
| 23 OpenSLESInputStream::OpenSLESInputStream(AudioManagerAndroid* audio_manager, | 22 OpenSLESInputStream::OpenSLESInputStream(AudioManagerAndroid* audio_manager, |
| 24 const AudioParameters& params) | 23 const AudioParameters& params) |
| 25 : audio_manager_(audio_manager), | 24 : audio_manager_(audio_manager), |
| 26 callback_(NULL), | 25 callback_(NULL), |
| 27 recorder_(NULL), | 26 recorder_(NULL), |
| 28 simple_buffer_queue_(NULL), | 27 simple_buffer_queue_(NULL), |
| 29 active_buffer_index_(0), | 28 active_buffer_index_(0), |
| 30 buffer_size_bytes_(0), | 29 buffer_size_bytes_(0), |
| 31 started_(false), | 30 started_(false) { |
| 32 audio_bus_(media::AudioBus::Create(params)) { | |
| 33 DVLOG(2) << __PRETTY_FUNCTION__; | 31 DVLOG(2) << __PRETTY_FUNCTION__; |
| 34 format_.formatType = SL_DATAFORMAT_PCM; | 32 format_.formatType = SL_DATAFORMAT_PCM; |
| 35 format_.numChannels = static_cast<SLuint32>(params.channels()); | 33 format_.numChannels = static_cast<SLuint32>(params.channels()); |
| 36 // Provides sampling rate in milliHertz to OpenSLES. | 34 // Provides sampling rate in milliHertz to OpenSLES. |
| 37 format_.samplesPerSec = static_cast<SLuint32>(params.sample_rate() * 1000); | 35 format_.samplesPerSec = static_cast<SLuint32>(params.sample_rate() * 1000); |
| 38 format_.bitsPerSample = params.bits_per_sample(); | 36 format_.bitsPerSample = params.bits_per_sample(); |
| 39 format_.containerSize = params.bits_per_sample(); | 37 format_.containerSize = params.bits_per_sample(); |
| 40 format_.endianness = SL_BYTEORDER_LITTLEENDIAN; | 38 format_.endianness = SL_BYTEORDER_LITTLEENDIAN; |
| 41 if (format_.numChannels == 1) | 39 if (format_.numChannels == 1) |
| 42 format_.channelMask = SL_SPEAKER_FRONT_CENTER; | 40 format_.channelMask = SL_SPEAKER_FRONT_CENTER; |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 stream->ReadBufferQueue(); | 288 stream->ReadBufferQueue(); |
| 291 } | 289 } |
| 292 | 290 |
| 293 void OpenSLESInputStream::ReadBufferQueue() { | 291 void OpenSLESInputStream::ReadBufferQueue() { |
| 294 base::AutoLock lock(lock_); | 292 base::AutoLock lock(lock_); |
| 295 if (!started_) | 293 if (!started_) |
| 296 return; | 294 return; |
| 297 | 295 |
| 298 TRACE_EVENT0("audio", "OpenSLESOutputStream::ReadBufferQueue"); | 296 TRACE_EVENT0("audio", "OpenSLESOutputStream::ReadBufferQueue"); |
| 299 | 297 |
| 300 // Convert from interleaved format to deinterleaved audio bus format. | |
| 301 audio_bus_->FromInterleaved(audio_data_[active_buffer_index_], | |
| 302 audio_bus_->frames(), | |
| 303 format_.bitsPerSample / 8); | |
| 304 | |
| 305 // TODO(henrika): Investigate if it is possible to get an accurate | 298 // TODO(henrika): Investigate if it is possible to get an accurate |
| 306 // delay estimation. | 299 // delay estimation. |
| 307 callback_->OnData(this, audio_bus_.get(), buffer_size_bytes_, 0.0); | 300 callback_->OnData(this, |
| 301 audio_data_[active_buffer_index_], |
| 302 buffer_size_bytes_, |
| 303 buffer_size_bytes_, |
| 304 0.0); |
| 308 | 305 |
| 309 // Done with this buffer. Send it to device for recording. | 306 // Done with this buffer. Send it to device for recording. |
| 310 SLresult err = | 307 SLresult err = |
| 311 (*simple_buffer_queue_)->Enqueue(simple_buffer_queue_, | 308 (*simple_buffer_queue_)->Enqueue(simple_buffer_queue_, |
| 312 audio_data_[active_buffer_index_], | 309 audio_data_[active_buffer_index_], |
| 313 buffer_size_bytes_); | 310 buffer_size_bytes_); |
| 314 if (SL_RESULT_SUCCESS != err) | 311 if (SL_RESULT_SUCCESS != err) |
| 315 HandleError(err); | 312 HandleError(err); |
| 316 | 313 |
| 317 active_buffer_index_ = (active_buffer_index_ + 1) % kMaxNumOfBuffersInQueue; | 314 active_buffer_index_ = (active_buffer_index_ + 1) % kMaxNumOfBuffersInQueue; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 335 } | 332 } |
| 336 } | 333 } |
| 337 | 334 |
| 338 void OpenSLESInputStream::HandleError(SLresult error) { | 335 void OpenSLESInputStream::HandleError(SLresult error) { |
| 339 DLOG(ERROR) << "OpenSLES Input error " << error; | 336 DLOG(ERROR) << "OpenSLES Input error " << error; |
| 340 if (callback_) | 337 if (callback_) |
| 341 callback_->OnError(this); | 338 callback_->OnError(this); |
| 342 } | 339 } |
| 343 | 340 |
| 344 } // namespace media | 341 } // namespace media |
| OLD | NEW |