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/logging.h" | 7 #include "base/logging.h" |
8 #include "media/audio/audio_util.h" | 8 #include "media/audio/audio_util.h" |
9 #include "media/audio/android/audio_manager_android.h" | 9 #include "media/audio/android/audio_manager_android.h" |
10 | 10 |
(...skipping 17 matching lines...) Expand all Loading... |
28 format_.containerSize = params.bits_per_sample(); | 28 format_.containerSize = params.bits_per_sample(); |
29 format_.endianness = SL_BYTEORDER_LITTLEENDIAN; | 29 format_.endianness = SL_BYTEORDER_LITTLEENDIAN; |
30 if (format_.numChannels == 1) | 30 if (format_.numChannels == 1) |
31 format_.channelMask = SL_SPEAKER_FRONT_CENTER; | 31 format_.channelMask = SL_SPEAKER_FRONT_CENTER; |
32 else if (format_.numChannels == 2) | 32 else if (format_.numChannels == 2) |
33 format_.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; | 33 format_.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; |
34 else | 34 else |
35 NOTREACHED() << "Unsupported number of channels: " << format_.numChannels; | 35 NOTREACHED() << "Unsupported number of channels: " << format_.numChannels; |
36 | 36 |
37 buffer_size_bytes_ = params.GetBytesPerBuffer(); | 37 buffer_size_bytes_ = params.GetBytesPerBuffer(); |
| 38 audios_bus_ = AudioBus::Create(params); |
38 | 39 |
39 memset(&audio_data_, 0, sizeof(audio_data_)); | 40 memset(&audio_data_, 0, sizeof(audio_data_)); |
40 } | 41 } |
41 | 42 |
42 OpenSLESOutputStream::~OpenSLESOutputStream() { | 43 OpenSLESOutputStream::~OpenSLESOutputStream() { |
43 DCHECK(!engine_object_.Get()); | 44 DCHECK(!engine_object_.Get()); |
44 DCHECK(!player_object_.Get()); | 45 DCHECK(!player_object_.Get()); |
45 DCHECK(!output_mixer_.Get()); | 46 DCHECK(!output_mixer_.Get()); |
46 DCHECK(!player_); | 47 DCHECK(!player_); |
47 DCHECK(!simple_buffer_queue_); | 48 DCHECK(!simple_buffer_queue_); |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 stream->FillBufferQueue(); | 251 stream->FillBufferQueue(); |
251 } | 252 } |
252 | 253 |
253 void OpenSLESOutputStream::FillBufferQueue() { | 254 void OpenSLESOutputStream::FillBufferQueue() { |
254 if (!started_) | 255 if (!started_) |
255 return; | 256 return; |
256 | 257 |
257 // Read data from the registered client source. | 258 // Read data from the registered client source. |
258 // TODO(xians): Get an accurate delay estimation. | 259 // TODO(xians): Get an accurate delay estimation. |
259 uint32 hardware_delay = buffer_size_bytes_; | 260 uint32 hardware_delay = buffer_size_bytes_; |
260 size_t num_filled_bytes = callback_->OnMoreData( | 261 int frames_filled = callback_->OnMoreData( |
261 audio_data_[active_queue_], | 262 audio_bus_.get(), AudioBuffersState(0, hardware_delay)); |
262 buffer_size_bytes_, | 263 int num_filled_bytes = |
263 AudioBuffersState(0, hardware_delay)); | 264 frames_filled * audio_bus->channels() * format_.bitsPerSample / 8; |
264 DCHECK(num_filled_bytes <= buffer_size_bytes_); | 265 DCHECK_LE(num_filled_bytes, buffer_size_bytes_); |
| 266 audio_bus_->ToInterleaved( |
| 267 frames_filled, format_.bitsPerSample / 8, audio_data_[active_queue_]); |
265 | 268 |
266 // Perform in-place, software-volume adjustments. | 269 // Perform in-place, software-volume adjustments. |
267 media::AdjustVolume(audio_data_[active_queue_], | 270 media::AdjustVolume(audio_data_[active_queue_], |
268 num_filled_bytes, | 271 num_filled_bytes, |
269 format_.numChannels, | 272 format_.numChannels, |
270 format_.containerSize >> 3, | 273 format_.bitsPerSample / 8, |
271 volume_); | 274 volume_); |
272 | 275 |
273 // Enqueue the buffer for playback. | 276 // Enqueue the buffer for playback. |
274 SLresult err = (*simple_buffer_queue_)->Enqueue( | 277 SLresult err = (*simple_buffer_queue_)->Enqueue( |
275 simple_buffer_queue_, | 278 simple_buffer_queue_, |
276 audio_data_[active_queue_], | 279 audio_data_[active_queue_], |
277 num_filled_bytes); | 280 num_filled_bytes); |
278 if (SL_RESULT_SUCCESS != err) | 281 if (SL_RESULT_SUCCESS != err) |
279 HandleError(err); | 282 HandleError(err); |
280 | 283 |
(...skipping 16 matching lines...) Expand all Loading... |
297 } | 300 } |
298 } | 301 } |
299 | 302 |
300 void OpenSLESOutputStream::HandleError(SLresult error) { | 303 void OpenSLESOutputStream::HandleError(SLresult error) { |
301 DLOG(FATAL) << "OpenSLES error " << error; | 304 DLOG(FATAL) << "OpenSLES error " << error; |
302 if (callback_) | 305 if (callback_) |
303 callback_->OnError(this, error); | 306 callback_->OnError(this, error); |
304 } | 307 } |
305 | 308 |
306 } // namespace media | 309 } // namespace media |
OLD | NEW |