Home | History | Annotate | Download | only in android
      1 /*
      2  * Copyright (C) 2010 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 "sles_allinclusive.h"
     18 #include "android_prompts.h"
     19 #include "android/android_AudioToCbRenderer.h"
     20 #include "android/android_StreamPlayer.h"
     21 #include "android/android_LocAVPlayer.h"
     22 #include "android/include/AacBqToPcmCbRenderer.h"
     23 #include "android/channels.h"
     24 
     25 #include <android_runtime/AndroidRuntime.h>
     26 
     27 #include <fcntl.h>
     28 #include <sys/stat.h>
     29 
     30 #include <system/audio.h>
     31 #include <SLES/OpenSLES_Android.h>
     32 
     33 template class android::KeyedVector<SLuint32,
     34                                     android::sp<android::AudioEffect> > ;
     35 
     36 #define KEY_STREAM_TYPE_PARAMSIZE  sizeof(SLint32)
     37 #define KEY_PERFORMANCE_MODE_PARAMSIZE  sizeof(SLint32)
     38 
     39 #define AUDIOTRACK_MIN_PLAYBACKRATE_PERMILLE  500
     40 #define AUDIOTRACK_MAX_PLAYBACKRATE_PERMILLE 2000
     41 
     42 #define MEDIAPLAYER_MIN_PLAYBACKRATE_PERMILLE AUDIOTRACK_MIN_PLAYBACKRATE_PERMILLE
     43 #define MEDIAPLAYER_MAX_PLAYBACKRATE_PERMILLE AUDIOTRACK_MAX_PLAYBACKRATE_PERMILLE
     44 
     45 //-----------------------------------------------------------------------------
     46 // FIXME this method will be absorbed into android_audioPlayer_setPlayState() once
     47 //       bufferqueue and uri/fd playback are moved under the GenericPlayer C++ object
     48 SLresult aplayer_setPlayState(const android::sp<android::GenericPlayer> &ap, SLuint32 playState,
     49         AndroidObjectState* pObjState) {
     50     SLresult result = SL_RESULT_SUCCESS;
     51     AndroidObjectState objState = *pObjState;
     52 
     53     switch (playState) {
     54      case SL_PLAYSTATE_STOPPED:
     55          SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_STOPPED");
     56          ap->stop();
     57          break;
     58      case SL_PLAYSTATE_PAUSED:
     59          SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_PAUSED");
     60          switch (objState) {
     61          case ANDROID_UNINITIALIZED:
     62              *pObjState = ANDROID_PREPARING;
     63              ap->prepare();
     64              break;
     65          case ANDROID_PREPARING:
     66              break;
     67          case ANDROID_READY:
     68              ap->pause();
     69              break;
     70          default:
     71              SL_LOGE(ERROR_PLAYERSETPLAYSTATE_INVALID_OBJECT_STATE_D, playState);
     72              result = SL_RESULT_INTERNAL_ERROR;
     73              break;
     74          }
     75          break;
     76      case SL_PLAYSTATE_PLAYING: {
     77          SL_LOGV("setting GenericPlayer to SL_PLAYSTATE_PLAYING");
     78          switch (objState) {
     79          case ANDROID_UNINITIALIZED:
     80              *pObjState = ANDROID_PREPARING;
     81              ap->prepare();
     82              // intended fall through
     83          case ANDROID_PREPARING:
     84              // intended fall through
     85          case ANDROID_READY:
     86              ap->play();
     87              break;
     88          default:
     89              SL_LOGE(ERROR_PLAYERSETPLAYSTATE_INVALID_OBJECT_STATE_D, playState);
     90              result = SL_RESULT_INTERNAL_ERROR;
     91              break;
     92          }
     93          }
     94          break;
     95      default:
     96          // checked by caller, should not happen
     97          SL_LOGE(ERROR_SHOULDNT_BE_HERE_S, "aplayer_setPlayState");
     98          result = SL_RESULT_INTERNAL_ERROR;
     99          break;
    100      }
    101 
    102     return result;
    103 }
    104 
    105 
    106 //-----------------------------------------------------------------------------
    107 // Callback associated with a AudioToCbRenderer of an SL ES AudioPlayer that gets its data
    108 // from a URI or FD, to write the decoded audio data to a buffer queue
    109 static size_t adecoder_writeToBufferQueue(const uint8_t *data, size_t size, CAudioPlayer* ap) {
    110     if (!android::CallbackProtector::enterCbIfOk(ap->mCallbackProtector)) {
    111         // it is not safe to enter the callback (the player is about to go away)
    112         return 0;
    113     }
    114     size_t sizeConsumed = 0;
    115     SL_LOGD("received %zu bytes from decoder", size);
    116     slBufferQueueCallback callback = NULL;
    117     void * callbackPContext = NULL;
    118 
    119     // push decoded data to the buffer queue
    120     object_lock_exclusive(&ap->mObject);
    121 
    122     if (ap->mBufferQueue.mState.count != 0) {
    123         assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear);
    124 
    125         BufferHeader *oldFront = ap->mBufferQueue.mFront;
    126         BufferHeader *newFront = &oldFront[1];
    127 
    128         uint8_t *pDest = (uint8_t *)oldFront->mBuffer + ap->mBufferQueue.mSizeConsumed;
    129         if (ap->mBufferQueue.mSizeConsumed + size < oldFront->mSize) {
    130             // room to consume the whole or rest of the decoded data in one shot
    131             ap->mBufferQueue.mSizeConsumed += size;
    132             // consume data but no callback to the BufferQueue interface here
    133             memcpy(pDest, data, size);
    134             sizeConsumed = size;
    135         } else {
    136             // push as much as possible of the decoded data into the buffer queue
    137             sizeConsumed = oldFront->mSize - ap->mBufferQueue.mSizeConsumed;
    138 
    139             // the buffer at the head of the buffer queue is full, update the state
    140             ap->mBufferQueue.mSizeConsumed = 0;
    141             if (newFront == &ap->mBufferQueue.mArray[ap->mBufferQueue.mNumBuffers + 1]) {
    142                 newFront = ap->mBufferQueue.mArray;
    143             }
    144             ap->mBufferQueue.mFront = newFront;
    145 
    146             ap->mBufferQueue.mState.count--;
    147             ap->mBufferQueue.mState.playIndex++;
    148             // consume data
    149             memcpy(pDest, data, sizeConsumed);
    150             // data has been copied to the buffer, and the buffer queue state has been updated
    151             // we will notify the client if applicable
    152             callback = ap->mBufferQueue.mCallback;
    153             // save callback data
    154             callbackPContext = ap->mBufferQueue.mContext;
    155         }
    156 
    157     } else {
    158         // no available buffers in the queue to write the decoded data
    159         sizeConsumed = 0;
    160     }
    161 
    162     object_unlock_exclusive(&ap->mObject);
    163     // notify client
    164     if (NULL != callback) {
    165         (*callback)(&ap->mBufferQueue.mItf, callbackPContext);
    166     }
    167 
    168     ap->mCallbackProtector->exitCb();
    169     return sizeConsumed;
    170 }
    171 
    172 
    173 //-----------------------------------------------------------------------------
    174 #define LEFT_CHANNEL_MASK  AUDIO_CHANNEL_OUT_FRONT_LEFT
    175 #define RIGHT_CHANNEL_MASK AUDIO_CHANNEL_OUT_FRONT_RIGHT
    176 
    177 void android_audioPlayer_volumeUpdate(CAudioPlayer* ap)
    178 {
    179     assert(ap != NULL);
    180 
    181     // the source's channel count, where zero means unknown
    182     SLuint8 channelCount = ap->mNumChannels;
    183 
    184     // whether each channel is audible
    185     bool leftAudibilityFactor, rightAudibilityFactor;
    186 
    187     // mute has priority over solo
    188     if (channelCount >= STEREO_CHANNELS) {
    189         if (ap->mMuteMask & LEFT_CHANNEL_MASK) {
    190             // left muted
    191             leftAudibilityFactor = false;
    192         } else {
    193             // left not muted
    194             if (ap->mSoloMask & LEFT_CHANNEL_MASK) {
    195                 // left soloed
    196                 leftAudibilityFactor = true;
    197             } else {
    198                 // left not soloed
    199                 if (ap->mSoloMask & RIGHT_CHANNEL_MASK) {
    200                     // right solo silences left
    201                     leftAudibilityFactor = false;
    202                 } else {
    203                     // left and right are not soloed, and left is not muted
    204                     leftAudibilityFactor = true;
    205                 }
    206             }
    207         }
    208 
    209         if (ap->mMuteMask & RIGHT_CHANNEL_MASK) {
    210             // right muted
    211             rightAudibilityFactor = false;
    212         } else {
    213             // right not muted
    214             if (ap->mSoloMask & RIGHT_CHANNEL_MASK) {
    215                 // right soloed
    216                 rightAudibilityFactor = true;
    217             } else {
    218                 // right not soloed
    219                 if (ap->mSoloMask & LEFT_CHANNEL_MASK) {
    220                     // left solo silences right
    221                     rightAudibilityFactor = false;
    222                 } else {
    223                     // left and right are not soloed, and right is not muted
    224                     rightAudibilityFactor = true;
    225                 }
    226             }
    227         }
    228 
    229     // channel mute and solo are ignored for mono and unknown channel count sources
    230     } else {
    231         leftAudibilityFactor = true;
    232         rightAudibilityFactor = true;
    233     }
    234 
    235     // compute volumes without setting
    236     const bool audibilityFactors[2] = {leftAudibilityFactor, rightAudibilityFactor};
    237     float volumes[2];
    238     android_player_volumeUpdate(volumes, &ap->mVolume, channelCount, ap->mAmplFromDirectLevel,
    239             audibilityFactors);
    240     float leftVol = volumes[0], rightVol = volumes[1];
    241 
    242     // set volume on the underlying media player or audio track
    243     if (ap->mAPlayer != 0) {
    244         ap->mAPlayer->setVolume(leftVol, rightVol);
    245     } else if (ap->mAudioTrack != 0) {
    246         ap->mAudioTrack->setVolume(leftVol, rightVol);
    247     }
    248 
    249     // changes in the AudioPlayer volume must be reflected in the send level:
    250     //  in SLEffectSendItf or in SLAndroidEffectSendItf?
    251     // FIXME replace interface test by an internal API once we have one.
    252     if (NULL != ap->mEffectSend.mItf) {
    253         for (unsigned int i=0 ; i<AUX_MAX ; i++) {
    254             if (ap->mEffectSend.mEnableLevels[i].mEnable) {
    255                 android_fxSend_setSendLevel(ap,
    256                         ap->mEffectSend.mEnableLevels[i].mSendLevel + ap->mVolume.mLevel);
    257                 // there's a single aux bus on Android, so we can stop looking once the first
    258                 // aux effect is found.
    259                 break;
    260             }
    261         }
    262     } else if (NULL != ap->mAndroidEffectSend.mItf) {
    263         android_fxSend_setSendLevel(ap, ap->mAndroidEffectSend.mSendLevel + ap->mVolume.mLevel);
    264     }
    265 }
    266 
    267 // Called by android_audioPlayer_volumeUpdate and android_mediaPlayer_volumeUpdate to compute
    268 // volumes, but setting volumes is handled by the caller.
    269 
    270 void android_player_volumeUpdate(float *pVolumes /*[2]*/, const IVolume *volumeItf, unsigned
    271 channelCount, float amplFromDirectLevel, const bool *audibilityFactors /*[2]*/)
    272 {
    273     assert(pVolumes != NULL);
    274     assert(volumeItf != NULL);
    275     // OK for audibilityFactors to be NULL
    276 
    277     bool leftAudibilityFactor, rightAudibilityFactor;
    278 
    279     // apply player mute factor
    280     // note that AudioTrack has mute() but not MediaPlayer, so it's easier to use volume
    281     // to mute for both rather than calling mute() for AudioTrack
    282 
    283     // player is muted
    284     if (volumeItf->mMute) {
    285         leftAudibilityFactor = false;
    286         rightAudibilityFactor = false;
    287     // player isn't muted, and channel mute/solo audibility factors are available (AudioPlayer)
    288     } else if (audibilityFactors != NULL) {
    289         leftAudibilityFactor = audibilityFactors[0];
    290         rightAudibilityFactor = audibilityFactors[1];
    291     // player isn't muted, and channel mute/solo audibility factors aren't available (MediaPlayer)
    292     } else {
    293         leftAudibilityFactor = true;
    294         rightAudibilityFactor = true;
    295     }
    296 
    297     // compute amplification as the combination of volume level and stereo position
    298     //   amplification (or attenuation) from volume level
    299     float amplFromVolLevel = sles_to_android_amplification(volumeItf->mLevel);
    300     //   amplification from direct level (changed in SLEffectSendtItf and SLAndroidEffectSendItf)
    301     float leftVol  = amplFromVolLevel * amplFromDirectLevel;
    302     float rightVol = leftVol;
    303 
    304     // amplification from stereo position
    305     if (volumeItf->mEnableStereoPosition) {
    306         // Left/right amplification (can be attenuations) factors derived for the StereoPosition
    307         float amplFromStereoPos[STEREO_CHANNELS];
    308         // panning law depends on content channel count: mono to stereo panning vs stereo balance
    309         if (1 == channelCount) {
    310             // mono to stereo panning
    311             double theta = (1000+volumeItf->mStereoPosition)*M_PI_4/1000.0f; // 0 <= theta <= Pi/2
    312             amplFromStereoPos[0] = cos(theta);
    313             amplFromStereoPos[1] = sin(theta);
    314         // channel count is 0 (unknown), 2 (stereo), or > 2 (multi-channel)
    315         } else {
    316             // stereo balance
    317             if (volumeItf->mStereoPosition > 0) {
    318                 amplFromStereoPos[0] = (1000-volumeItf->mStereoPosition)/1000.0f;
    319                 amplFromStereoPos[1] = 1.0f;
    320             } else {
    321                 amplFromStereoPos[0] = 1.0f;
    322                 amplFromStereoPos[1] = (1000+volumeItf->mStereoPosition)/1000.0f;
    323             }
    324         }
    325         leftVol  *= amplFromStereoPos[0];
    326         rightVol *= amplFromStereoPos[1];
    327     }
    328 
    329     // apply audibility factors
    330     if (!leftAudibilityFactor) {
    331         leftVol = 0.0;
    332     }
    333     if (!rightAudibilityFactor) {
    334         rightVol = 0.0;
    335     }
    336 
    337     // return the computed volumes
    338     pVolumes[0] = leftVol;
    339     pVolumes[1] = rightVol;
    340 }
    341 
    342 //-----------------------------------------------------------------------------
    343 void audioTrack_handleMarker_lockPlay(CAudioPlayer* ap) {
    344     //SL_LOGV("received event EVENT_MARKER from AudioTrack");
    345     slPlayCallback callback = NULL;
    346     void* callbackPContext = NULL;
    347 
    348     interface_lock_shared(&ap->mPlay);
    349     callback = ap->mPlay.mCallback;
    350     callbackPContext = ap->mPlay.mContext;
    351     interface_unlock_shared(&ap->mPlay);
    352 
    353     if (NULL != callback) {
    354         // getting this event implies SL_PLAYEVENT_HEADATMARKER was set in the event mask
    355         (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATMARKER);
    356     }
    357 }
    358 
    359 //-----------------------------------------------------------------------------
    360 void audioTrack_handleNewPos_lockPlay(CAudioPlayer* ap) {
    361     //SL_LOGV("received event EVENT_NEW_POS from AudioTrack");
    362     slPlayCallback callback = NULL;
    363     void* callbackPContext = NULL;
    364 
    365     interface_lock_shared(&ap->mPlay);
    366     callback = ap->mPlay.mCallback;
    367     callbackPContext = ap->mPlay.mContext;
    368     interface_unlock_shared(&ap->mPlay);
    369 
    370     if (NULL != callback) {
    371         // getting this event implies SL_PLAYEVENT_HEADATNEWPOS was set in the event mask
    372         (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADATNEWPOS);
    373     }
    374 }
    375 
    376 
    377 //-----------------------------------------------------------------------------
    378 void audioTrack_handleUnderrun_lockPlay(CAudioPlayer* ap) {
    379     slPlayCallback callback = NULL;
    380     void* callbackPContext = NULL;
    381 
    382     interface_lock_shared(&ap->mPlay);
    383     callback = ap->mPlay.mCallback;
    384     callbackPContext = ap->mPlay.mContext;
    385     bool headStalled = (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADSTALLED) != 0;
    386     interface_unlock_shared(&ap->mPlay);
    387 
    388     if ((NULL != callback) && headStalled) {
    389         (*callback)(&ap->mPlay.mItf, callbackPContext, SL_PLAYEVENT_HEADSTALLED);
    390     }
    391 }
    392 
    393 
    394 //-----------------------------------------------------------------------------
    395 /**
    396  * post-condition: play state of AudioPlayer is SL_PLAYSTATE_PAUSED if setPlayStateToPaused is true
    397  *
    398  * note: a conditional flag, setPlayStateToPaused, is used here to specify whether the play state
    399  *       needs to be changed when the player reaches the end of the content to play. This is
    400  *       relative to what the specification describes for buffer queues vs the
    401  *       SL_PLAYEVENT_HEADATEND event. In the OpenSL ES specification 1.0.1:
    402  *        - section 8.12 SLBufferQueueItf states "In the case of starvation due to insufficient
    403  *          buffers in the queue, the playing of audio data stops. The player remains in the
    404  *          SL_PLAYSTATE_PLAYING state."
    405  *        - section 9.2.31 SL_PLAYEVENT states "SL_PLAYEVENT_HEADATEND Playback head is at the end
    406  *          of the current content and the player has paused."
    407  */
    408 void audioPlayer_dispatch_headAtEnd_lockPlay(CAudioPlayer *ap, bool setPlayStateToPaused,
    409         bool needToLock) {
    410     //SL_LOGV("ap=%p, setPlayStateToPaused=%d, needToLock=%d", ap, setPlayStateToPaused,
    411     //        needToLock);
    412     slPlayCallback playCallback = NULL;
    413     void * playContext = NULL;
    414     // SLPlayItf callback or no callback?
    415     if (needToLock) {
    416         interface_lock_exclusive(&ap->mPlay);
    417     }
    418     if (ap->mPlay.mEventFlags & SL_PLAYEVENT_HEADATEND) {
    419         playCallback = ap->mPlay.mCallback;
    420         playContext = ap->mPlay.mContext;
    421     }
    422     if (setPlayStateToPaused) {
    423         ap->mPlay.mState = SL_PLAYSTATE_PAUSED;
    424     }
    425     if (needToLock) {
    426         interface_unlock_exclusive(&ap->mPlay);
    427     }
    428     // enqueue callback with no lock held
    429     if (NULL != playCallback) {
    430 #ifndef USE_ASYNCHRONOUS_PLAY_CALLBACK
    431         (*playCallback)(&ap->mPlay.mItf, playContext, SL_PLAYEVENT_HEADATEND);
    432 #else
    433         SLresult result = EnqueueAsyncCallback_ppi(ap, playCallback, &ap->mPlay.mItf, playContext,
    434                 SL_PLAYEVENT_HEADATEND);
    435         if (SL_RESULT_SUCCESS != result) {
    436             ALOGW("Callback %p(%p, %p, SL_PLAYEVENT_HEADATEND) dropped", playCallback,
    437                     &ap->mPlay.mItf, playContext);
    438         }
    439 #endif
    440     }
    441 
    442 }
    443 
    444 
    445 //-----------------------------------------------------------------------------
    446 SLresult audioPlayer_setStreamType(CAudioPlayer* ap, SLint32 type) {
    447     SLresult result = SL_RESULT_SUCCESS;
    448     SL_LOGV("type %d", type);
    449 
    450     audio_stream_type_t newStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
    451     switch (type) {
    452     case SL_ANDROID_STREAM_VOICE:
    453         newStreamType = AUDIO_STREAM_VOICE_CALL;
    454         break;
    455     case SL_ANDROID_STREAM_SYSTEM:
    456         newStreamType = AUDIO_STREAM_SYSTEM;
    457         break;
    458     case SL_ANDROID_STREAM_RING:
    459         newStreamType = AUDIO_STREAM_RING;
    460         break;
    461     case SL_ANDROID_STREAM_MEDIA:
    462         newStreamType = AUDIO_STREAM_MUSIC;
    463         break;
    464     case SL_ANDROID_STREAM_ALARM:
    465         newStreamType = AUDIO_STREAM_ALARM;
    466         break;
    467     case SL_ANDROID_STREAM_NOTIFICATION:
    468         newStreamType = AUDIO_STREAM_NOTIFICATION;
    469         break;
    470     default:
    471         SL_LOGE(ERROR_PLAYERSTREAMTYPE_SET_UNKNOWN_TYPE);
    472         result = SL_RESULT_PARAMETER_INVALID;
    473         break;
    474     }
    475 
    476     // stream type needs to be set before the object is realized
    477     // (ap->mAudioTrack is supposed to be NULL until then)
    478     if (SL_OBJECT_STATE_UNREALIZED != ap->mObject.mState) {
    479         SL_LOGE(ERROR_PLAYERSTREAMTYPE_REALIZED);
    480         result = SL_RESULT_PRECONDITIONS_VIOLATED;
    481     } else {
    482         ap->mStreamType = newStreamType;
    483     }
    484 
    485     return result;
    486 }
    487 
    488 //-----------------------------------------------------------------------------
    489 SLresult audioPlayer_setPerformanceMode(CAudioPlayer* ap, SLuint32 mode) {
    490     SLresult result = SL_RESULT_SUCCESS;
    491     SL_LOGV("performance mode set to %d", mode);
    492 
    493     SLuint32 perfMode = ANDROID_PERFORMANCE_MODE_DEFAULT;
    494     switch (mode) {
    495     case SL_ANDROID_PERFORMANCE_LATENCY:
    496         perfMode = ANDROID_PERFORMANCE_MODE_LATENCY;
    497         break;
    498     case SL_ANDROID_PERFORMANCE_LATENCY_EFFECTS:
    499         perfMode = ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS;
    500         break;
    501     case SL_ANDROID_PERFORMANCE_NONE:
    502         perfMode = ANDROID_PERFORMANCE_MODE_NONE;
    503         break;
    504     case SL_ANDROID_PERFORMANCE_POWER_SAVING:
    505         perfMode = ANDROID_PERFORMANCE_MODE_POWER_SAVING;
    506         break;
    507     default:
    508         SL_LOGE(ERROR_CONFIG_PERF_MODE_UNKNOWN);
    509         result = SL_RESULT_PARAMETER_INVALID;
    510         break;
    511     }
    512 
    513     // performance mode needs to be set before the object is realized
    514     // (ap->mAudioTrack is supposed to be NULL until then)
    515     if (SL_OBJECT_STATE_UNREALIZED != ap->mObject.mState) {
    516         SL_LOGE(ERROR_CONFIG_PERF_MODE_REALIZED);
    517         result = SL_RESULT_PRECONDITIONS_VIOLATED;
    518     } else {
    519         ap->mPerformanceMode = perfMode;
    520     }
    521 
    522     return result;
    523 }
    524 
    525 //-----------------------------------------------------------------------------
    526 SLresult audioPlayer_getStreamType(CAudioPlayer* ap, SLint32 *pType) {
    527     SLresult result = SL_RESULT_SUCCESS;
    528 
    529     switch (ap->mStreamType) {
    530     case AUDIO_STREAM_VOICE_CALL:
    531         *pType = SL_ANDROID_STREAM_VOICE;
    532         break;
    533     case AUDIO_STREAM_SYSTEM:
    534         *pType = SL_ANDROID_STREAM_SYSTEM;
    535         break;
    536     case AUDIO_STREAM_RING:
    537         *pType = SL_ANDROID_STREAM_RING;
    538         break;
    539     case AUDIO_STREAM_DEFAULT:
    540     case AUDIO_STREAM_MUSIC:
    541         *pType = SL_ANDROID_STREAM_MEDIA;
    542         break;
    543     case AUDIO_STREAM_ALARM:
    544         *pType = SL_ANDROID_STREAM_ALARM;
    545         break;
    546     case AUDIO_STREAM_NOTIFICATION:
    547         *pType = SL_ANDROID_STREAM_NOTIFICATION;
    548         break;
    549     default:
    550         result = SL_RESULT_INTERNAL_ERROR;
    551         *pType = SL_ANDROID_STREAM_MEDIA;
    552         break;
    553     }
    554 
    555     return result;
    556 }
    557 
    558 //-----------------------------------------------------------------------------
    559 SLresult audioPlayer_getPerformanceMode(CAudioPlayer* ap, SLuint32 *pMode) {
    560     SLresult result = SL_RESULT_SUCCESS;
    561 
    562     switch (ap->mPerformanceMode) {
    563     case ANDROID_PERFORMANCE_MODE_LATENCY:
    564         *pMode = SL_ANDROID_PERFORMANCE_LATENCY;
    565         break;
    566     case ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS:
    567         *pMode = SL_ANDROID_PERFORMANCE_LATENCY_EFFECTS;
    568         break;
    569     case ANDROID_PERFORMANCE_MODE_NONE:
    570         *pMode = SL_ANDROID_PERFORMANCE_NONE;
    571         break;
    572     case ANDROID_PERFORMANCE_MODE_POWER_SAVING:
    573         *pMode = SL_ANDROID_PERFORMANCE_POWER_SAVING;
    574         break;
    575     default:
    576         result = SL_RESULT_INTERNAL_ERROR;
    577         *pMode = SL_ANDROID_PERFORMANCE_LATENCY;
    578         break;
    579     }
    580 
    581     return result;
    582 }
    583 
    584 //-----------------------------------------------------------------------------
    585 void audioPlayer_auxEffectUpdate(CAudioPlayer* ap) {
    586     if ((ap->mAudioTrack != 0) && (ap->mAuxEffect != 0)) {
    587         android_fxSend_attach(ap, true, ap->mAuxEffect, ap->mVolume.mLevel + ap->mAuxSendLevel);
    588     }
    589 }
    590 
    591 
    592 //-----------------------------------------------------------------------------
    593 /*
    594  * returns true if the given data sink is supported by AudioPlayer that doesn't
    595  *   play to an OutputMix object, false otherwise
    596  *
    597  * pre-condition: the locator of the audio sink is not SL_DATALOCATOR_OUTPUTMIX
    598  */
    599 bool audioPlayer_isSupportedNonOutputMixSink(const SLDataSink* pAudioSink) {
    600     bool result = true;
    601     const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSink->pLocator;
    602     const SLuint32 sinkFormatType = *(SLuint32 *)pAudioSink->pFormat;
    603 
    604     switch (sinkLocatorType) {
    605 
    606     case SL_DATALOCATOR_BUFFERQUEUE:
    607     case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
    608         if (SL_DATAFORMAT_PCM != sinkFormatType) {
    609             SL_LOGE("Unsupported sink format 0x%x, expected SL_DATAFORMAT_PCM",
    610                     (unsigned)sinkFormatType);
    611             result = false;
    612         }
    613         // it's no use checking the PCM format fields because additional characteristics
    614         // such as the number of channels, or sample size are unknown to the player at this stage
    615         break;
    616 
    617     default:
    618         SL_LOGE("Unsupported sink locator type 0x%x", (unsigned)sinkLocatorType);
    619         result = false;
    620         break;
    621     }
    622 
    623     return result;
    624 }
    625 
    626 
    627 //-----------------------------------------------------------------------------
    628 /*
    629  * returns the Android object type if the locator type combinations for the source and sinks
    630  *   are supported by this implementation, INVALID_TYPE otherwise
    631  */
    632 static
    633 AndroidObjectType audioPlayer_getAndroidObjectTypeForSourceSink(const CAudioPlayer *ap) {
    634 
    635     const SLDataSource *pAudioSrc = &ap->mDataSource.u.mSource;
    636     const SLDataSink *pAudioSnk = &ap->mDataSink.u.mSink;
    637     const SLuint32 sourceLocatorType = *(SLuint32 *)pAudioSrc->pLocator;
    638     const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator;
    639     AndroidObjectType type = INVALID_TYPE;
    640 
    641     //--------------------------------------
    642     // Sink / source matching check:
    643     // the following source / sink combinations are supported
    644     //     SL_DATALOCATOR_BUFFERQUEUE                / SL_DATALOCATOR_OUTPUTMIX
    645     //     SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE   / SL_DATALOCATOR_OUTPUTMIX
    646     //     SL_DATALOCATOR_URI                        / SL_DATALOCATOR_OUTPUTMIX
    647     //     SL_DATALOCATOR_ANDROIDFD                  / SL_DATALOCATOR_OUTPUTMIX
    648     //     SL_DATALOCATOR_ANDROIDBUFFERQUEUE         / SL_DATALOCATOR_OUTPUTMIX
    649     //     SL_DATALOCATOR_ANDROIDBUFFERQUEUE         / SL_DATALOCATOR_BUFFERQUEUE
    650     //     SL_DATALOCATOR_URI                        / SL_DATALOCATOR_BUFFERQUEUE
    651     //     SL_DATALOCATOR_ANDROIDFD                  / SL_DATALOCATOR_BUFFERQUEUE
    652     //     SL_DATALOCATOR_URI                        / SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
    653     //     SL_DATALOCATOR_ANDROIDFD                  / SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
    654     switch (sinkLocatorType) {
    655 
    656     case SL_DATALOCATOR_OUTPUTMIX: {
    657         switch (sourceLocatorType) {
    658 
    659         //   Buffer Queue to AudioTrack
    660         case SL_DATALOCATOR_BUFFERQUEUE:
    661         case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
    662             type = AUDIOPLAYER_FROM_PCM_BUFFERQUEUE;
    663             break;
    664 
    665         //   URI or FD to MediaPlayer
    666         case SL_DATALOCATOR_URI:
    667         case SL_DATALOCATOR_ANDROIDFD:
    668             type = AUDIOPLAYER_FROM_URIFD;
    669             break;
    670 
    671         //   Android BufferQueue to MediaPlayer (shared memory streaming)
    672         case SL_DATALOCATOR_ANDROIDBUFFERQUEUE:
    673             type = AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE;
    674             break;
    675 
    676         default:
    677             SL_LOGE("Source data locator 0x%x not supported with SL_DATALOCATOR_OUTPUTMIX sink",
    678                     (unsigned)sourceLocatorType);
    679             break;
    680         }
    681         }
    682         break;
    683 
    684     case SL_DATALOCATOR_BUFFERQUEUE:
    685     case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
    686         switch (sourceLocatorType) {
    687 
    688         //   URI or FD decoded to PCM in a buffer queue
    689         case SL_DATALOCATOR_URI:
    690         case SL_DATALOCATOR_ANDROIDFD:
    691             type = AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE;
    692             break;
    693 
    694         //   AAC ADTS Android buffer queue decoded to PCM in a buffer queue
    695         case SL_DATALOCATOR_ANDROIDBUFFERQUEUE:
    696             type = AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE;
    697             break;
    698 
    699         default:
    700             SL_LOGE("Source data locator 0x%x not supported with SL_DATALOCATOR_BUFFERQUEUE sink",
    701                     (unsigned)sourceLocatorType);
    702             break;
    703         }
    704         break;
    705 
    706     default:
    707         SL_LOGE("Sink data locator 0x%x not supported", (unsigned)sinkLocatorType);
    708         break;
    709     }
    710 
    711     return type;
    712 }
    713 
    714 
    715 //-----------------------------------------------------------------------------
    716 /*
    717  * Callback associated with an SfPlayer of an SL ES AudioPlayer that gets its data
    718  * from a URI or FD, for prepare, prefetch, and play events
    719  */
    720 static void sfplayer_handlePrefetchEvent(int event, int data1, int data2, void* user) {
    721 
    722     // FIXME see similar code and comment in player_handleMediaPlayerEventNotifications
    723 
    724     if (NULL == user) {
    725         return;
    726     }
    727 
    728     CAudioPlayer *ap = (CAudioPlayer *)user;
    729     if (!android::CallbackProtector::enterCbIfOk(ap->mCallbackProtector)) {
    730         // it is not safe to enter the callback (the track is about to go away)
    731         return;
    732     }
    733     union {
    734         char c[sizeof(int)];
    735         int i;
    736     } u;
    737     u.i = event;
    738     SL_LOGV("sfplayer_handlePrefetchEvent(event='%c%c%c%c' (%d), data1=%d, data2=%d, user=%p) from "
    739             "SfAudioPlayer", u.c[3], u.c[2], u.c[1], u.c[0], event, data1, data2, user);
    740     switch (event) {
    741 
    742     case android::GenericPlayer::kEventPrepared: {
    743         SL_LOGV("Received GenericPlayer::kEventPrepared for CAudioPlayer %p", ap);
    744 
    745         // assume no callback
    746         slPrefetchCallback callback = NULL;
    747         void* callbackPContext;
    748         SLuint32 events;
    749 
    750         object_lock_exclusive(&ap->mObject);
    751 
    752         // mark object as prepared; same state is used for successful or unsuccessful prepare
    753         assert(ap->mAndroidObjState == ANDROID_PREPARING);
    754         ap->mAndroidObjState = ANDROID_READY;
    755 
    756         if (PLAYER_SUCCESS == data1) {
    757             // Most of successful prepare completion for ap->mAPlayer
    758             // is handled by GenericPlayer and its subclasses.
    759         } else {
    760             // SfPlayer prepare() failed prefetching, there is no event in SLPrefetchStatus to
    761             //  indicate a prefetch error, so we signal it by sending simultaneously two events:
    762             //  - SL_PREFETCHEVENT_FILLLEVELCHANGE with a level of 0
    763             //  - SL_PREFETCHEVENT_STATUSCHANGE with a status of SL_PREFETCHSTATUS_UNDERFLOW
    764             SL_LOGE(ERROR_PLAYER_PREFETCH_d, data1);
    765             if (IsInterfaceInitialized(&ap->mObject, MPH_PREFETCHSTATUS)) {
    766                 ap->mPrefetchStatus.mLevel = 0;
    767                 ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
    768                 if (!(~ap->mPrefetchStatus.mCallbackEventsMask &
    769                         (SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE))) {
    770                     callback = ap->mPrefetchStatus.mCallback;
    771                     callbackPContext = ap->mPrefetchStatus.mContext;
    772                     events = SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE;
    773                 }
    774             }
    775         }
    776 
    777         object_unlock_exclusive(&ap->mObject);
    778 
    779         // callback with no lock held
    780         if (NULL != callback) {
    781             (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, events);
    782         }
    783 
    784     }
    785     break;
    786 
    787     case android::GenericPlayer::kEventPrefetchFillLevelUpdate : {
    788         if (!IsInterfaceInitialized(&ap->mObject, MPH_PREFETCHSTATUS)) {
    789             break;
    790         }
    791         slPrefetchCallback callback = NULL;
    792         void* callbackPContext = NULL;
    793 
    794         // SLPrefetchStatusItf callback or no callback?
    795         interface_lock_exclusive(&ap->mPrefetchStatus);
    796         if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_FILLLEVELCHANGE) {
    797             callback = ap->mPrefetchStatus.mCallback;
    798             callbackPContext = ap->mPrefetchStatus.mContext;
    799         }
    800         ap->mPrefetchStatus.mLevel = (SLpermille)data1;
    801         interface_unlock_exclusive(&ap->mPrefetchStatus);
    802 
    803         // callback with no lock held
    804         if (NULL != callback) {
    805             (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext,
    806                     SL_PREFETCHEVENT_FILLLEVELCHANGE);
    807         }
    808     }
    809     break;
    810 
    811     case android::GenericPlayer::kEventPrefetchStatusChange: {
    812         if (!IsInterfaceInitialized(&ap->mObject, MPH_PREFETCHSTATUS)) {
    813             break;
    814         }
    815         slPrefetchCallback callback = NULL;
    816         void* callbackPContext = NULL;
    817 
    818         // SLPrefetchStatusItf callback or no callback?
    819         object_lock_exclusive(&ap->mObject);
    820         if (ap->mPrefetchStatus.mCallbackEventsMask & SL_PREFETCHEVENT_STATUSCHANGE) {
    821             callback = ap->mPrefetchStatus.mCallback;
    822             callbackPContext = ap->mPrefetchStatus.mContext;
    823         }
    824         if (data1 >= android::kStatusIntermediate) {
    825             ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_SUFFICIENTDATA;
    826         } else if (data1 < android::kStatusIntermediate) {
    827             ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
    828         }
    829         object_unlock_exclusive(&ap->mObject);
    830 
    831         // callback with no lock held
    832         if (NULL != callback) {
    833             (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext, SL_PREFETCHEVENT_STATUSCHANGE);
    834         }
    835         }
    836         break;
    837 
    838     case android::GenericPlayer::kEventEndOfStream: {
    839         audioPlayer_dispatch_headAtEnd_lockPlay(ap, true /*set state to paused?*/, true);
    840         if ((ap->mAudioTrack != 0) && (!ap->mSeek.mLoopEnabled)) {
    841             ap->mAudioTrack->stop();
    842         }
    843         }
    844         break;
    845 
    846     case android::GenericPlayer::kEventChannelCount: {
    847         object_lock_exclusive(&ap->mObject);
    848         if (UNKNOWN_NUMCHANNELS == ap->mNumChannels && UNKNOWN_NUMCHANNELS != data1) {
    849             ap->mNumChannels = data1;
    850             android_audioPlayer_volumeUpdate(ap);
    851         }
    852         object_unlock_exclusive(&ap->mObject);
    853         }
    854         break;
    855 
    856     case android::GenericPlayer::kEventPlay: {
    857         slPlayCallback callback = NULL;
    858         void* callbackPContext = NULL;
    859 
    860         interface_lock_shared(&ap->mPlay);
    861         callback = ap->mPlay.mCallback;
    862         callbackPContext = ap->mPlay.mContext;
    863         interface_unlock_shared(&ap->mPlay);
    864 
    865         if (NULL != callback) {
    866             SLuint32 event = (SLuint32) data1;  // SL_PLAYEVENT_HEAD*
    867 #ifndef USE_ASYNCHRONOUS_PLAY_CALLBACK
    868             // synchronous callback requires a synchronous GetPosition implementation
    869             (*callback)(&ap->mPlay.mItf, callbackPContext, event);
    870 #else
    871             // asynchronous callback works with any GetPosition implementation
    872             SLresult result = EnqueueAsyncCallback_ppi(ap, callback, &ap->mPlay.mItf,
    873                     callbackPContext, event);
    874             if (SL_RESULT_SUCCESS != result) {
    875                 ALOGW("Callback %p(%p, %p, 0x%x) dropped", callback,
    876                         &ap->mPlay.mItf, callbackPContext, event);
    877             }
    878 #endif
    879         }
    880         }
    881         break;
    882 
    883       case android::GenericPlayer::kEventErrorAfterPrepare: {
    884         SL_LOGV("kEventErrorAfterPrepare");
    885 
    886         // assume no callback
    887         slPrefetchCallback callback = NULL;
    888         void* callbackPContext = NULL;
    889 
    890         object_lock_exclusive(&ap->mObject);
    891         if (IsInterfaceInitialized(&ap->mObject, MPH_PREFETCHSTATUS)) {
    892             ap->mPrefetchStatus.mLevel = 0;
    893             ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
    894             if (!(~ap->mPrefetchStatus.mCallbackEventsMask &
    895                     (SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE))) {
    896                 callback = ap->mPrefetchStatus.mCallback;
    897                 callbackPContext = ap->mPrefetchStatus.mContext;
    898             }
    899         }
    900         object_unlock_exclusive(&ap->mObject);
    901 
    902         // FIXME there's interesting information in data1, but no API to convey it to client
    903         SL_LOGE("Error after prepare: %d", data1);
    904 
    905         // callback with no lock held
    906         if (NULL != callback) {
    907             (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext,
    908                     SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE);
    909         }
    910 
    911       }
    912       break;
    913 
    914     case android::GenericPlayer::kEventHasVideoSize:
    915         //SL_LOGW("Unexpected kEventHasVideoSize");
    916         break;
    917 
    918     default:
    919         break;
    920     }
    921 
    922     ap->mCallbackProtector->exitCb();
    923 }
    924 
    925 // From EffectDownmix.h
    926 static
    927 const uint32_t kSides = AUDIO_CHANNEL_OUT_SIDE_LEFT | AUDIO_CHANNEL_OUT_SIDE_RIGHT;
    928 static
    929 const uint32_t kBacks = AUDIO_CHANNEL_OUT_BACK_LEFT | AUDIO_CHANNEL_OUT_BACK_RIGHT;
    930 static
    931 const uint32_t kUnsupported =
    932         AUDIO_CHANNEL_OUT_FRONT_LEFT_OF_CENTER | AUDIO_CHANNEL_OUT_FRONT_RIGHT_OF_CENTER |
    933         AUDIO_CHANNEL_OUT_TOP_CENTER |
    934         AUDIO_CHANNEL_OUT_TOP_FRONT_LEFT |
    935         AUDIO_CHANNEL_OUT_TOP_FRONT_CENTER |
    936         AUDIO_CHANNEL_OUT_TOP_FRONT_RIGHT |
    937         AUDIO_CHANNEL_OUT_TOP_BACK_LEFT |
    938         AUDIO_CHANNEL_OUT_TOP_BACK_CENTER |
    939         AUDIO_CHANNEL_OUT_TOP_BACK_RIGHT;
    940 
    941 static
    942 SLresult android_audioPlayer_validateChannelMask(uint32_t mask, uint32_t numChans) {
    943     // Check that the number of channels falls within bounds.
    944     if (numChans == 0 || numChans > FCC_8) {
    945         SL_LOGE("Number of channels %u must be between one and %u inclusive", numChans, FCC_8);
    946         return SL_RESULT_CONTENT_UNSUPPORTED;
    947     }
    948     // Are there the right number of channels in the mask?
    949     if (sles_channel_count_from_mask(mask) != numChans) {
    950         SL_LOGE("Channel mask %#x does not match channel count %u", mask, numChans);
    951         return SL_RESULT_CONTENT_UNSUPPORTED;
    952     }
    953 
    954     audio_channel_representation_t representation =
    955             sles_to_audio_channel_mask_representation(mask);
    956 
    957     if (representation == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
    958         return SL_RESULT_SUCCESS;
    959     }
    960 
    961     // If audio is positional we need to run a set of checks to make sure
    962     // the positions can be handled by our HDMI-compliant downmixer. Compare with
    963     // android.media.AudioTrack.isMultichannelConfigSupported
    964     // and Downmix_foldGeneric (in libeffects).
    965     if (representation == AUDIO_CHANNEL_REPRESENTATION_POSITION) {
    966         // check against unsupported channels
    967         if (mask & kUnsupported) {
    968             SL_LOGE("Mask %#x is invalid: Unsupported channels (top or front left/right of center)",
    969                     mask);
    970             return SL_RESULT_CONTENT_UNSUPPORTED;
    971         }
    972         // verify that mask has FL/FR if more than one channel specified
    973         if (numChans > 1 && (mask & AUDIO_CHANNEL_OUT_STEREO) != AUDIO_CHANNEL_OUT_STEREO) {
    974             SL_LOGE("Mask %#x is invalid: Front channels must be present", mask);
    975             return SL_RESULT_CONTENT_UNSUPPORTED;
    976         }
    977         // verify that SIDE is used as a pair (ok if not using SIDE at all)
    978         if ((mask & kSides) != 0 && (mask & kSides) != kSides) {
    979                 SL_LOGE("Mask %#x is invalid: Side channels must be used as a pair", mask);
    980                 return SL_RESULT_CONTENT_UNSUPPORTED;
    981         }
    982         // verify that BACK is used as a pair (ok if not using BACK at all)
    983         if ((mask & kBacks) != 0 && (mask & kBacks) != kBacks) {
    984             SL_LOGE("Mask %#x is invalid: Back channels must be used as a pair", mask);
    985             return SL_RESULT_CONTENT_UNSUPPORTED;
    986         }
    987         return SL_RESULT_SUCCESS;
    988     }
    989 
    990     SL_LOGE("Unrecognized channel mask representation %#x", representation);
    991     return SL_RESULT_CONTENT_UNSUPPORTED;
    992 }
    993 
    994 //-----------------------------------------------------------------------------
    995 SLresult android_audioPlayer_checkSourceSink(CAudioPlayer *pAudioPlayer)
    996 {
    997     // verify that the locator types for the source / sink combination is supported
    998     pAudioPlayer->mAndroidObjType = audioPlayer_getAndroidObjectTypeForSourceSink(pAudioPlayer);
    999     if (INVALID_TYPE == pAudioPlayer->mAndroidObjType) {
   1000         return SL_RESULT_PARAMETER_INVALID;
   1001     }
   1002 
   1003     const SLDataSource *pAudioSrc = &pAudioPlayer->mDataSource.u.mSource;
   1004     const SLDataSink *pAudioSnk = &pAudioPlayer->mDataSink.u.mSink;
   1005 
   1006     // format check:
   1007     const SLuint32 sourceLocatorType = *(SLuint32 *)pAudioSrc->pLocator;
   1008     const SLuint32 sinkLocatorType = *(SLuint32 *)pAudioSnk->pLocator;
   1009     const SLuint32 sourceFormatType = *(SLuint32 *)pAudioSrc->pFormat;
   1010 
   1011     const SLuint32 *df_representation = NULL; // pointer to representation field, if it exists
   1012 
   1013     switch (sourceLocatorType) {
   1014     //------------------
   1015     //   Buffer Queues
   1016     case SL_DATALOCATOR_BUFFERQUEUE:
   1017     case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
   1018         {
   1019         // Buffer format
   1020         switch (sourceFormatType) {
   1021         //     currently only PCM buffer queues are supported,
   1022         case SL_ANDROID_DATAFORMAT_PCM_EX: {
   1023             const SLAndroidDataFormat_PCM_EX *df_pcm =
   1024                     (const SLAndroidDataFormat_PCM_EX *) pAudioSrc->pFormat;
   1025             // checkDataFormat() already checked representation
   1026             df_representation = &df_pcm->representation;
   1027             } // SL_ANDROID_DATAFORMAT_PCM_EX - fall through to next test.
   1028         case SL_DATAFORMAT_PCM: {
   1029             // checkDataFormat() already did generic checks, now do the Android-specific checks
   1030             const SLDataFormat_PCM *df_pcm = (const SLDataFormat_PCM *) pAudioSrc->pFormat;
   1031             SLresult result = android_audioPlayer_validateChannelMask(df_pcm->channelMask,
   1032                                                                       df_pcm->numChannels);
   1033             if (result != SL_RESULT_SUCCESS) {
   1034                 SL_LOGE("Cannot create audio player: unsupported PCM data source with %u channels",
   1035                         (unsigned) df_pcm->numChannels);
   1036                 return result;
   1037             }
   1038 
   1039             // checkDataFormat() already checked sample rate
   1040 
   1041             // checkDataFormat() already checked bits per sample, container size, and representation
   1042 
   1043             // FIXME confirm the following
   1044             // df_pcm->channelMask: the earlier platform-independent check and the
   1045             //     upcoming check by sles_to_android_channelMaskOut are sufficient
   1046 
   1047             if (df_pcm->endianness != pAudioPlayer->mObject.mEngine->mEngine.mNativeEndianness) {
   1048                 SL_LOGE("Cannot create audio player: unsupported byte order %u",
   1049                         df_pcm->endianness);
   1050                 return SL_RESULT_CONTENT_UNSUPPORTED;
   1051             }
   1052 
   1053             // we don't support container size != sample depth
   1054             if (df_pcm->containerSize != df_pcm->bitsPerSample) {
   1055                 SL_LOGE("Cannot create audio player: unsupported container size %u bits for "
   1056                         "sample depth %u bits",
   1057                         df_pcm->containerSize, (SLuint32)df_pcm->bitsPerSample);
   1058                 return SL_RESULT_CONTENT_UNSUPPORTED;
   1059             }
   1060 
   1061             } //case SL_DATAFORMAT_PCM
   1062             break;
   1063         case SL_DATAFORMAT_MIME:
   1064         case XA_DATAFORMAT_RAWIMAGE:
   1065             SL_LOGE("Cannot create audio player with buffer queue data source "
   1066                 "without SL_DATAFORMAT_PCM format");
   1067             return SL_RESULT_CONTENT_UNSUPPORTED;
   1068         default:
   1069             // invalid data format is detected earlier
   1070             assert(false);
   1071             return SL_RESULT_INTERNAL_ERROR;
   1072         } // switch (sourceFormatType)
   1073         } // case SL_DATALOCATOR_BUFFERQUEUE or SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
   1074         break;
   1075     //------------------
   1076     //   URI
   1077     case SL_DATALOCATOR_URI:
   1078         {
   1079         SLDataLocator_URI *dl_uri = (SLDataLocator_URI *) pAudioSrc->pLocator;
   1080         if (NULL == dl_uri->URI) {
   1081             return SL_RESULT_PARAMETER_INVALID;
   1082         }
   1083         // URI format
   1084         switch (sourceFormatType) {
   1085         case SL_DATAFORMAT_MIME:
   1086             break;
   1087         default:
   1088             SL_LOGE("Cannot create audio player with SL_DATALOCATOR_URI data source without "
   1089                 "SL_DATAFORMAT_MIME format");
   1090             return SL_RESULT_CONTENT_UNSUPPORTED;
   1091         } // switch (sourceFormatType)
   1092         // decoding format check
   1093         if ((sinkLocatorType != SL_DATALOCATOR_OUTPUTMIX) &&
   1094                 !audioPlayer_isSupportedNonOutputMixSink(pAudioSnk)) {
   1095             return SL_RESULT_CONTENT_UNSUPPORTED;
   1096         }
   1097         } // case SL_DATALOCATOR_URI
   1098         break;
   1099     //------------------
   1100     //   File Descriptor
   1101     case SL_DATALOCATOR_ANDROIDFD:
   1102         {
   1103         // fd is already non null
   1104         switch (sourceFormatType) {
   1105         case SL_DATAFORMAT_MIME:
   1106             break;
   1107         default:
   1108             SL_LOGE("Cannot create audio player with SL_DATALOCATOR_ANDROIDFD data source "
   1109                 "without SL_DATAFORMAT_MIME format");
   1110             return SL_RESULT_CONTENT_UNSUPPORTED;
   1111         } // switch (sourceFormatType)
   1112         if ((sinkLocatorType != SL_DATALOCATOR_OUTPUTMIX) &&
   1113                 !audioPlayer_isSupportedNonOutputMixSink(pAudioSnk)) {
   1114             return SL_RESULT_CONTENT_UNSUPPORTED;
   1115         }
   1116         } // case SL_DATALOCATOR_ANDROIDFD
   1117         break;
   1118     //------------------
   1119     //   Stream
   1120     case SL_DATALOCATOR_ANDROIDBUFFERQUEUE:
   1121     {
   1122         switch (sourceFormatType) {
   1123         case SL_DATAFORMAT_MIME:
   1124         {
   1125             SLDataFormat_MIME *df_mime = (SLDataFormat_MIME *) pAudioSrc->pFormat;
   1126             if (NULL == df_mime) {
   1127                 SL_LOGE("MIME type null invalid");
   1128                 return SL_RESULT_CONTENT_UNSUPPORTED;
   1129             }
   1130             SL_LOGD("source MIME is %s", (char*)df_mime->mimeType);
   1131             switch (df_mime->containerType) {
   1132             case SL_CONTAINERTYPE_MPEG_TS:
   1133                 if (strcasecmp((char*)df_mime->mimeType, (const char *)XA_ANDROID_MIME_MP2TS)) {
   1134                     SL_LOGE("Invalid MIME (%s) for container SL_CONTAINERTYPE_MPEG_TS, expects %s",
   1135                             (char*)df_mime->mimeType, XA_ANDROID_MIME_MP2TS);
   1136                     return SL_RESULT_CONTENT_UNSUPPORTED;
   1137                 }
   1138                 if (pAudioPlayer->mAndroidObjType != AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE) {
   1139                     SL_LOGE("Invalid sink for container SL_CONTAINERTYPE_MPEG_TS");
   1140                     return SL_RESULT_PARAMETER_INVALID;
   1141                 }
   1142                 break;
   1143             case SL_CONTAINERTYPE_RAW:
   1144             case SL_CONTAINERTYPE_AAC:
   1145                 if (strcasecmp((char*)df_mime->mimeType, (const char *)SL_ANDROID_MIME_AACADTS) &&
   1146                         strcasecmp((char*)df_mime->mimeType,
   1147                                 ANDROID_MIME_AACADTS_ANDROID_FRAMEWORK)) {
   1148                     SL_LOGE("Invalid MIME (%s) for container type %d, expects %s",
   1149                             (char*)df_mime->mimeType, df_mime->containerType,
   1150                             SL_ANDROID_MIME_AACADTS);
   1151                     return SL_RESULT_CONTENT_UNSUPPORTED;
   1152                 }
   1153                 if (pAudioPlayer->mAndroidObjType != AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE) {
   1154                     SL_LOGE("Invalid sink for container SL_CONTAINERTYPE_AAC");
   1155                     return SL_RESULT_PARAMETER_INVALID;
   1156                 }
   1157                 break;
   1158             default:
   1159                 SL_LOGE("Cannot create player with SL_DATALOCATOR_ANDROIDBUFFERQUEUE data source "
   1160                                         "that is not fed MPEG-2 TS data or AAC ADTS data");
   1161                 return SL_RESULT_CONTENT_UNSUPPORTED;
   1162             }
   1163         }
   1164         break;
   1165         default:
   1166             SL_LOGE("Cannot create player with SL_DATALOCATOR_ANDROIDBUFFERQUEUE data source "
   1167                     "without SL_DATAFORMAT_MIME format");
   1168             return SL_RESULT_CONTENT_UNSUPPORTED;
   1169         }
   1170     }
   1171     break; // case SL_DATALOCATOR_ANDROIDBUFFERQUEUE
   1172     //------------------
   1173     //   Address
   1174     case SL_DATALOCATOR_ADDRESS:
   1175     case SL_DATALOCATOR_IODEVICE:
   1176     case SL_DATALOCATOR_OUTPUTMIX:
   1177     case XA_DATALOCATOR_NATIVEDISPLAY:
   1178     case SL_DATALOCATOR_MIDIBUFFERQUEUE:
   1179         SL_LOGE("Cannot create audio player with data locator type 0x%x",
   1180                 (unsigned) sourceLocatorType);
   1181         return SL_RESULT_CONTENT_UNSUPPORTED;
   1182     default:
   1183         SL_LOGE("Cannot create audio player with invalid data locator type 0x%x",
   1184                 (unsigned) sourceLocatorType);
   1185         return SL_RESULT_PARAMETER_INVALID;
   1186     }// switch (locatorType)
   1187 
   1188     return SL_RESULT_SUCCESS;
   1189 }
   1190 
   1191 
   1192 //-----------------------------------------------------------------------------
   1193 // Callback associated with an AudioTrack of an SL ES AudioPlayer that gets its data
   1194 // from a buffer queue. This will not be called once the AudioTrack has been destroyed.
   1195 static void audioTrack_callBack_pullFromBuffQueue(int event, void* user, void *info) {
   1196     CAudioPlayer *ap = (CAudioPlayer *)user;
   1197 
   1198     if (!android::CallbackProtector::enterCbIfOk(ap->mCallbackProtector)) {
   1199         // it is not safe to enter the callback (the track is about to go away)
   1200         return;
   1201     }
   1202 
   1203     void * callbackPContext = NULL;
   1204     switch (event) {
   1205 
   1206     case android::AudioTrack::EVENT_MORE_DATA: {
   1207         //SL_LOGV("received event EVENT_MORE_DATA from AudioTrack TID=%d", gettid());
   1208         slPrefetchCallback prefetchCallback = NULL;
   1209         void *prefetchContext = NULL;
   1210         SLuint32 prefetchEvents = SL_PREFETCHEVENT_NONE;
   1211         android::AudioTrack::Buffer* pBuff = (android::AudioTrack::Buffer*)info;
   1212 
   1213         // retrieve data from the buffer queue
   1214         interface_lock_exclusive(&ap->mBufferQueue);
   1215 
   1216         if (ap->mBufferQueue.mCallbackPending) {
   1217             // call callback with lock not held
   1218             slBufferQueueCallback callback = ap->mBufferQueue.mCallback;
   1219             if (NULL != callback) {
   1220                 callbackPContext = ap->mBufferQueue.mContext;
   1221                 interface_unlock_exclusive(&ap->mBufferQueue);
   1222                 (*callback)(&ap->mBufferQueue.mItf, callbackPContext);
   1223                 interface_lock_exclusive(&ap->mBufferQueue);
   1224                 ap->mBufferQueue.mCallbackPending = false;
   1225             }
   1226         }
   1227 
   1228         if (ap->mBufferQueue.mState.count != 0) {
   1229             //SL_LOGV("nbBuffers in queue = %u",ap->mBufferQueue.mState.count);
   1230             assert(ap->mBufferQueue.mFront != ap->mBufferQueue.mRear);
   1231 
   1232             BufferHeader *oldFront = ap->mBufferQueue.mFront;
   1233             BufferHeader *newFront = &oldFront[1];
   1234 
   1235             size_t availSource = oldFront->mSize - ap->mBufferQueue.mSizeConsumed;
   1236             size_t availSink = pBuff->size;
   1237             size_t bytesToCopy = availSource < availSink ? availSource : availSink;
   1238             void *pSrc = (char *)oldFront->mBuffer + ap->mBufferQueue.mSizeConsumed;
   1239             memcpy(pBuff->raw, pSrc, bytesToCopy);
   1240 
   1241             if (bytesToCopy < availSource) {
   1242                 ap->mBufferQueue.mSizeConsumed += bytesToCopy;
   1243                 // pBuff->size is already equal to bytesToCopy in this case
   1244             } else {
   1245                 // consumed an entire buffer, dequeue
   1246                 pBuff->size = bytesToCopy;
   1247                 ap->mBufferQueue.mSizeConsumed = 0;
   1248                 if (newFront ==
   1249                         &ap->mBufferQueue.mArray
   1250                             [ap->mBufferQueue.mNumBuffers + 1])
   1251                 {
   1252                     newFront = ap->mBufferQueue.mArray;
   1253                 }
   1254                 ap->mBufferQueue.mFront = newFront;
   1255 
   1256                 ap->mBufferQueue.mState.count--;
   1257                 ap->mBufferQueue.mState.playIndex++;
   1258                 ap->mBufferQueue.mCallbackPending = true;
   1259             }
   1260         } else { // empty queue
   1261             // signal no data available
   1262             pBuff->size = 0;
   1263 
   1264             // signal we're at the end of the content, but don't pause (see note in function)
   1265             audioPlayer_dispatch_headAtEnd_lockPlay(ap, false /*set state to paused?*/, false);
   1266 
   1267             // signal underflow to prefetch status itf
   1268             if (IsInterfaceInitialized(&ap->mObject, MPH_PREFETCHSTATUS)) {
   1269                 ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
   1270                 ap->mPrefetchStatus.mLevel = 0;
   1271                 // callback or no callback?
   1272                 prefetchEvents = ap->mPrefetchStatus.mCallbackEventsMask &
   1273                         (SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE);
   1274                 if (SL_PREFETCHEVENT_NONE != prefetchEvents) {
   1275                     prefetchCallback = ap->mPrefetchStatus.mCallback;
   1276                     prefetchContext  = ap->mPrefetchStatus.mContext;
   1277                 }
   1278             }
   1279 
   1280             // stop the track so it restarts playing faster when new data is enqueued
   1281             ap->mAudioTrack->stop();
   1282         }
   1283         interface_unlock_exclusive(&ap->mBufferQueue);
   1284 
   1285         // notify client
   1286         if (NULL != prefetchCallback) {
   1287             assert(SL_PREFETCHEVENT_NONE != prefetchEvents);
   1288             // spec requires separate callbacks for each event
   1289             if (prefetchEvents & SL_PREFETCHEVENT_STATUSCHANGE) {
   1290                 (*prefetchCallback)(&ap->mPrefetchStatus.mItf, prefetchContext,
   1291                         SL_PREFETCHEVENT_STATUSCHANGE);
   1292             }
   1293             if (prefetchEvents & SL_PREFETCHEVENT_FILLLEVELCHANGE) {
   1294                 (*prefetchCallback)(&ap->mPrefetchStatus.mItf, prefetchContext,
   1295                         SL_PREFETCHEVENT_FILLLEVELCHANGE);
   1296             }
   1297         }
   1298     }
   1299     break;
   1300 
   1301     case android::AudioTrack::EVENT_MARKER:
   1302         //SL_LOGI("received event EVENT_MARKER from AudioTrack");
   1303         audioTrack_handleMarker_lockPlay(ap);
   1304         break;
   1305 
   1306     case android::AudioTrack::EVENT_NEW_POS:
   1307         //SL_LOGI("received event EVENT_NEW_POS from AudioTrack");
   1308         audioTrack_handleNewPos_lockPlay(ap);
   1309         break;
   1310 
   1311     case android::AudioTrack::EVENT_UNDERRUN:
   1312         //SL_LOGI("received event EVENT_UNDERRUN from AudioTrack");
   1313         audioTrack_handleUnderrun_lockPlay(ap);
   1314         break;
   1315 
   1316     case android::AudioTrack::EVENT_NEW_IAUDIOTRACK:
   1317         // ignore for now
   1318         break;
   1319 
   1320     case android::AudioTrack::EVENT_BUFFER_END:
   1321     case android::AudioTrack::EVENT_LOOP_END:
   1322     case android::AudioTrack::EVENT_STREAM_END:
   1323         // These are unexpected so fall through
   1324     default:
   1325         // FIXME where does the notification of SL_PLAYEVENT_HEADMOVING fit?
   1326         SL_LOGE("Encountered unknown AudioTrack event %d for CAudioPlayer %p", event,
   1327                 (CAudioPlayer *)user);
   1328         break;
   1329     }
   1330 
   1331     ap->mCallbackProtector->exitCb();
   1332 }
   1333 
   1334 
   1335 //-----------------------------------------------------------------------------
   1336 void android_audioPlayer_create(CAudioPlayer *pAudioPlayer) {
   1337 
   1338     // pAudioPlayer->mAndroidObjType has been set in android_audioPlayer_checkSourceSink()
   1339     // and if it was == INVALID_TYPE, then IEngine_CreateAudioPlayer would never call us
   1340     assert(INVALID_TYPE != pAudioPlayer->mAndroidObjType);
   1341 
   1342     // These initializations are in the same order as the field declarations in classes.h
   1343 
   1344     // FIXME Consolidate initializations (many of these already in IEngine_CreateAudioPlayer)
   1345     // mAndroidObjType: see above comment
   1346     pAudioPlayer->mAndroidObjState = ANDROID_UNINITIALIZED;
   1347     pAudioPlayer->mSessionId = (audio_session_t) android::AudioSystem::newAudioUniqueId(
   1348             AUDIO_UNIQUE_ID_USE_SESSION);
   1349 
   1350     // placeholder: not necessary yet as session ID lifetime doesn't extend beyond player
   1351     // android::AudioSystem::acquireAudioSessionId(pAudioPlayer->mSessionId);
   1352 
   1353     pAudioPlayer->mStreamType = ANDROID_DEFAULT_OUTPUT_STREAM_TYPE;
   1354     pAudioPlayer->mPerformanceMode = ANDROID_PERFORMANCE_MODE_DEFAULT;
   1355 
   1356     // mAudioTrack
   1357     pAudioPlayer->mCallbackProtector = new android::CallbackProtector();
   1358     // mAPLayer
   1359     // mAuxEffect
   1360 
   1361     pAudioPlayer->mAuxSendLevel = 0;
   1362     pAudioPlayer->mAmplFromDirectLevel = 1.0f; // matches initial mDirectLevel value
   1363     pAudioPlayer->mDeferredStart = false;
   1364 
   1365     // This section re-initializes interface-specific fields that
   1366     // can be set or used regardless of whether the interface is
   1367     // exposed on the AudioPlayer or not
   1368 
   1369     switch (pAudioPlayer->mAndroidObjType) {
   1370     case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:
   1371         pAudioPlayer->mPlaybackRate.mMinRate = AUDIOTRACK_MIN_PLAYBACKRATE_PERMILLE;
   1372         pAudioPlayer->mPlaybackRate.mMaxRate = AUDIOTRACK_MAX_PLAYBACKRATE_PERMILLE;
   1373         break;
   1374     case AUDIOPLAYER_FROM_URIFD:
   1375         pAudioPlayer->mPlaybackRate.mMinRate = MEDIAPLAYER_MIN_PLAYBACKRATE_PERMILLE;
   1376         pAudioPlayer->mPlaybackRate.mMaxRate = MEDIAPLAYER_MAX_PLAYBACKRATE_PERMILLE;
   1377         break;
   1378     default:
   1379         // use the default range
   1380         break;
   1381     }
   1382 
   1383 }
   1384 
   1385 
   1386 //-----------------------------------------------------------------------------
   1387 SLresult android_audioPlayer_setConfig(CAudioPlayer *ap, const SLchar *configKey,
   1388         const void *pConfigValue, SLuint32 valueSize) {
   1389 
   1390     SLresult result;
   1391 
   1392     assert(NULL != ap && NULL != configKey && NULL != pConfigValue);
   1393     if (strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) {
   1394 
   1395         // stream type
   1396         if (KEY_STREAM_TYPE_PARAMSIZE > valueSize) {
   1397             SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
   1398             result = SL_RESULT_BUFFER_INSUFFICIENT;
   1399         } else {
   1400             result = audioPlayer_setStreamType(ap, *(SLuint32*)pConfigValue);
   1401         }
   1402     } else if (strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_PERFORMANCE_MODE) == 0) {
   1403 
   1404         // performance mode
   1405         if (KEY_PERFORMANCE_MODE_PARAMSIZE > valueSize) {
   1406             SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
   1407             result = SL_RESULT_BUFFER_INSUFFICIENT;
   1408         } else {
   1409             result = audioPlayer_setPerformanceMode(ap, *(SLuint32*)pConfigValue);
   1410         }
   1411 
   1412     } else {
   1413         SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY);
   1414         result = SL_RESULT_PARAMETER_INVALID;
   1415     }
   1416 
   1417     return result;
   1418 }
   1419 
   1420 
   1421 //-----------------------------------------------------------------------------
   1422 SLresult android_audioPlayer_getConfig(CAudioPlayer* ap, const SLchar *configKey,
   1423         SLuint32* pValueSize, void *pConfigValue) {
   1424 
   1425     SLresult result;
   1426 
   1427     assert(NULL != ap && NULL != configKey && NULL != pValueSize);
   1428     if (strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_STREAM_TYPE) == 0) {
   1429 
   1430         // stream type
   1431         if (NULL == pConfigValue) {
   1432             result = SL_RESULT_SUCCESS;
   1433         } else if (KEY_STREAM_TYPE_PARAMSIZE > *pValueSize) {
   1434             SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
   1435             result = SL_RESULT_BUFFER_INSUFFICIENT;
   1436         } else {
   1437             result = audioPlayer_getStreamType(ap, (SLint32*)pConfigValue);
   1438         }
   1439         *pValueSize = KEY_STREAM_TYPE_PARAMSIZE;
   1440 
   1441     } else if (strcmp((const char*)configKey, (const char*)SL_ANDROID_KEY_PERFORMANCE_MODE) == 0) {
   1442 
   1443         // performance mode
   1444         if (NULL == pConfigValue) {
   1445             result = SL_RESULT_SUCCESS;
   1446         } else if (KEY_PERFORMANCE_MODE_PARAMSIZE > *pValueSize) {
   1447             SL_LOGE(ERROR_CONFIG_VALUESIZE_TOO_LOW);
   1448             result = SL_RESULT_BUFFER_INSUFFICIENT;
   1449         } else {
   1450             result = audioPlayer_getPerformanceMode(ap, (SLuint32*)pConfigValue);
   1451         }
   1452         *pValueSize = KEY_PERFORMANCE_MODE_PARAMSIZE;
   1453 
   1454     } else {
   1455         SL_LOGE(ERROR_CONFIG_UNKNOWN_KEY);
   1456         result = SL_RESULT_PARAMETER_INVALID;
   1457     }
   1458 
   1459     return result;
   1460 }
   1461 
   1462 
   1463 // Called from android_audioPlayer_realize for a PCM buffer queue player before creating the
   1464 // AudioTrack to determine which performance modes are allowed based on effect interfaces present
   1465 static void checkAndSetPerformanceModePre(CAudioPlayer *pAudioPlayer)
   1466 {
   1467     SLuint32 allowedModes = ANDROID_PERFORMANCE_MODE_ALL;
   1468     assert(pAudioPlayer->mAndroidObjType == AUDIOPLAYER_FROM_PCM_BUFFERQUEUE);
   1469 
   1470     // no need to check the buffer queue size, application side
   1471     // double-buffering (and more) is not a requirement for using fast tracks
   1472 
   1473     // Check a blacklist of interfaces that are incompatible with fast tracks.
   1474     // The alternative, to check a whitelist of compatible interfaces, is
   1475     // more maintainable but is too slow.  As a compromise, in a debug build
   1476     // we use both methods and warn if they produce different results.
   1477     // In release builds, we only use the blacklist method.
   1478     // If a blacklisted interface is added after realization using
   1479     // DynamicInterfaceManagement::AddInterface,
   1480     // then this won't be detected but the interface will be ineffective.
   1481     static const unsigned blacklist[] = {
   1482         MPH_BASSBOOST,
   1483         MPH_EFFECTSEND,
   1484         MPH_ENVIRONMENTALREVERB,
   1485         MPH_EQUALIZER,
   1486         MPH_PLAYBACKRATE,
   1487         MPH_PRESETREVERB,
   1488         MPH_VIRTUALIZER,
   1489         MPH_ANDROIDEFFECT,
   1490         MPH_ANDROIDEFFECTSEND,
   1491         // FIXME The problem with a blacklist is remembering to add new interfaces here
   1492     };
   1493     for (unsigned i = 0; i < sizeof(blacklist)/sizeof(blacklist[0]); ++i) {
   1494         if (IsInterfaceInitialized(&pAudioPlayer->mObject, blacklist[i])) {
   1495             //TODO: query effect for EFFECT_FLAG_HW_ACC_xx flag to refine mode
   1496             allowedModes &=
   1497                     ~(ANDROID_PERFORMANCE_MODE_LATENCY|ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS);
   1498             break;
   1499         }
   1500     }
   1501 #if LOG_NDEBUG == 0
   1502     bool blacklistResult = (
   1503             (allowedModes &
   1504                 (ANDROID_PERFORMANCE_MODE_LATENCY|ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS)) != 0);
   1505     bool whitelistResult = true;
   1506     static const unsigned whitelist[] = {
   1507         MPH_BUFFERQUEUE,
   1508         MPH_DYNAMICINTERFACEMANAGEMENT,
   1509         MPH_METADATAEXTRACTION,
   1510         MPH_MUTESOLO,
   1511         MPH_OBJECT,
   1512         MPH_PLAY,
   1513         MPH_PREFETCHSTATUS,
   1514         MPH_VOLUME,
   1515         MPH_ANDROIDCONFIGURATION,
   1516         MPH_ANDROIDSIMPLEBUFFERQUEUE,
   1517         MPH_ANDROIDBUFFERQUEUESOURCE,
   1518     };
   1519     for (unsigned mph = MPH_MIN; mph < MPH_MAX; ++mph) {
   1520         for (unsigned i = 0; i < sizeof(whitelist)/sizeof(whitelist[0]); ++i) {
   1521             if (mph == whitelist[i]) {
   1522                 goto compatible;
   1523             }
   1524         }
   1525         if (IsInterfaceInitialized(&pAudioPlayer->mObject, mph)) {
   1526             whitelistResult = false;
   1527             break;
   1528         }
   1529 compatible: ;
   1530     }
   1531     if (whitelistResult != blacklistResult) {
   1532         SL_LOGW("whitelistResult != blacklistResult");
   1533     }
   1534 #endif
   1535     if (pAudioPlayer->mPerformanceMode == ANDROID_PERFORMANCE_MODE_LATENCY) {
   1536         if ((allowedModes & ANDROID_PERFORMANCE_MODE_LATENCY) == 0) {
   1537             pAudioPlayer->mPerformanceMode = ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS;
   1538         }
   1539     }
   1540     if (pAudioPlayer->mPerformanceMode == ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS) {
   1541         if ((allowedModes & ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS) == 0) {
   1542             pAudioPlayer->mPerformanceMode = ANDROID_PERFORMANCE_MODE_NONE;
   1543         }
   1544     }
   1545 }
   1546 
   1547 // Called from android_audioPlayer_realize for a PCM buffer queue player after creating the
   1548 // AudioTrack to adjust performance mode based on actual output flags
   1549 static void checkAndSetPerformanceModePost(CAudioPlayer *pAudioPlayer)
   1550 {
   1551     audio_output_flags_t flags = pAudioPlayer->mAudioTrack->getFlags();
   1552     switch (pAudioPlayer->mPerformanceMode) {
   1553     case ANDROID_PERFORMANCE_MODE_LATENCY:
   1554         if ((flags & (AUDIO_OUTPUT_FLAG_FAST | AUDIO_OUTPUT_FLAG_RAW)) ==
   1555                 (AUDIO_OUTPUT_FLAG_FAST | AUDIO_OUTPUT_FLAG_RAW)) {
   1556             break;
   1557         }
   1558         pAudioPlayer->mPerformanceMode = ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS;
   1559         /* FALL THROUGH */
   1560     case ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS:
   1561         if ((flags & AUDIO_OUTPUT_FLAG_FAST) == 0) {
   1562             pAudioPlayer->mPerformanceMode = ANDROID_PERFORMANCE_MODE_NONE;
   1563         }
   1564         break;
   1565     case ANDROID_PERFORMANCE_MODE_POWER_SAVING:
   1566         if ((flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) == 0) {
   1567             pAudioPlayer->mPerformanceMode = ANDROID_PERFORMANCE_MODE_NONE;
   1568         }
   1569         break;
   1570     case ANDROID_PERFORMANCE_MODE_NONE:
   1571     default:
   1572         break;
   1573     }
   1574 }
   1575 //-----------------------------------------------------------------------------
   1576 // FIXME abstract out the diff between CMediaPlayer and CAudioPlayer
   1577 SLresult android_audioPlayer_realize(CAudioPlayer *pAudioPlayer, SLboolean async) {
   1578 
   1579     SLresult result = SL_RESULT_SUCCESS;
   1580     SL_LOGV("Realize pAudioPlayer=%p", pAudioPlayer);
   1581 
   1582     AudioPlayback_Parameters app;
   1583     app.sessionId = pAudioPlayer->mSessionId;
   1584     app.streamType = pAudioPlayer->mStreamType;
   1585 
   1586     switch (pAudioPlayer->mAndroidObjType) {
   1587 
   1588     //-----------------------------------
   1589     // AudioTrack
   1590     case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE: {
   1591         // initialize platform-specific CAudioPlayer fields
   1592 
   1593         SLDataFormat_PCM *df_pcm = (SLDataFormat_PCM *)
   1594                 pAudioPlayer->mDynamicSource.mDataSource->pFormat;
   1595 
   1596         uint32_t sampleRate = sles_to_android_sampleRate(df_pcm->samplesPerSec);
   1597 
   1598         audio_channel_mask_t channelMask;
   1599         channelMask = sles_to_audio_output_channel_mask(df_pcm->channelMask);
   1600 
   1601         // To maintain backward compatibility with previous releases, ignore
   1602         // channel masks that are not indexed.
   1603         if (channelMask == AUDIO_CHANNEL_INVALID
   1604                 || audio_channel_mask_get_representation(channelMask)
   1605                         == AUDIO_CHANNEL_REPRESENTATION_POSITION) {
   1606             channelMask = audio_channel_out_mask_from_count(df_pcm->numChannels);
   1607             SL_LOGI("Emulating old channel mask behavior "
   1608                     "(ignoring positional mask %#x, using default mask %#x based on "
   1609                     "channel count of %d)", df_pcm->channelMask, channelMask,
   1610                     df_pcm->numChannels);
   1611         }
   1612         SL_LOGV("AudioPlayer: mapped SLES channel mask %#x to android channel mask %#x",
   1613             df_pcm->channelMask,
   1614             channelMask);
   1615 
   1616         checkAndSetPerformanceModePre(pAudioPlayer);
   1617 
   1618         audio_output_flags_t policy;
   1619         switch (pAudioPlayer->mPerformanceMode) {
   1620         case ANDROID_PERFORMANCE_MODE_POWER_SAVING:
   1621             policy = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
   1622             break;
   1623         case ANDROID_PERFORMANCE_MODE_NONE:
   1624             policy = AUDIO_OUTPUT_FLAG_NONE;
   1625             break;
   1626         case ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS:
   1627             policy = AUDIO_OUTPUT_FLAG_FAST;
   1628             break;
   1629         case ANDROID_PERFORMANCE_MODE_LATENCY:
   1630         default:
   1631             policy = (audio_output_flags_t)(AUDIO_OUTPUT_FLAG_FAST | AUDIO_OUTPUT_FLAG_RAW);
   1632             break;
   1633         }
   1634 
   1635         int32_t notificationFrames;
   1636         if ((policy & AUDIO_OUTPUT_FLAG_FAST) != 0) {
   1637             // negative notificationFrames is the number of notifications (sub-buffers) per track buffer
   1638             // for details see the explanation at frameworks/av/include/media/AudioTrack.h
   1639             notificationFrames = -pAudioPlayer->mBufferQueue.mNumBuffers;
   1640         } else {
   1641             notificationFrames = 0;
   1642         }
   1643 
   1644         pAudioPlayer->mAudioTrack = new android::AudioTrack(
   1645                 pAudioPlayer->mStreamType,                           // streamType
   1646                 sampleRate,                                          // sampleRate
   1647                 sles_to_android_sampleFormat(df_pcm),                // format
   1648                 channelMask,                                         // channel mask
   1649                 0,                                                   // frameCount
   1650                 policy,                                              // flags
   1651                 audioTrack_callBack_pullFromBuffQueue,               // callback
   1652                 (void *) pAudioPlayer,                               // user
   1653                 notificationFrames,                                  // see comment above
   1654                 pAudioPlayer->mSessionId);
   1655         android::status_t status = pAudioPlayer->mAudioTrack->initCheck();
   1656         if (status != android::NO_ERROR) {
   1657             SL_LOGE("AudioTrack::initCheck status %u", status);
   1658             // FIXME should return a more specific result depending on status
   1659             result = SL_RESULT_CONTENT_UNSUPPORTED;
   1660             pAudioPlayer->mAudioTrack.clear();
   1661             return result;
   1662         }
   1663 
   1664         // update performance mode according to actual flags granted to AudioTrack
   1665         checkAndSetPerformanceModePost(pAudioPlayer);
   1666 
   1667         // initialize platform-independent CAudioPlayer fields
   1668 
   1669         pAudioPlayer->mNumChannels = df_pcm->numChannels;
   1670         pAudioPlayer->mSampleRateMilliHz = df_pcm->samplesPerSec; // Note: bad field name in SL ES
   1671 
   1672         // This use case does not have a separate "prepare" step
   1673         pAudioPlayer->mAndroidObjState = ANDROID_READY;
   1674 
   1675         // If there is a JavaAudioRoutingProxy associated with this player, hook it up...
   1676         JNIEnv* j_env = NULL;
   1677         jclass clsAudioTrack = NULL;
   1678         jmethodID midRoutingProxy_connect = NULL;
   1679         if (pAudioPlayer->mAndroidConfiguration.mRoutingProxy != NULL &&
   1680                 (j_env = android::AndroidRuntime::getJNIEnv()) != NULL &&
   1681                 (clsAudioTrack = j_env->FindClass("android/media/AudioTrack")) != NULL &&
   1682                 (midRoutingProxy_connect =
   1683                     j_env->GetMethodID(clsAudioTrack, "deferred_connect", "(J)V")) != NULL) {
   1684             j_env->ExceptionClear();
   1685             j_env->CallVoidMethod(pAudioPlayer->mAndroidConfiguration.mRoutingProxy,
   1686                                   midRoutingProxy_connect,
   1687                                   pAudioPlayer->mAudioTrack.get());
   1688             if (j_env->ExceptionCheck()) {
   1689                 SL_LOGE("Java exception releasing recorder routing object.");
   1690                 result = SL_RESULT_INTERNAL_ERROR;
   1691                 pAudioPlayer->mAudioTrack.clear();
   1692                 return result;
   1693             }
   1694         }
   1695     }
   1696         break;
   1697 
   1698     //-----------------------------------
   1699     // MediaPlayer
   1700     case AUDIOPLAYER_FROM_URIFD: {
   1701         pAudioPlayer->mAPlayer = new android::LocAVPlayer(&app, false /*hasVideo*/);
   1702         pAudioPlayer->mAPlayer->init(sfplayer_handlePrefetchEvent,
   1703                         (void*)pAudioPlayer /*notifUSer*/);
   1704 
   1705         switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) {
   1706             case SL_DATALOCATOR_URI: {
   1707                 // The legacy implementation ran Stagefright within the application process, and
   1708                 // so allowed local pathnames specified by URI that were openable by
   1709                 // the application but were not openable by mediaserver.
   1710                 // The current implementation runs Stagefright (mostly) within mediaserver,
   1711                 // which runs as a different UID and likely a different current working directory.
   1712                 // For backwards compatibility with any applications which may have relied on the
   1713                 // previous behavior, we convert an openable file URI into an FD.
   1714                 // Note that unlike SL_DATALOCATOR_ANDROIDFD, this FD is owned by us
   1715                 // and so we close it as soon as we've passed it (via Binder dup) to mediaserver.
   1716                 const char *uri = (const char *)pAudioPlayer->mDataSource.mLocator.mURI.URI;
   1717                 if (!isDistantProtocol(uri)) {
   1718                     // don't touch the original uri, we may need it later
   1719                     const char *pathname = uri;
   1720                     // skip over an optional leading file:// prefix
   1721                     if (!strncasecmp(pathname, "file://", 7)) {
   1722                         pathname += 7;
   1723                     }
   1724                     // attempt to open it as a file using the application's credentials
   1725                     int fd = ::open(pathname, O_RDONLY);
   1726                     if (fd >= 0) {
   1727                         // if open is successful, then check to see if it's a regular file
   1728                         struct stat statbuf;
   1729                         if (!::fstat(fd, &statbuf) && S_ISREG(statbuf.st_mode)) {
   1730                             // treat similarly to an FD data locator, but
   1731                             // let setDataSource take responsibility for closing fd
   1732                             pAudioPlayer->mAPlayer->setDataSource(fd, 0, statbuf.st_size, true);
   1733                             break;
   1734                         }
   1735                         // we were able to open it, but it's not a file, so let mediaserver try
   1736                         (void) ::close(fd);
   1737                     }
   1738                 }
   1739                 // if either the URI didn't look like a file, or open failed, or not a file
   1740                 pAudioPlayer->mAPlayer->setDataSource(uri);
   1741                 } break;
   1742             case SL_DATALOCATOR_ANDROIDFD: {
   1743                 int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset;
   1744                 pAudioPlayer->mAPlayer->setDataSource(
   1745                         (int)pAudioPlayer->mDataSource.mLocator.mFD.fd,
   1746                         offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
   1747                                 (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
   1748                         (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length);
   1749                 }
   1750                 break;
   1751             default:
   1752                 SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR);
   1753                 break;
   1754         }
   1755 
   1756         }
   1757         break;
   1758 
   1759     //-----------------------------------
   1760     // StreamPlayer
   1761     case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: {
   1762         android::StreamPlayer* splr = new android::StreamPlayer(&app, false /*hasVideo*/,
   1763                 &pAudioPlayer->mAndroidBufferQueue, pAudioPlayer->mCallbackProtector);
   1764         pAudioPlayer->mAPlayer = splr;
   1765         splr->init(sfplayer_handlePrefetchEvent, (void*)pAudioPlayer);
   1766         }
   1767         break;
   1768 
   1769     //-----------------------------------
   1770     // AudioToCbRenderer
   1771     case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE: {
   1772         android::AudioToCbRenderer* decoder = new android::AudioToCbRenderer(&app);
   1773         pAudioPlayer->mAPlayer = decoder;
   1774         // configures the callback for the sink buffer queue
   1775         decoder->setDataPushListener(adecoder_writeToBufferQueue, pAudioPlayer);
   1776         // configures the callback for the notifications coming from the SF code
   1777         decoder->init(sfplayer_handlePrefetchEvent, (void*)pAudioPlayer);
   1778 
   1779         switch (pAudioPlayer->mDataSource.mLocator.mLocatorType) {
   1780         case SL_DATALOCATOR_URI:
   1781             decoder->setDataSource(
   1782                     (const char*)pAudioPlayer->mDataSource.mLocator.mURI.URI);
   1783             break;
   1784         case SL_DATALOCATOR_ANDROIDFD: {
   1785             int64_t offset = (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.offset;
   1786             decoder->setDataSource(
   1787                     (int)pAudioPlayer->mDataSource.mLocator.mFD.fd,
   1788                     offset == SL_DATALOCATOR_ANDROIDFD_USE_FILE_SIZE ?
   1789                             (int64_t)PLAYER_FD_FIND_FILE_SIZE : offset,
   1790                             (int64_t)pAudioPlayer->mDataSource.mLocator.mFD.length);
   1791             }
   1792             break;
   1793         default:
   1794             SL_LOGE(ERROR_PLAYERREALIZE_UNKNOWN_DATASOURCE_LOCATOR);
   1795             break;
   1796         }
   1797 
   1798         }
   1799         break;
   1800 
   1801     //-----------------------------------
   1802     // AacBqToPcmCbRenderer
   1803     case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE: {
   1804         android::AacBqToPcmCbRenderer* bqtobq = new android::AacBqToPcmCbRenderer(&app,
   1805                 &pAudioPlayer->mAndroidBufferQueue);
   1806         // configures the callback for the sink buffer queue
   1807         bqtobq->setDataPushListener(adecoder_writeToBufferQueue, pAudioPlayer);
   1808         pAudioPlayer->mAPlayer = bqtobq;
   1809         // configures the callback for the notifications coming from the SF code,
   1810         // but also implicitly configures the AndroidBufferQueue from which ADTS data is read
   1811         pAudioPlayer->mAPlayer->init(sfplayer_handlePrefetchEvent, (void*)pAudioPlayer);
   1812         }
   1813         break;
   1814 
   1815     //-----------------------------------
   1816     default:
   1817         SL_LOGE(ERROR_PLAYERREALIZE_UNEXPECTED_OBJECT_TYPE_D, pAudioPlayer->mAndroidObjType);
   1818         result = SL_RESULT_INTERNAL_ERROR;
   1819         break;
   1820     }
   1821 
   1822     if (result == SL_RESULT_SUCCESS) {
   1823         // proceed with effect initialization
   1824         // initialize EQ
   1825         // FIXME use a table of effect descriptors when adding support for more effects
   1826 
   1827         // No session effects allowed even in latency with effects performance mode because HW
   1828         // accelerated effects are only tolerated as post processing in this mode
   1829         if ((pAudioPlayer->mAndroidObjType != AUDIOPLAYER_FROM_PCM_BUFFERQUEUE) ||
   1830                 ((pAudioPlayer->mPerformanceMode != ANDROID_PERFORMANCE_MODE_LATENCY) &&
   1831                  (pAudioPlayer->mPerformanceMode != ANDROID_PERFORMANCE_MODE_LATENCY_EFFECTS))) {
   1832             if (memcmp(SL_IID_EQUALIZER, &pAudioPlayer->mEqualizer.mEqDescriptor.type,
   1833                     sizeof(effect_uuid_t)) == 0) {
   1834                 SL_LOGV("Need to initialize EQ for AudioPlayer=%p", pAudioPlayer);
   1835                 android_eq_init(pAudioPlayer->mSessionId, &pAudioPlayer->mEqualizer);
   1836             }
   1837             // initialize BassBoost
   1838             if (memcmp(SL_IID_BASSBOOST, &pAudioPlayer->mBassBoost.mBassBoostDescriptor.type,
   1839                     sizeof(effect_uuid_t)) == 0) {
   1840                 SL_LOGV("Need to initialize BassBoost for AudioPlayer=%p", pAudioPlayer);
   1841                 android_bb_init(pAudioPlayer->mSessionId, &pAudioPlayer->mBassBoost);
   1842             }
   1843             // initialize Virtualizer
   1844             if (memcmp(SL_IID_VIRTUALIZER, &pAudioPlayer->mVirtualizer.mVirtualizerDescriptor.type,
   1845                        sizeof(effect_uuid_t)) == 0) {
   1846                 SL_LOGV("Need to initialize Virtualizer for AudioPlayer=%p", pAudioPlayer);
   1847                 android_virt_init(pAudioPlayer->mSessionId, &pAudioPlayer->mVirtualizer);
   1848             }
   1849         }
   1850     }
   1851 
   1852     // initialize EffectSend
   1853     // FIXME initialize EffectSend
   1854 
   1855     return result;
   1856 }
   1857 
   1858 
   1859 //-----------------------------------------------------------------------------
   1860 /**
   1861  * Called with a lock on AudioPlayer, and blocks until safe to destroy
   1862  */
   1863 SLresult android_audioPlayer_preDestroy(CAudioPlayer *pAudioPlayer) {
   1864     SL_LOGD("android_audioPlayer_preDestroy(%p)", pAudioPlayer);
   1865     SLresult result = SL_RESULT_SUCCESS;
   1866 
   1867     bool disableCallbacksBeforePreDestroy;
   1868     switch (pAudioPlayer->mAndroidObjType) {
   1869     // Not yet clear why this order is important, but it reduces detected deadlocks
   1870     case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   1871         disableCallbacksBeforePreDestroy = true;
   1872         break;
   1873     // Use the old behavior for all other use cases until proven
   1874     // case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   1875     default:
   1876         disableCallbacksBeforePreDestroy = false;
   1877         break;
   1878     }
   1879 
   1880     if (disableCallbacksBeforePreDestroy) {
   1881         object_unlock_exclusive(&pAudioPlayer->mObject);
   1882         if (pAudioPlayer->mCallbackProtector != 0) {
   1883             pAudioPlayer->mCallbackProtector->requestCbExitAndWait();
   1884         }
   1885         object_lock_exclusive(&pAudioPlayer->mObject);
   1886     }
   1887 
   1888     if (pAudioPlayer->mAPlayer != 0) {
   1889         pAudioPlayer->mAPlayer->preDestroy();
   1890     }
   1891     SL_LOGD("android_audioPlayer_preDestroy(%p) after mAPlayer->preDestroy()", pAudioPlayer);
   1892 
   1893     if (!disableCallbacksBeforePreDestroy) {
   1894         object_unlock_exclusive(&pAudioPlayer->mObject);
   1895         if (pAudioPlayer->mCallbackProtector != 0) {
   1896             pAudioPlayer->mCallbackProtector->requestCbExitAndWait();
   1897         }
   1898         object_lock_exclusive(&pAudioPlayer->mObject);
   1899     }
   1900 
   1901     return result;
   1902 }
   1903 
   1904 
   1905 //-----------------------------------------------------------------------------
   1906 SLresult android_audioPlayer_destroy(CAudioPlayer *pAudioPlayer) {
   1907     SLresult result = SL_RESULT_SUCCESS;
   1908     SL_LOGV("android_audioPlayer_destroy(%p)", pAudioPlayer);
   1909     switch (pAudioPlayer->mAndroidObjType) {
   1910 
   1911     case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:
   1912         // We own the audio track for PCM buffer queue players
   1913         if (pAudioPlayer->mAudioTrack != 0) {
   1914             pAudioPlayer->mAudioTrack->stop();
   1915             // Note that there may still be another reference in post-unlock phase of SetPlayState
   1916             pAudioPlayer->mAudioTrack.clear();
   1917         }
   1918         break;
   1919 
   1920     case AUDIOPLAYER_FROM_URIFD:     // intended fall-through
   1921     case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE:    // intended fall-through
   1922     case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE: // intended fall-through
   1923     case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   1924         pAudioPlayer->mAPlayer.clear();
   1925         break;
   1926     //-----------------------------------
   1927     default:
   1928         SL_LOGE(ERROR_PLAYERDESTROY_UNEXPECTED_OBJECT_TYPE_D, pAudioPlayer->mAndroidObjType);
   1929         result = SL_RESULT_INTERNAL_ERROR;
   1930         break;
   1931     }
   1932 
   1933     // placeholder: not necessary yet as session ID lifetime doesn't extend beyond player
   1934     // android::AudioSystem::releaseAudioSessionId(pAudioPlayer->mSessionId);
   1935 
   1936     pAudioPlayer->mCallbackProtector.clear();
   1937 
   1938     // explicit destructor
   1939     pAudioPlayer->mAudioTrack.~sp();
   1940     // note that SetPlayState(PLAYING) may still hold a reference
   1941     pAudioPlayer->mCallbackProtector.~sp();
   1942     pAudioPlayer->mAuxEffect.~sp();
   1943     pAudioPlayer->mAPlayer.~sp();
   1944 
   1945     return result;
   1946 }
   1947 
   1948 
   1949 //-----------------------------------------------------------------------------
   1950 SLresult android_audioPlayer_setPlaybackRateAndConstraints(CAudioPlayer *ap, SLpermille rate,
   1951         SLuint32 constraints) {
   1952     SLresult result = SL_RESULT_SUCCESS;
   1953     switch (ap->mAndroidObjType) {
   1954     case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE: {
   1955         // these asserts were already checked by the platform-independent layer
   1956         assert((AUDIOTRACK_MIN_PLAYBACKRATE_PERMILLE <= rate) &&
   1957                 (rate <= AUDIOTRACK_MAX_PLAYBACKRATE_PERMILLE));
   1958         assert(constraints & SL_RATEPROP_NOPITCHCORAUDIO);
   1959         // get the content sample rate
   1960         uint32_t contentRate = sles_to_android_sampleRate(ap->mSampleRateMilliHz);
   1961         // apply the SL ES playback rate on the AudioTrack as a factor of its content sample rate
   1962         if (ap->mAudioTrack != 0) {
   1963             ap->mAudioTrack->setSampleRate(contentRate * (rate/1000.0f));
   1964         }
   1965         }
   1966         break;
   1967     case AUDIOPLAYER_FROM_URIFD: {
   1968         assert((MEDIAPLAYER_MIN_PLAYBACKRATE_PERMILLE <= rate) &&
   1969                         (rate <= MEDIAPLAYER_MAX_PLAYBACKRATE_PERMILLE));
   1970         assert(constraints & SL_RATEPROP_NOPITCHCORAUDIO);
   1971         // apply the SL ES playback rate on the GenericPlayer
   1972         if (ap->mAPlayer != 0) {
   1973             ap->mAPlayer->setPlaybackRate((int16_t)rate);
   1974         }
   1975         }
   1976         break;
   1977 
   1978     default:
   1979         SL_LOGE("Unexpected object type %d", ap->mAndroidObjType);
   1980         result = SL_RESULT_FEATURE_UNSUPPORTED;
   1981         break;
   1982     }
   1983     return result;
   1984 }
   1985 
   1986 
   1987 //-----------------------------------------------------------------------------
   1988 // precondition
   1989 //  called with no lock held
   1990 //  ap != NULL
   1991 //  pItemCount != NULL
   1992 SLresult android_audioPlayer_metadata_getItemCount(CAudioPlayer *ap, SLuint32 *pItemCount) {
   1993     if (ap->mAPlayer == 0) {
   1994         return SL_RESULT_PARAMETER_INVALID;
   1995     }
   1996     switch (ap->mAndroidObjType) {
   1997       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   1998       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   1999         {
   2000             android::AudioSfDecoder* decoder =
   2001                     static_cast<android::AudioSfDecoder*>(ap->mAPlayer.get());
   2002             *pItemCount = decoder->getPcmFormatKeyCount();
   2003         }
   2004         break;
   2005       default:
   2006         *pItemCount = 0;
   2007         break;
   2008     }
   2009     return SL_RESULT_SUCCESS;
   2010 }
   2011 
   2012 
   2013 //-----------------------------------------------------------------------------
   2014 // precondition
   2015 //  called with no lock held
   2016 //  ap != NULL
   2017 //  pKeySize != NULL
   2018 SLresult android_audioPlayer_metadata_getKeySize(CAudioPlayer *ap,
   2019         SLuint32 index, SLuint32 *pKeySize) {
   2020     if (ap->mAPlayer == 0) {
   2021         return SL_RESULT_PARAMETER_INVALID;
   2022     }
   2023     SLresult res = SL_RESULT_SUCCESS;
   2024     switch (ap->mAndroidObjType) {
   2025       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   2026       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2027         {
   2028             android::AudioSfDecoder* decoder =
   2029                     static_cast<android::AudioSfDecoder*>(ap->mAPlayer.get());
   2030             SLuint32 keyNameSize = 0;
   2031             if (!decoder->getPcmFormatKeySize(index, &keyNameSize)) {
   2032                 res = SL_RESULT_PARAMETER_INVALID;
   2033             } else {
   2034                 // *pKeySize is the size of the region used to store the key name AND
   2035                 //   the information about the key (size, lang, encoding)
   2036                 *pKeySize = keyNameSize + sizeof(SLMetadataInfo);
   2037             }
   2038         }
   2039         break;
   2040       default:
   2041         *pKeySize = 0;
   2042         res = SL_RESULT_PARAMETER_INVALID;
   2043         break;
   2044     }
   2045     return res;
   2046 }
   2047 
   2048 
   2049 //-----------------------------------------------------------------------------
   2050 // precondition
   2051 //  called with no lock held
   2052 //  ap != NULL
   2053 //  pKey != NULL
   2054 SLresult android_audioPlayer_metadata_getKey(CAudioPlayer *ap,
   2055         SLuint32 index, SLuint32 size, SLMetadataInfo *pKey) {
   2056     if (ap->mAPlayer == 0) {
   2057         return SL_RESULT_PARAMETER_INVALID;
   2058     }
   2059     SLresult res = SL_RESULT_SUCCESS;
   2060     switch (ap->mAndroidObjType) {
   2061       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   2062       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2063         {
   2064             android::AudioSfDecoder* decoder =
   2065                     static_cast<android::AudioSfDecoder*>(ap->mAPlayer.get());
   2066             if ((size < sizeof(SLMetadataInfo) ||
   2067                     (!decoder->getPcmFormatKeyName(index, size - sizeof(SLMetadataInfo),
   2068                             (char*)pKey->data)))) {
   2069                 res = SL_RESULT_PARAMETER_INVALID;
   2070             } else {
   2071                 // successfully retrieved the key value, update the other fields
   2072                 pKey->encoding = SL_CHARACTERENCODING_UTF8;
   2073                 memcpy((char *) pKey->langCountry, "en", 3);
   2074                 pKey->size = strlen((char*)pKey->data) + 1;
   2075             }
   2076         }
   2077         break;
   2078       default:
   2079         res = SL_RESULT_PARAMETER_INVALID;
   2080         break;
   2081     }
   2082     return res;
   2083 }
   2084 
   2085 
   2086 //-----------------------------------------------------------------------------
   2087 // precondition
   2088 //  called with no lock held
   2089 //  ap != NULL
   2090 //  pValueSize != NULL
   2091 SLresult android_audioPlayer_metadata_getValueSize(CAudioPlayer *ap,
   2092         SLuint32 index, SLuint32 *pValueSize) {
   2093     if (ap->mAPlayer == 0) {
   2094         return SL_RESULT_PARAMETER_INVALID;
   2095     }
   2096     SLresult res = SL_RESULT_SUCCESS;
   2097     switch (ap->mAndroidObjType) {
   2098       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   2099       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2100         {
   2101             android::AudioSfDecoder* decoder =
   2102                     static_cast<android::AudioSfDecoder*>(ap->mAPlayer.get());
   2103             SLuint32 valueSize = 0;
   2104             if (!decoder->getPcmFormatValueSize(index, &valueSize)) {
   2105                 res = SL_RESULT_PARAMETER_INVALID;
   2106             } else {
   2107                 // *pValueSize is the size of the region used to store the key value AND
   2108                 //   the information about the value (size, lang, encoding)
   2109                 *pValueSize = valueSize + sizeof(SLMetadataInfo);
   2110             }
   2111         }
   2112         break;
   2113       default:
   2114           *pValueSize = 0;
   2115           res = SL_RESULT_PARAMETER_INVALID;
   2116           break;
   2117     }
   2118     return res;
   2119 }
   2120 
   2121 
   2122 //-----------------------------------------------------------------------------
   2123 // precondition
   2124 //  called with no lock held
   2125 //  ap != NULL
   2126 //  pValue != NULL
   2127 SLresult android_audioPlayer_metadata_getValue(CAudioPlayer *ap,
   2128         SLuint32 index, SLuint32 size, SLMetadataInfo *pValue) {
   2129     if (ap->mAPlayer == 0) {
   2130         return SL_RESULT_PARAMETER_INVALID;
   2131     }
   2132     SLresult res = SL_RESULT_SUCCESS;
   2133     switch (ap->mAndroidObjType) {
   2134       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   2135       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2136         {
   2137             android::AudioSfDecoder* decoder =
   2138                     static_cast<android::AudioSfDecoder*>(ap->mAPlayer.get());
   2139             pValue->encoding = SL_CHARACTERENCODING_BINARY;
   2140             memcpy((char *) pValue->langCountry, "en", 3); // applicable here?
   2141             SLuint32 valueSize = 0;
   2142             if ((size < sizeof(SLMetadataInfo)
   2143                     || (!decoder->getPcmFormatValueSize(index, &valueSize))
   2144                     || (!decoder->getPcmFormatKeyValue(index, size - sizeof(SLMetadataInfo),
   2145                             (SLuint32*)pValue->data)))) {
   2146                 res = SL_RESULT_PARAMETER_INVALID;
   2147             } else {
   2148                 pValue->size = valueSize;
   2149             }
   2150         }
   2151         break;
   2152       default:
   2153         res = SL_RESULT_PARAMETER_INVALID;
   2154         break;
   2155     }
   2156     return res;
   2157 }
   2158 
   2159 //-----------------------------------------------------------------------------
   2160 // preconditions
   2161 //  ap != NULL
   2162 //  mutex is locked
   2163 //  play state has changed
   2164 void android_audioPlayer_setPlayState(CAudioPlayer *ap) {
   2165 
   2166     SLuint32 playState = ap->mPlay.mState;
   2167 
   2168     switch (ap->mAndroidObjType) {
   2169     case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:
   2170         switch (playState) {
   2171         case SL_PLAYSTATE_STOPPED:
   2172             SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_STOPPED");
   2173             if (ap->mAudioTrack != 0) {
   2174                 ap->mAudioTrack->stop();
   2175             }
   2176             break;
   2177         case SL_PLAYSTATE_PAUSED:
   2178             SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PAUSED");
   2179             if (ap->mAudioTrack != 0) {
   2180                 ap->mAudioTrack->pause();
   2181             }
   2182             break;
   2183         case SL_PLAYSTATE_PLAYING:
   2184             SL_LOGV("setting AudioPlayer to SL_PLAYSTATE_PLAYING");
   2185             if (ap->mAudioTrack != 0) {
   2186                 // instead of ap->mAudioTrack->start();
   2187                 ap->mDeferredStart = true;
   2188             }
   2189             break;
   2190         default:
   2191             // checked by caller, should not happen
   2192             break;
   2193         }
   2194         break;
   2195 
   2196     case AUDIOPLAYER_FROM_URIFD:      // intended fall-through
   2197     case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE:     // intended fall-through
   2198     case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:  // intended fall-through
   2199     case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2200         // FIXME report and use the return code to the lock mechanism, which is where play state
   2201         //   changes are updated (see object_unlock_exclusive_attributes())
   2202         aplayer_setPlayState(ap->mAPlayer, playState, &ap->mAndroidObjState);
   2203         break;
   2204     default:
   2205         SL_LOGE(ERROR_PLAYERSETPLAYSTATE_UNEXPECTED_OBJECT_TYPE_D, ap->mAndroidObjType);
   2206         break;
   2207     }
   2208 }
   2209 
   2210 
   2211 //-----------------------------------------------------------------------------
   2212 // call when either player event flags, marker position, or position update period changes
   2213 void android_audioPlayer_usePlayEventMask(CAudioPlayer *ap) {
   2214     IPlay *pPlayItf = &ap->mPlay;
   2215     SLuint32 eventFlags = pPlayItf->mEventFlags;
   2216     /*switch (ap->mAndroidObjType) {
   2217     case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:*/
   2218 
   2219     if (ap->mAPlayer != 0) {
   2220         assert(ap->mAudioTrack == 0);
   2221         ap->mAPlayer->setPlayEvents((int32_t) eventFlags, (int32_t) pPlayItf->mMarkerPosition,
   2222                 (int32_t) pPlayItf->mPositionUpdatePeriod);
   2223         return;
   2224     }
   2225 
   2226     if (ap->mAudioTrack == 0) {
   2227         return;
   2228     }
   2229 
   2230     if (eventFlags & SL_PLAYEVENT_HEADATMARKER) {
   2231         ap->mAudioTrack->setMarkerPosition((uint32_t)((((int64_t)pPlayItf->mMarkerPosition
   2232                 * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000));
   2233     } else {
   2234         // clear marker
   2235         ap->mAudioTrack->setMarkerPosition(0);
   2236     }
   2237 
   2238     if (eventFlags & SL_PLAYEVENT_HEADATNEWPOS) {
   2239          ap->mAudioTrack->setPositionUpdatePeriod(
   2240                 (uint32_t)((((int64_t)pPlayItf->mPositionUpdatePeriod
   2241                 * sles_to_android_sampleRate(ap->mSampleRateMilliHz)))/1000));
   2242     } else {
   2243         // clear periodic update
   2244         ap->mAudioTrack->setPositionUpdatePeriod(0);
   2245     }
   2246 
   2247     if (eventFlags & SL_PLAYEVENT_HEADATEND) {
   2248         // nothing to do for SL_PLAYEVENT_HEADATEND, callback event will be checked against mask
   2249     }
   2250 
   2251     if (eventFlags & SL_PLAYEVENT_HEADMOVING) {
   2252         // FIXME support SL_PLAYEVENT_HEADMOVING
   2253         SL_LOGD("[ FIXME: IPlay_SetCallbackEventsMask(SL_PLAYEVENT_HEADMOVING) on an "
   2254             "SL_OBJECTID_AUDIOPLAYER to be implemented ]");
   2255     }
   2256     if (eventFlags & SL_PLAYEVENT_HEADSTALLED) {
   2257         // nothing to do for SL_PLAYEVENT_HEADSTALLED, callback event will be checked against mask
   2258     }
   2259 
   2260 }
   2261 
   2262 
   2263 //-----------------------------------------------------------------------------
   2264 SLresult android_audioPlayer_getDuration(IPlay *pPlayItf, SLmillisecond *pDurMsec) {
   2265     CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis;
   2266     switch (ap->mAndroidObjType) {
   2267 
   2268       case AUDIOPLAYER_FROM_URIFD:  // intended fall-through
   2269       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE: {
   2270         int32_t durationMsec = ANDROID_UNKNOWN_TIME;
   2271         if (ap->mAPlayer != 0) {
   2272             ap->mAPlayer->getDurationMsec(&durationMsec);
   2273         }
   2274         *pDurMsec = durationMsec == ANDROID_UNKNOWN_TIME ? SL_TIME_UNKNOWN : durationMsec;
   2275         break;
   2276       }
   2277 
   2278       case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE: // intended fall-through
   2279       case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:
   2280       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2281       default: {
   2282         *pDurMsec = SL_TIME_UNKNOWN;
   2283       }
   2284     }
   2285     return SL_RESULT_SUCCESS;
   2286 }
   2287 
   2288 
   2289 //-----------------------------------------------------------------------------
   2290 void android_audioPlayer_getPosition(IPlay *pPlayItf, SLmillisecond *pPosMsec) {
   2291     CAudioPlayer *ap = (CAudioPlayer *)pPlayItf->mThis;
   2292     switch (ap->mAndroidObjType) {
   2293 
   2294       case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:
   2295         if ((ap->mSampleRateMilliHz == UNKNOWN_SAMPLERATE) || (ap->mAudioTrack == 0)) {
   2296             *pPosMsec = 0;
   2297         } else {
   2298             uint32_t positionInFrames;
   2299             ap->mAudioTrack->getPosition(&positionInFrames);
   2300             *pPosMsec = ((int64_t)positionInFrames * 1000) /
   2301                     sles_to_android_sampleRate(ap->mSampleRateMilliHz);
   2302         }
   2303         break;
   2304 
   2305       case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE:    // intended fall-through
   2306       case AUDIOPLAYER_FROM_URIFD:
   2307       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   2308       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE: {
   2309         int32_t posMsec = ANDROID_UNKNOWN_TIME;
   2310         if (ap->mAPlayer != 0) {
   2311             ap->mAPlayer->getPositionMsec(&posMsec);
   2312         }
   2313         *pPosMsec = posMsec == ANDROID_UNKNOWN_TIME ? 0 : posMsec;
   2314         break;
   2315       }
   2316 
   2317       default:
   2318         *pPosMsec = 0;
   2319     }
   2320 }
   2321 
   2322 
   2323 //-----------------------------------------------------------------------------
   2324 SLresult android_audioPlayer_seek(CAudioPlayer *ap, SLmillisecond posMsec) {
   2325     SLresult result = SL_RESULT_SUCCESS;
   2326 
   2327     switch (ap->mAndroidObjType) {
   2328 
   2329       case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:      // intended fall-through
   2330       case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE:
   2331       case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2332         result = SL_RESULT_FEATURE_UNSUPPORTED;
   2333         break;
   2334 
   2335       case AUDIOPLAYER_FROM_URIFD:                   // intended fall-through
   2336       case AUDIOPLAYER_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   2337         if (ap->mAPlayer != 0) {
   2338             ap->mAPlayer->seek(posMsec);
   2339         }
   2340         break;
   2341 
   2342       default:
   2343         break;
   2344     }
   2345     return result;
   2346 }
   2347 
   2348 
   2349 //-----------------------------------------------------------------------------
   2350 SLresult android_audioPlayer_loop(CAudioPlayer *ap, SLboolean loopEnable) {
   2351     SLresult result = SL_RESULT_SUCCESS;
   2352 
   2353     switch (ap->mAndroidObjType) {
   2354     case AUDIOPLAYER_FROM_URIFD:
   2355     // case AUDIOPLAY_FROM_URIFD_TO_PCM_BUFFERQUEUE:
   2356     //      would actually work, but what's the point?
   2357       if (ap->mAPlayer != 0) {
   2358         ap->mAPlayer->loop((bool)loopEnable);
   2359       }
   2360       break;
   2361     default:
   2362       result = SL_RESULT_FEATURE_UNSUPPORTED;
   2363       break;
   2364     }
   2365     return result;
   2366 }
   2367 
   2368 
   2369 //-----------------------------------------------------------------------------
   2370 SLresult android_audioPlayer_setBufferingUpdateThresholdPerMille(CAudioPlayer *ap,
   2371         SLpermille threshold) {
   2372     SLresult result = SL_RESULT_SUCCESS;
   2373 
   2374     switch (ap->mAndroidObjType) {
   2375       case AUDIOPLAYER_FROM_URIFD:
   2376         if (ap->mAPlayer != 0) {
   2377             ap->mAPlayer->setBufferingUpdateThreshold(threshold / 10);
   2378         }
   2379         break;
   2380 
   2381       default: {}
   2382     }
   2383 
   2384     return result;
   2385 }
   2386 
   2387 
   2388 //-----------------------------------------------------------------------------
   2389 void android_audioPlayer_bufferQueue_onRefilled_l(CAudioPlayer *ap) {
   2390     // the AudioTrack associated with the AudioPlayer receiving audio from a PCM buffer
   2391     // queue was stopped when the queue become empty, we restart as soon as a new buffer
   2392     // has been enqueued since we're in playing state
   2393     if (ap->mAudioTrack != 0) {
   2394         // instead of ap->mAudioTrack->start();
   2395         ap->mDeferredStart = true;
   2396     }
   2397 
   2398     // when the queue became empty, an underflow on the prefetch status itf was sent. Now the queue
   2399     // has received new data, signal it has sufficient data
   2400     if (IsInterfaceInitialized(&ap->mObject, MPH_PREFETCHSTATUS)) {
   2401         // we wouldn't have been called unless we were previously in the underflow state
   2402         assert(SL_PREFETCHSTATUS_UNDERFLOW == ap->mPrefetchStatus.mStatus);
   2403         assert(0 == ap->mPrefetchStatus.mLevel);
   2404         ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_SUFFICIENTDATA;
   2405         ap->mPrefetchStatus.mLevel = 1000;
   2406         // callback or no callback?
   2407         SLuint32 prefetchEvents = ap->mPrefetchStatus.mCallbackEventsMask &
   2408                 (SL_PREFETCHEVENT_STATUSCHANGE | SL_PREFETCHEVENT_FILLLEVELCHANGE);
   2409         if (SL_PREFETCHEVENT_NONE != prefetchEvents) {
   2410             ap->mPrefetchStatus.mDeferredPrefetchCallback = ap->mPrefetchStatus.mCallback;
   2411             ap->mPrefetchStatus.mDeferredPrefetchContext  = ap->mPrefetchStatus.mContext;
   2412             ap->mPrefetchStatus.mDeferredPrefetchEvents   = prefetchEvents;
   2413         }
   2414     }
   2415 }
   2416 
   2417 
   2418 //-----------------------------------------------------------------------------
   2419 /*
   2420  * BufferQueue::Clear
   2421  */
   2422 SLresult android_audioPlayer_bufferQueue_onClear(CAudioPlayer *ap) {
   2423     SLresult result = SL_RESULT_SUCCESS;
   2424 
   2425     switch (ap->mAndroidObjType) {
   2426     //-----------------------------------
   2427     // AudioTrack
   2428     case AUDIOPLAYER_FROM_PCM_BUFFERQUEUE:
   2429         if (ap->mAudioTrack != 0) {
   2430             ap->mAudioTrack->flush();
   2431         }
   2432         break;
   2433     default:
   2434         result = SL_RESULT_INTERNAL_ERROR;
   2435         break;
   2436     }
   2437 
   2438     return result;
   2439 }
   2440 
   2441 
   2442 //-----------------------------------------------------------------------------
   2443 void android_audioPlayer_androidBufferQueue_clear_l(CAudioPlayer *ap) {
   2444     switch (ap->mAndroidObjType) {
   2445     case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE:
   2446       if (ap->mAPlayer != 0) {
   2447         android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(ap->mAPlayer.get());
   2448         splr->appClear_l();
   2449       } break;
   2450     case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2451       // nothing to do here, fall through
   2452     default:
   2453       break;
   2454     }
   2455 }
   2456 
   2457 void android_audioPlayer_androidBufferQueue_onRefilled_l(CAudioPlayer *ap) {
   2458     switch (ap->mAndroidObjType) {
   2459     case AUDIOPLAYER_FROM_TS_ANDROIDBUFFERQUEUE:
   2460       if (ap->mAPlayer != 0) {
   2461         android::StreamPlayer* splr = static_cast<android::StreamPlayer*>(ap->mAPlayer.get());
   2462         splr->queueRefilled();
   2463       } break;
   2464     case AUDIOPLAYER_FROM_ADTS_ABQ_TO_PCM_BUFFERQUEUE:
   2465       // FIXME this may require waking up the decoder if it is currently starved and isn't polling
   2466     default:
   2467       break;
   2468     }
   2469 }
   2470