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 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