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