| 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_output.h" | 5 #include "media/audio/android/opensles_output.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 | 10 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 | 21 |
| 22 OpenSLESOutputStream::OpenSLESOutputStream(AudioManagerAndroid* manager, | 22 OpenSLESOutputStream::OpenSLESOutputStream(AudioManagerAndroid* manager, |
| 23 const AudioParameters& params) | 23 const AudioParameters& params) |
| 24 : audio_manager_(manager), | 24 : audio_manager_(manager), |
| 25 callback_(NULL), | 25 callback_(NULL), |
| 26 player_(NULL), | 26 player_(NULL), |
| 27 simple_buffer_queue_(NULL), | 27 simple_buffer_queue_(NULL), |
| 28 active_buffer_index_(0), | 28 active_buffer_index_(0), |
| 29 buffer_size_bytes_(0), | 29 buffer_size_bytes_(0), |
| 30 started_(false), | 30 started_(false), |
| 31 muted_(false), |
| 31 volume_(1.0) { | 32 volume_(1.0) { |
| 32 DVLOG(2) << "OpenSLESOutputStream::OpenSLESOutputStream()"; | 33 DVLOG(2) << "OpenSLESOutputStream::OpenSLESOutputStream()"; |
| 33 format_.formatType = SL_DATAFORMAT_PCM; | 34 format_.formatType = SL_DATAFORMAT_PCM; |
| 34 format_.numChannels = static_cast<SLuint32>(params.channels()); | 35 format_.numChannels = static_cast<SLuint32>(params.channels()); |
| 35 // Provides sampling rate in milliHertz to OpenSLES. | 36 // Provides sampling rate in milliHertz to OpenSLES. |
| 36 format_.samplesPerSec = static_cast<SLuint32>(params.sample_rate() * 1000); | 37 format_.samplesPerSec = static_cast<SLuint32>(params.sample_rate() * 1000); |
| 37 format_.bitsPerSample = params.bits_per_sample(); | 38 format_.bitsPerSample = params.bits_per_sample(); |
| 38 format_.containerSize = params.bits_per_sample(); | 39 format_.containerSize = params.bits_per_sample(); |
| 39 format_.endianness = SL_BYTEORDER_LITTLEENDIAN; | 40 format_.endianness = SL_BYTEORDER_LITTLEENDIAN; |
| 40 if (format_.numChannels == 1) | 41 if (format_.numChannels == 1) |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 return; | 166 return; |
| 166 } | 167 } |
| 167 volume_ = volume_float; | 168 volume_ = volume_float; |
| 168 } | 169 } |
| 169 | 170 |
| 170 void OpenSLESOutputStream::GetVolume(double* volume) { | 171 void OpenSLESOutputStream::GetVolume(double* volume) { |
| 171 DCHECK(thread_checker_.CalledOnValidThread()); | 172 DCHECK(thread_checker_.CalledOnValidThread()); |
| 172 *volume = static_cast<double>(volume_); | 173 *volume = static_cast<double>(volume_); |
| 173 } | 174 } |
| 174 | 175 |
| 176 void OpenSLESOutputStream::SetMute(bool muted) { |
| 177 DVLOG(2) << "OpenSLESOutputStream::SetMute(" << muted << ")"; |
| 178 DCHECK(thread_checker_.CalledOnValidThread()); |
| 179 muted_ = muted; |
| 180 } |
| 181 |
| 175 bool OpenSLESOutputStream::CreatePlayer() { | 182 bool OpenSLESOutputStream::CreatePlayer() { |
| 176 DCHECK(thread_checker_.CalledOnValidThread()); | 183 DCHECK(thread_checker_.CalledOnValidThread()); |
| 177 DCHECK(!engine_object_.Get()); | 184 DCHECK(!engine_object_.Get()); |
| 178 DCHECK(!player_object_.Get()); | 185 DCHECK(!player_object_.Get()); |
| 179 DCHECK(!output_mixer_.Get()); | 186 DCHECK(!output_mixer_.Get()); |
| 180 DCHECK(!player_); | 187 DCHECK(!player_); |
| 181 DCHECK(!simple_buffer_queue_); | 188 DCHECK(!simple_buffer_queue_); |
| 182 | 189 |
| 183 // Initializes the engine object with specific option. After working with the | 190 // Initializes the engine object with specific option. After working with the |
| 184 // object, we need to free the object and its resources. | 191 // object, we need to free the object and its resources. |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 int frames_filled = callback_->OnMoreData( | 324 int frames_filled = callback_->OnMoreData( |
| 318 audio_bus_.get(), AudioBuffersState(0, hardware_delay)); | 325 audio_bus_.get(), AudioBuffersState(0, hardware_delay)); |
| 319 if (frames_filled <= 0) { | 326 if (frames_filled <= 0) { |
| 320 // Audio source is shutting down, or halted on error. | 327 // Audio source is shutting down, or halted on error. |
| 321 return; | 328 return; |
| 322 } | 329 } |
| 323 | 330 |
| 324 // Note: If the internal representation ever changes from 16-bit PCM to | 331 // Note: If the internal representation ever changes from 16-bit PCM to |
| 325 // raw float, the data must be clipped and sanitized since it may come | 332 // raw float, the data must be clipped and sanitized since it may come |
| 326 // from an untrusted source such as NaCl. | 333 // from an untrusted source such as NaCl. |
| 327 audio_bus_->Scale(volume_); | 334 audio_bus_->Scale(muted_ ? 0.0f : volume_); |
| 328 audio_bus_->ToInterleaved(frames_filled, | 335 audio_bus_->ToInterleaved(frames_filled, |
| 329 format_.bitsPerSample / 8, | 336 format_.bitsPerSample / 8, |
| 330 audio_data_[active_buffer_index_]); | 337 audio_data_[active_buffer_index_]); |
| 331 | 338 |
| 332 const int num_filled_bytes = | 339 const int num_filled_bytes = |
| 333 frames_filled * audio_bus_->channels() * format_.bitsPerSample / 8; | 340 frames_filled * audio_bus_->channels() * format_.bitsPerSample / 8; |
| 334 DCHECK_LE(static_cast<size_t>(num_filled_bytes), buffer_size_bytes_); | 341 DCHECK_LE(static_cast<size_t>(num_filled_bytes), buffer_size_bytes_); |
| 335 | 342 |
| 336 // Enqueue the buffer for playback. | 343 // Enqueue the buffer for playback. |
| 337 SLresult err = | 344 SLresult err = |
| (...skipping 24 matching lines...) Expand all Loading... |
| 362 } | 369 } |
| 363 } | 370 } |
| 364 | 371 |
| 365 void OpenSLESOutputStream::HandleError(SLresult error) { | 372 void OpenSLESOutputStream::HandleError(SLresult error) { |
| 366 DLOG(ERROR) << "OpenSLES Output error " << error; | 373 DLOG(ERROR) << "OpenSLES Output error " << error; |
| 367 if (callback_) | 374 if (callback_) |
| 368 callback_->OnError(this); | 375 callback_->OnError(this); |
| 369 } | 376 } |
| 370 | 377 |
| 371 } // namespace media | 378 } // namespace media |
| OLD | NEW |