1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <variablespeed.h> 18 19 #include <unistd.h> 20 #include <stdlib.h> 21 22 #include <sola_time_scaler.h> 23 #include <ring_buffer.h> 24 25 #include <hlogging.h> 26 27 #include <vector> 28 29 #include <sys/system_properties.h> 30 31 // **************************************************************************** 32 // Constants, utility methods, structures and other miscellany used throughout 33 // this file. 34 35 namespace { 36 37 // These variables are used to determine the size of the buffer queue used by 38 // the decoder. 39 // This is not the same as the large buffer used to hold the uncompressed data 40 // - for that see the member variable decodeBuffer_. 41 // The choice of 1152 corresponds to the number of samples per mp3 frame, so is 42 // a good choice of size for a decoding buffer in the absence of other 43 // information (we don't know exactly what formats we will be working with). 44 const size_t kNumberOfBuffersInQueue = 4; 45 const size_t kNumberOfSamplesPerBuffer = 1152; 46 const size_t kBufferSizeInBytes = 2 * kNumberOfSamplesPerBuffer; 47 const size_t kSampleSizeInBytes = 4; 48 49 // When calculating play buffer size before pushing to audio player. 50 const size_t kNumberOfBytesPerInt16 = 2; 51 52 // How long to sleep during the main play loop and the decoding callback loop. 53 // In due course this should be replaced with the better signal and wait on 54 // condition rather than busy-looping. 55 const int kSleepTimeMicros = 1000; 56 57 // Used in detecting errors with the OpenSL ES framework. 58 const SLuint32 kPrefetchErrorCandidate = 59 SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE; 60 61 // Structure used when we perform a decoding callback. 62 typedef struct CallbackContext_ { 63 // Pointer to local storage buffers for decoded audio data. 64 int8_t* pDataBase; 65 // Pointer to the current buffer within local storage. 66 int8_t* pData; 67 // Used to read the sample rate and channels from the decoding stream during 68 // the first decoding callback. 69 SLMetadataExtractionItf decoderMetadata; 70 // The play interface used for reading duration. 71 SLPlayItf playItf; 72 } CallbackContext; 73 74 // Local storage for decoded audio data. 75 int8_t pcmData[kNumberOfBuffersInQueue * kBufferSizeInBytes]; 76 77 #define CheckSLResult(message, result) \ 78 CheckSLResult_Real(message, result, __LINE__) 79 80 // Helper function for debugging - checks the OpenSL result for success. 81 void CheckSLResult_Real(const char* message, SLresult result, int line) { 82 // This can be helpful when debugging. 83 // LOGD("sl result %d for %s", result, message); 84 if (SL_RESULT_SUCCESS != result) { 85 LOGE("slresult was %d at %s file variablespeed line %d", 86 static_cast<int>(result), message, line); 87 } 88 CHECK(SL_RESULT_SUCCESS == result); 89 } 90 91 // Whether logging should be enabled. Only used if LOG_OPENSL_API_CALL is 92 // defined to use it. 93 bool gLogEnabled = false; 94 // The property to set in order to enable logging. 95 const char *const kLogTagVariableSpeed = "log.tag.VariableSpeed"; 96 97 bool ShouldLog() { 98 char buffer[PROP_VALUE_MAX]; 99 __system_property_get(kLogTagVariableSpeed, buffer); 100 return strlen(buffer) > 0; 101 } 102 103 } // namespace 104 105 // **************************************************************************** 106 // Static instance of audio engine, and methods for getting, setting and 107 // deleting it. 108 109 // The single global audio engine instance. 110 AudioEngine* AudioEngine::audioEngine_ = NULL; 111 android::Mutex publishEngineLock_; 112 113 AudioEngine* AudioEngine::GetEngine() { 114 android::Mutex::Autolock autoLock(publishEngineLock_); 115 if (audioEngine_ == NULL) { 116 LOGE("you haven't initialized the audio engine"); 117 CHECK(false); 118 return NULL; 119 } 120 return audioEngine_; 121 } 122 123 void AudioEngine::SetEngine(AudioEngine* engine) { 124 if (audioEngine_ != NULL) { 125 LOGE("you have already set the audio engine"); 126 CHECK(false); 127 return; 128 } 129 audioEngine_ = engine; 130 } 131 132 bool AudioEngine::CompareAndSetEngine(AudioEngine* expect, AudioEngine* update) { 133 android::Mutex::Autolock autoLock(publishEngineLock_); 134 if (audioEngine_ == expect) { 135 DeleteEngine(); 136 audioEngine_ = update; 137 return true; 138 } 139 return false; 140 } 141 142 void AudioEngine::DeleteEngine() { 143 if (audioEngine_ != NULL) { 144 delete audioEngine_; 145 audioEngine_ = NULL; 146 } 147 } 148 149 // **************************************************************************** 150 // The callbacks from the engine require static callback functions. 151 // Here are the static functions - they just delegate to instance methods on 152 // the engine. 153 154 static void PlayingBufferQueueCb(SLAndroidSimpleBufferQueueItf, void*) { 155 AudioEngine::GetEngine()->PlayingBufferQueueCallback(); 156 } 157 158 static void PrefetchEventCb(SLPrefetchStatusItf caller, void*, SLuint32 event) { 159 AudioEngine::GetEngine()->PrefetchEventCallback(caller, event); 160 } 161 162 static void DecodingBufferQueueCb(SLAndroidSimpleBufferQueueItf queueItf, 163 void *context) { 164 AudioEngine::GetEngine()->DecodingBufferQueueCallback(queueItf, context); 165 } 166 167 static void DecodingEventCb(SLPlayItf caller, void*, SLuint32 event) { 168 AudioEngine::GetEngine()->DecodingEventCallback(caller, event); 169 } 170 171 // **************************************************************************** 172 // Macros for making working with OpenSL easier. 173 174 // Log based on the value of a property. 175 #define LOG_OPENSL_API_CALL(string) (gLogEnabled && LOGV(string)) 176 177 // The regular macro: log an api call, make the api call, check the result. 178 #define OpenSL(obj, method, ...) \ 179 { \ 180 LOG_OPENSL_API_CALL("OpenSL " #method "(" #obj ", " #__VA_ARGS__ ")"); \ 181 SLresult result = (*obj)->method(obj, __VA_ARGS__); \ 182 CheckSLResult("OpenSL " #method "(" #obj ", " #__VA_ARGS__ ")", result); \ 183 } 184 185 // Special case call for api call that has void return value, can't be checked. 186 #define VoidOpenSL(obj, method) \ 187 { \ 188 LOG_OPENSL_API_CALL("OpenSL (void) " #method "(" #obj ")"); \ 189 (*obj)->method(obj); \ 190 } 191 192 // Special case for api call with checked result but takes no arguments. 193 #define OpenSL0(obj, method) \ 194 { \ 195 LOG_OPENSL_API_CALL("OpenSL " #method "(" #obj ")"); \ 196 SLresult result = (*obj)->method(obj); \ 197 CheckSLResult("OpenSL " #method "(" #obj ")", result); \ 198 } 199 200 // Special case for api call whose result we want to store, not check. 201 // We have to encapsulate the two calls in braces, so that this expression 202 // evaluates to the last expression not the first. 203 #define ReturnOpenSL(obj, method, ...) \ 204 ( \ 205 LOG_OPENSL_API_CALL("OpenSL (int) " \ 206 #method "(" #obj ", " #__VA_ARGS__ ")"), \ 207 (*obj)->method(obj, __VA_ARGS__) \ 208 ) \ 209 210 // **************************************************************************** 211 // Static utility methods. 212 213 // Set the audio stream type for the player. 214 // 215 // Must be called before it is realized. 216 // 217 // The caller must have requested the SL_IID_ANDROIDCONFIGURATION interface when 218 // creating the player. 219 static void setAudioStreamType(SLObjectItf audioPlayer, SLint32 audioStreamType) { 220 SLAndroidConfigurationItf playerConfig; 221 OpenSL(audioPlayer, GetInterface, SL_IID_ANDROIDCONFIGURATION, &playerConfig); 222 // The STREAM_XXX constants defined by android.media.AudioManager match the 223 // corresponding SL_ANDROID_STREAM_XXX constants defined by 224 // include/SLES/OpenSLES_AndroidConfiguration.h, so we can just pass the 225 // value across. 226 OpenSL(playerConfig, SetConfiguration, SL_ANDROID_KEY_STREAM_TYPE, 227 &audioStreamType, sizeof(audioStreamType)); 228 } 229 230 // Must be called with callbackLock_ held. 231 static void ReadSampleRateAndChannelCount(CallbackContext *pContext, 232 SLuint32 *sampleRateOut, SLuint32 *channelsOut) { 233 SLMetadataExtractionItf decoderMetadata = pContext->decoderMetadata; 234 SLuint32 itemCount; 235 OpenSL(decoderMetadata, GetItemCount, &itemCount); 236 SLuint32 i, keySize, valueSize; 237 SLMetadataInfo *keyInfo, *value; 238 for (i = 0; i < itemCount; ++i) { 239 keyInfo = value = NULL; 240 keySize = valueSize = 0; 241 OpenSL(decoderMetadata, GetKeySize, i, &keySize); 242 keyInfo = static_cast<SLMetadataInfo*>(malloc(keySize)); 243 if (keyInfo) { 244 OpenSL(decoderMetadata, GetKey, i, keySize, keyInfo); 245 if (keyInfo->encoding == SL_CHARACTERENCODING_ASCII 246 || keyInfo->encoding == SL_CHARACTERENCODING_UTF8) { 247 OpenSL(decoderMetadata, GetValueSize, i, &valueSize); 248 value = static_cast<SLMetadataInfo*>(malloc(valueSize)); 249 if (value) { 250 OpenSL(decoderMetadata, GetValue, i, valueSize, value); 251 if (strcmp((char*) keyInfo->data, ANDROID_KEY_PCMFORMAT_SAMPLERATE) == 0) { 252 SLuint32 sampleRate = *(reinterpret_cast<SLuint32*>(value->data)); 253 LOGD("sample Rate: %d", sampleRate); 254 *sampleRateOut = sampleRate; 255 } else if (strcmp((char*) keyInfo->data, ANDROID_KEY_PCMFORMAT_NUMCHANNELS) == 0) { 256 SLuint32 channels = *(reinterpret_cast<SLuint32*>(value->data)); 257 LOGD("channels: %d", channels); 258 *channelsOut = channels; 259 } 260 free(value); 261 } 262 } 263 free(keyInfo); 264 } 265 } 266 } 267 268 // Must be called with callbackLock_ held. 269 static void RegisterCallbackContextAndAddEnqueueBuffersToDecoder( 270 SLAndroidSimpleBufferQueueItf decoderQueue, CallbackContext* context) { 271 // Register a callback on the decoder queue, so that we will be called 272 // throughout the decoding process (and can then extract the decoded audio 273 // for the next bit of the pipeline). 274 OpenSL(decoderQueue, RegisterCallback, DecodingBufferQueueCb, context); 275 276 // Enqueue buffers to map the region of memory allocated to store the 277 // decoded data. 278 for (size_t i = 0; i < kNumberOfBuffersInQueue; i++) { 279 OpenSL(decoderQueue, Enqueue, context->pData, kBufferSizeInBytes); 280 context->pData += kBufferSizeInBytes; 281 } 282 context->pData = context->pDataBase; 283 } 284 285 // **************************************************************************** 286 // Constructor and Destructor. 287 288 AudioEngine::AudioEngine(size_t targetFrames, float windowDuration, 289 float windowOverlapDuration, size_t maxPlayBufferCount, float initialRate, 290 size_t decodeInitialSize, size_t decodeMaxSize, size_t startPositionMillis, 291 int audioStreamType) 292 : decodeBuffer_(decodeInitialSize, decodeMaxSize), 293 playingBuffers_(), freeBuffers_(), timeScaler_(NULL), 294 floatBuffer_(NULL), injectBuffer_(NULL), 295 mSampleRate(0), mChannels(0), 296 targetFrames_(targetFrames), 297 windowDuration_(windowDuration), 298 windowOverlapDuration_(windowOverlapDuration), 299 maxPlayBufferCount_(maxPlayBufferCount), initialRate_(initialRate), 300 startPositionMillis_(startPositionMillis), 301 audioStreamType_(audioStreamType), 302 totalDurationMs_(0), decoderCurrentPosition_(0), startRequested_(false), 303 stopRequested_(false), finishedDecoding_(false) { 304 // Determine whether we should log calls. 305 gLogEnabled = ShouldLog(); 306 } 307 308 AudioEngine::~AudioEngine() { 309 // destroy the time scaler 310 if (timeScaler_ != NULL) { 311 delete timeScaler_; 312 timeScaler_ = NULL; 313 } 314 315 // delete all outstanding playing and free buffers 316 android::Mutex::Autolock autoLock(playBufferLock_); 317 while (playingBuffers_.size() > 0) { 318 delete[] playingBuffers_.front(); 319 playingBuffers_.pop(); 320 } 321 while (freeBuffers_.size() > 0) { 322 delete[] freeBuffers_.top(); 323 freeBuffers_.pop(); 324 } 325 326 delete[] floatBuffer_; 327 floatBuffer_ = NULL; 328 delete[] injectBuffer_; 329 injectBuffer_ = NULL; 330 } 331 332 // **************************************************************************** 333 // Regular AudioEngine class methods. 334 335 void AudioEngine::SetVariableSpeed(float speed) { 336 // TODO: Mutex for shared time scaler accesses. 337 if (HasSampleRateAndChannels()) { 338 GetTimeScaler()->set_speed(speed); 339 } else { 340 // This is being called at a point where we have not yet processed enough 341 // data to determine the sample rate and number of channels. 342 // Ignore the call. See http://b/5140693. 343 LOGD("set varaible speed called, sample rate and channels not ready yet"); 344 } 345 } 346 347 void AudioEngine::RequestStart() { 348 android::Mutex::Autolock autoLock(lock_); 349 startRequested_ = true; 350 } 351 352 void AudioEngine::ClearRequestStart() { 353 android::Mutex::Autolock autoLock(lock_); 354 startRequested_ = false; 355 } 356 357 bool AudioEngine::GetWasStartRequested() { 358 android::Mutex::Autolock autoLock(lock_); 359 return startRequested_; 360 } 361 362 void AudioEngine::RequestStop() { 363 android::Mutex::Autolock autoLock(lock_); 364 stopRequested_ = true; 365 } 366 367 int AudioEngine::GetCurrentPosition() { 368 android::Mutex::Autolock autoLock(decodeBufferLock_); 369 double result = decodeBuffer_.GetTotalAdvancedCount(); 370 // TODO: This is horrible, but should be removed soon once the outstanding 371 // issue with get current position on decoder is fixed. 372 android::Mutex::Autolock autoLock2(callbackLock_); 373 return static_cast<int>( 374 (result * 1000) / mSampleRate / mChannels + startPositionMillis_); 375 } 376 377 int AudioEngine::GetTotalDuration() { 378 android::Mutex::Autolock autoLock(lock_); 379 return static_cast<int>(totalDurationMs_); 380 } 381 382 video_editing::SolaTimeScaler* AudioEngine::GetTimeScaler() { 383 if (timeScaler_ == NULL) { 384 CHECK(HasSampleRateAndChannels()); 385 android::Mutex::Autolock autoLock(callbackLock_); 386 timeScaler_ = new video_editing::SolaTimeScaler(); 387 timeScaler_->Init(mSampleRate, mChannels, initialRate_, windowDuration_, 388 windowOverlapDuration_); 389 } 390 return timeScaler_; 391 } 392 393 bool AudioEngine::EnqueueNextBufferOfAudio( 394 SLAndroidSimpleBufferQueueItf audioPlayerQueue) { 395 size_t channels; 396 { 397 android::Mutex::Autolock autoLock(callbackLock_); 398 channels = mChannels; 399 } 400 size_t frameSizeInBytes = kSampleSizeInBytes * channels; 401 size_t frameCount = 0; 402 while (frameCount < targetFrames_) { 403 size_t framesLeft = targetFrames_ - frameCount; 404 // If there is data already in the time scaler, retrieve it. 405 if (GetTimeScaler()->available() > 0) { 406 size_t retrieveCount = min(GetTimeScaler()->available(), framesLeft); 407 int count = GetTimeScaler()->RetrieveSamples( 408 floatBuffer_ + frameCount * channels, retrieveCount); 409 if (count <= 0) { 410 LOGD("error: count was %d", count); 411 break; 412 } 413 frameCount += count; 414 continue; 415 } 416 // If there is no data in the time scaler, then feed some into it. 417 android::Mutex::Autolock autoLock(decodeBufferLock_); 418 size_t framesInDecodeBuffer = 419 decodeBuffer_.GetSizeInBytes() / frameSizeInBytes; 420 size_t framesScalerCanHandle = GetTimeScaler()->input_limit(); 421 size_t framesToInject = min(framesInDecodeBuffer, 422 min(targetFrames_, framesScalerCanHandle)); 423 if (framesToInject <= 0) { 424 // No more frames left to inject. 425 break; 426 } 427 for (size_t i = 0; i < framesToInject * channels; ++i) { 428 injectBuffer_[i] = decodeBuffer_.GetAtIndex(i); 429 } 430 int count = GetTimeScaler()->InjectSamples(injectBuffer_, framesToInject); 431 if (count <= 0) { 432 LOGD("error: count was %d", count); 433 break; 434 } 435 decodeBuffer_.AdvanceHeadPointerShorts(count * channels); 436 } 437 if (frameCount <= 0) { 438 // We must have finished playback. 439 if (GetEndOfDecoderReached()) { 440 // If we've finished decoding, clear the buffer - so we will terminate. 441 ClearDecodeBuffer(); 442 } 443 return false; 444 } 445 446 // Get a free playing buffer. 447 int16* playBuffer; 448 { 449 android::Mutex::Autolock autoLock(playBufferLock_); 450 if (freeBuffers_.size() > 0) { 451 // If we have a free buffer, recycle it. 452 playBuffer = freeBuffers_.top(); 453 freeBuffers_.pop(); 454 } else { 455 // Otherwise allocate a new one. 456 playBuffer = new int16[targetFrames_ * channels]; 457 } 458 } 459 460 // Try to play the buffer. 461 for (size_t i = 0; i < frameCount * channels; ++i) { 462 playBuffer[i] = floatBuffer_[i]; 463 } 464 size_t sizeOfPlayBufferInBytes = 465 frameCount * channels * kNumberOfBytesPerInt16; 466 SLresult result = ReturnOpenSL(audioPlayerQueue, Enqueue, playBuffer, 467 sizeOfPlayBufferInBytes); 468 if (result == SL_RESULT_SUCCESS) { 469 android::Mutex::Autolock autoLock(playBufferLock_); 470 playingBuffers_.push(playBuffer); 471 } else { 472 LOGE("could not enqueue audio buffer"); 473 delete[] playBuffer; 474 } 475 476 return (result == SL_RESULT_SUCCESS); 477 } 478 479 bool AudioEngine::GetEndOfDecoderReached() { 480 android::Mutex::Autolock autoLock(lock_); 481 return finishedDecoding_; 482 } 483 484 void AudioEngine::SetEndOfDecoderReached() { 485 android::Mutex::Autolock autoLock(lock_); 486 finishedDecoding_ = true; 487 } 488 489 bool AudioEngine::PlayFileDescriptor(int fd, int64 offset, int64 length) { 490 SLDataLocator_AndroidFD loc_fd = { 491 SL_DATALOCATOR_ANDROIDFD, fd, offset, length }; 492 SLDataFormat_MIME format_mime = { 493 SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED }; 494 SLDataSource audioSrc = { &loc_fd, &format_mime }; 495 return PlayFromThisSource(audioSrc); 496 } 497 498 bool AudioEngine::PlayUri(const char* uri) { 499 // Source of audio data for the decoding 500 SLDataLocator_URI decUri = { SL_DATALOCATOR_URI, 501 const_cast<SLchar*>(reinterpret_cast<const SLchar*>(uri)) }; 502 SLDataFormat_MIME decMime = { 503 SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED }; 504 SLDataSource decSource = { &decUri, &decMime }; 505 return PlayFromThisSource(decSource); 506 } 507 508 bool AudioEngine::IsDecodeBufferEmpty() { 509 android::Mutex::Autolock autoLock(decodeBufferLock_); 510 return decodeBuffer_.GetSizeInBytes() <= 0; 511 } 512 513 void AudioEngine::ClearDecodeBuffer() { 514 android::Mutex::Autolock autoLock(decodeBufferLock_); 515 decodeBuffer_.Clear(); 516 } 517 518 static size_t ReadDuration(SLPlayItf playItf) { 519 SLmillisecond durationInMsec = SL_TIME_UNKNOWN; 520 OpenSL(playItf, GetDuration, &durationInMsec); 521 if (durationInMsec == SL_TIME_UNKNOWN) { 522 LOGE("can't get duration"); 523 return 0; 524 } 525 LOGD("duration: %d", static_cast<int>(durationInMsec)); 526 return durationInMsec; 527 } 528 529 static size_t ReadPosition(SLPlayItf playItf) { 530 SLmillisecond positionInMsec = SL_TIME_UNKNOWN; 531 OpenSL(playItf, GetPosition, &positionInMsec); 532 if (positionInMsec == SL_TIME_UNKNOWN) { 533 LOGE("can't get position"); 534 return 0; 535 } 536 LOGW("decoder position: %d", static_cast<int>(positionInMsec)); 537 return positionInMsec; 538 } 539 540 static void CreateAndRealizeEngine(SLObjectItf &engine, 541 SLEngineItf &engineInterface) { 542 SLEngineOption EngineOption[] = { { 543 SL_ENGINEOPTION_THREADSAFE, SL_BOOLEAN_TRUE } }; 544 SLresult result = slCreateEngine(&engine, 1, EngineOption, 0, NULL, NULL); 545 CheckSLResult("create engine", result); 546 OpenSL(engine, Realize, SL_BOOLEAN_FALSE); 547 OpenSL(engine, GetInterface, SL_IID_ENGINE, &engineInterface); 548 } 549 550 SLuint32 AudioEngine::GetSLSampleRate() { 551 android::Mutex::Autolock autoLock(callbackLock_); 552 return mSampleRate * 1000; 553 } 554 555 SLuint32 AudioEngine::GetSLChannels() { 556 android::Mutex::Autolock autoLock(callbackLock_); 557 switch (mChannels) { 558 case 2: 559 return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; 560 case 1: 561 return SL_SPEAKER_FRONT_CENTER; 562 default: 563 LOGE("unknown channels %d, using 2", mChannels); 564 return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; 565 } 566 } 567 568 SLuint32 AudioEngine::GetChannelCount() { 569 android::Mutex::Autolock autoLock(callbackLock_); 570 return mChannels; 571 } 572 573 static void CreateAndRealizeAudioPlayer(SLuint32 slSampleRate, 574 SLuint32 channelCount, SLuint32 slChannels, SLint32 audioStreamType, SLObjectItf &outputMix, 575 SLObjectItf &audioPlayer, SLEngineItf &engineInterface) { 576 // Define the source and sink for the audio player: comes from a buffer queue 577 // and goes to the output mix. 578 SLDataLocator_AndroidSimpleBufferQueue loc_bufq = { 579 SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2 }; 580 SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM, channelCount, slSampleRate, 581 SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16, 582 slChannels, SL_BYTEORDER_LITTLEENDIAN}; 583 SLDataSource playingSrc = {&loc_bufq, &format_pcm}; 584 SLDataLocator_OutputMix loc_outmix = {SL_DATALOCATOR_OUTPUTMIX, outputMix}; 585 SLDataSink audioSnk = {&loc_outmix, NULL}; 586 587 // Create the audio player, which will play from the buffer queue and send to 588 // the output mix. 589 const size_t playerInterfaceCount = 2; 590 const SLInterfaceID iids[playerInterfaceCount] = { 591 SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_ANDROIDCONFIGURATION }; 592 const SLboolean reqs[playerInterfaceCount] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; 593 OpenSL(engineInterface, CreateAudioPlayer, &audioPlayer, &playingSrc, 594 &audioSnk, playerInterfaceCount, iids, reqs); 595 setAudioStreamType(audioPlayer, audioStreamType); 596 OpenSL(audioPlayer, Realize, SL_BOOLEAN_FALSE); 597 } 598 599 bool AudioEngine::HasSampleRateAndChannels() { 600 android::Mutex::Autolock autoLock(callbackLock_); 601 return mChannels != 0 && mSampleRate != 0; 602 } 603 604 bool AudioEngine::PlayFromThisSource(const SLDataSource& audioSrc) { 605 ClearDecodeBuffer(); 606 607 SLObjectItf engine; 608 SLEngineItf engineInterface; 609 CreateAndRealizeEngine(engine, engineInterface); 610 611 // Define the source and sink for the decoding player: comes from the source 612 // this method was called with, is sent to another buffer queue. 613 SLDataLocator_AndroidSimpleBufferQueue decBuffQueue; 614 decBuffQueue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE; 615 decBuffQueue.numBuffers = kNumberOfBuffersInQueue; 616 // A valid value seems required here but is currently ignored. 617 SLDataFormat_PCM pcm = {SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_44_1, 618 SL_PCMSAMPLEFORMAT_FIXED_16, 16, 619 SL_SPEAKER_FRONT_LEFT, SL_BYTEORDER_LITTLEENDIAN}; 620 SLDataSink decDest = { &decBuffQueue, &pcm }; 621 622 // Create the decoder with the given source and sink. 623 const size_t decoderInterfaceCount = 5; 624 SLObjectItf decoder; 625 const SLInterfaceID decodePlayerInterfaces[decoderInterfaceCount] = { 626 SL_IID_ANDROIDSIMPLEBUFFERQUEUE, SL_IID_PREFETCHSTATUS, SL_IID_SEEK, 627 SL_IID_METADATAEXTRACTION, SL_IID_ANDROIDCONFIGURATION }; 628 const SLboolean decodePlayerRequired[decoderInterfaceCount] = { 629 SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; 630 SLDataSource sourceCopy(audioSrc); 631 OpenSL(engineInterface, CreateAudioPlayer, &decoder, &sourceCopy, &decDest, 632 decoderInterfaceCount, decodePlayerInterfaces, decodePlayerRequired); 633 // Not sure if this is necessary, but just in case. 634 setAudioStreamType(decoder, audioStreamType_); 635 OpenSL(decoder, Realize, SL_BOOLEAN_FALSE); 636 637 // Get the play interface from the decoder, and register event callbacks. 638 // Get the buffer queue, prefetch and seek interfaces. 639 SLPlayItf decoderPlay = NULL; 640 SLAndroidSimpleBufferQueueItf decoderQueue = NULL; 641 SLPrefetchStatusItf decoderPrefetch = NULL; 642 SLSeekItf decoderSeek = NULL; 643 SLMetadataExtractionItf decoderMetadata = NULL; 644 OpenSL(decoder, GetInterface, SL_IID_PLAY, &decoderPlay); 645 OpenSL(decoderPlay, SetCallbackEventsMask, SL_PLAYEVENT_HEADATEND); 646 OpenSL(decoderPlay, RegisterCallback, DecodingEventCb, NULL); 647 OpenSL(decoder, GetInterface, SL_IID_PREFETCHSTATUS, &decoderPrefetch); 648 OpenSL(decoder, GetInterface, SL_IID_SEEK, &decoderSeek); 649 OpenSL(decoder, GetInterface, SL_IID_METADATAEXTRACTION, &decoderMetadata); 650 OpenSL(decoder, GetInterface, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, 651 &decoderQueue); 652 653 // Initialize the callback structure, used during the decoding. 654 CallbackContext callbackContext; 655 { 656 android::Mutex::Autolock autoLock(callbackLock_); 657 callbackContext.pDataBase = pcmData; 658 callbackContext.pData = pcmData; 659 callbackContext.decoderMetadata = decoderMetadata; 660 callbackContext.playItf = decoderPlay; 661 RegisterCallbackContextAndAddEnqueueBuffersToDecoder( 662 decoderQueue, &callbackContext); 663 } 664 665 // Initialize the callback for prefetch errors, if we can't open the 666 // resource to decode. 667 OpenSL(decoderPrefetch, SetCallbackEventsMask, kPrefetchErrorCandidate); 668 OpenSL(decoderPrefetch, RegisterCallback, PrefetchEventCb, &decoderPrefetch); 669 670 // Seek to the start position. 671 OpenSL(decoderSeek, SetPosition, startPositionMillis_, SL_SEEKMODE_ACCURATE); 672 673 // Start decoding immediately. 674 OpenSL(decoderPlay, SetPlayState, SL_PLAYSTATE_PLAYING); 675 676 // These variables hold the audio player and its output. 677 // They will only be constructed once the decoder has invoked the callback, 678 // and given us the correct sample rate, number of channels and duration. 679 SLObjectItf outputMix = NULL; 680 SLObjectItf audioPlayer = NULL; 681 SLPlayItf audioPlayerPlay = NULL; 682 SLAndroidSimpleBufferQueueItf audioPlayerQueue = NULL; 683 684 // The main loop - until we're told to stop: if there is audio data coming 685 // out of the decoder, feed it through the time scaler. 686 // As it comes out of the time scaler, feed it into the audio player. 687 while (!Finished()) { 688 if (GetWasStartRequested() && HasSampleRateAndChannels()) { 689 // Build the audio player. 690 // TODO: What happens if I maliciously call start lots of times? 691 floatBuffer_ = new float[targetFrames_ * mChannels]; 692 injectBuffer_ = new float[targetFrames_ * mChannels]; 693 OpenSL(engineInterface, CreateOutputMix, &outputMix, 0, NULL, NULL); 694 OpenSL(outputMix, Realize, SL_BOOLEAN_FALSE); 695 CreateAndRealizeAudioPlayer(GetSLSampleRate(), GetChannelCount(), 696 GetSLChannels(), audioStreamType_, outputMix, audioPlayer, 697 engineInterface); 698 OpenSL(audioPlayer, GetInterface, SL_IID_PLAY, &audioPlayerPlay); 699 OpenSL(audioPlayer, GetInterface, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, 700 &audioPlayerQueue); 701 OpenSL(audioPlayerQueue, RegisterCallback, PlayingBufferQueueCb, NULL); 702 ClearRequestStart(); 703 OpenSL(audioPlayerPlay, SetPlayState, SL_PLAYSTATE_PLAYING); 704 } 705 EnqueueMoreAudioIfNecessary(audioPlayerQueue); 706 usleep(kSleepTimeMicros); 707 } 708 709 // Delete the audio player and output mix, iff they have been created. 710 if (audioPlayer != NULL) { 711 OpenSL(audioPlayerPlay, SetPlayState, SL_PLAYSTATE_STOPPED); 712 OpenSL0(audioPlayerQueue, Clear); 713 OpenSL(audioPlayerQueue, RegisterCallback, NULL, NULL); 714 VoidOpenSL(audioPlayer, AbortAsyncOperation); 715 VoidOpenSL(audioPlayer, Destroy); 716 VoidOpenSL(outputMix, Destroy); 717 audioPlayer = NULL; 718 audioPlayerPlay = NULL; 719 audioPlayerQueue = NULL; 720 outputMix = NULL; 721 } 722 723 // Delete the decoder. 724 OpenSL(decoderPlay, SetPlayState, SL_PLAYSTATE_STOPPED); 725 OpenSL(decoderPrefetch, RegisterCallback, NULL, NULL); 726 // This is returning slresult 13 if I do no playback. 727 // Repro is to comment out all before this line, and all after enqueueing 728 // my buffers. 729 // OpenSL0(decoderQueue, Clear); 730 OpenSL(decoderQueue, RegisterCallback, NULL, NULL); 731 decoderSeek = NULL; 732 decoderPrefetch = NULL; 733 decoderQueue = NULL; 734 OpenSL(decoderPlay, RegisterCallback, NULL, NULL); 735 VoidOpenSL(decoder, AbortAsyncOperation); 736 VoidOpenSL(decoder, Destroy); 737 decoderPlay = NULL; 738 739 // Delete the engine. 740 VoidOpenSL(engine, Destroy); 741 engineInterface = NULL; 742 743 return true; 744 } 745 746 bool AudioEngine::Finished() { 747 if (GetWasStopRequested()) { 748 return true; 749 } 750 android::Mutex::Autolock autoLock(playBufferLock_); 751 return playingBuffers_.size() <= 0 && 752 IsDecodeBufferEmpty() && 753 GetEndOfDecoderReached(); 754 } 755 756 bool AudioEngine::GetWasStopRequested() { 757 android::Mutex::Autolock autoLock(lock_); 758 return stopRequested_; 759 } 760 761 bool AudioEngine::GetHasReachedPlayingBuffersLimit() { 762 android::Mutex::Autolock autoLock(playBufferLock_); 763 return playingBuffers_.size() >= maxPlayBufferCount_; 764 } 765 766 void AudioEngine::EnqueueMoreAudioIfNecessary( 767 SLAndroidSimpleBufferQueueItf audioPlayerQueue) { 768 bool keepEnqueueing = true; 769 while (audioPlayerQueue != NULL && 770 !GetWasStopRequested() && 771 !IsDecodeBufferEmpty() && 772 !GetHasReachedPlayingBuffersLimit() && 773 keepEnqueueing) { 774 keepEnqueueing = EnqueueNextBufferOfAudio(audioPlayerQueue); 775 } 776 } 777 778 bool AudioEngine::DecodeBufferTooFull() { 779 android::Mutex::Autolock autoLock(decodeBufferLock_); 780 return decodeBuffer_.IsTooLarge(); 781 } 782 783 // **************************************************************************** 784 // Code for handling the static callbacks. 785 786 void AudioEngine::PlayingBufferQueueCallback() { 787 // The head playing buffer is done, move it to the free list. 788 android::Mutex::Autolock autoLock(playBufferLock_); 789 if (playingBuffers_.size() > 0) { 790 freeBuffers_.push(playingBuffers_.front()); 791 playingBuffers_.pop(); 792 } 793 } 794 795 void AudioEngine::PrefetchEventCallback( 796 SLPrefetchStatusItf caller, SLuint32 event) { 797 // If there was a problem during decoding, then signal the end. 798 SLpermille level = 0; 799 SLuint32 status; 800 OpenSL(caller, GetFillLevel, &level); 801 OpenSL(caller, GetPrefetchStatus, &status); 802 if ((kPrefetchErrorCandidate == (event & kPrefetchErrorCandidate)) && 803 (level == 0) && 804 (status == SL_PREFETCHSTATUS_UNDERFLOW)) { 805 LOGI("prefetcheventcallback error while prefetching data"); 806 SetEndOfDecoderReached(); 807 } 808 if (SL_PREFETCHSTATUS_SUFFICIENTDATA == event) { 809 // android::Mutex::Autolock autoLock(prefetchLock_); 810 // prefetchCondition_.broadcast(); 811 } 812 } 813 814 void AudioEngine::DecodingBufferQueueCallback( 815 SLAndroidSimpleBufferQueueItf queueItf, void *context) { 816 if (GetWasStopRequested()) { 817 return; 818 } 819 820 CallbackContext *pCntxt; 821 { 822 android::Mutex::Autolock autoLock(callbackLock_); 823 pCntxt = reinterpret_cast<CallbackContext*>(context); 824 } 825 { 826 android::Mutex::Autolock autoLock(decodeBufferLock_); 827 decodeBuffer_.AddData(pCntxt->pData, kBufferSizeInBytes); 828 } 829 830 if (!HasSampleRateAndChannels()) { 831 android::Mutex::Autolock autoLock(callbackLock_); 832 ReadSampleRateAndChannelCount(pCntxt, &mSampleRate, &mChannels); 833 } 834 835 { 836 android::Mutex::Autolock autoLock(lock_); 837 if (totalDurationMs_ == 0) { 838 totalDurationMs_ = ReadDuration(pCntxt->playItf); 839 } 840 // TODO: This isn't working, it always reports zero. 841 // ReadPosition(pCntxt->playItf); 842 } 843 844 OpenSL(queueItf, Enqueue, pCntxt->pData, kBufferSizeInBytes); 845 846 // Increase data pointer by buffer size 847 pCntxt->pData += kBufferSizeInBytes; 848 if (pCntxt->pData >= pCntxt->pDataBase + 849 (kNumberOfBuffersInQueue * kBufferSizeInBytes)) { 850 pCntxt->pData = pCntxt->pDataBase; 851 } 852 853 // If we get too much data into the decoder, 854 // sleep until the playback catches up. 855 while (!GetWasStopRequested() && DecodeBufferTooFull()) { 856 usleep(kSleepTimeMicros); 857 } 858 } 859 860 void AudioEngine::DecodingEventCallback(SLPlayItf, SLuint32 event) { 861 if (SL_PLAYEVENT_HEADATEND & event) { 862 SetEndOfDecoderReached(); 863 } 864 } 865