+ // AndroidBufferQueue-specific initialization
+ if (XA_DATALOCATOR_ANDROIDBUFFERQUEUE ==
+ thiz->mDataSource.mLocator.mLocatorType) {
+ XAuint16 nbBuffers = (XAuint16) thiz->mDataSource.mLocator.mABQ.numBuffers;
+
+ // Avoid possible integer overflow during multiplication; this arbitrary
+ // maximum is big enough to not interfere with real applications, but
+ // small enough to not overflow.
+ if (nbBuffers >= 256) {
+ result = SL_RESULT_MEMORY_FAILURE;
+ break;
+ }
+
+ // initialize ABQ buffer type
+ // assert below has been checked in android_audioPlayer_checkSourceSink
+ assert(XA_DATAFORMAT_MIME == thiz->mDataSource.mFormat.mFormatType);
+ if (XA_CONTAINERTYPE_MPEG_TS ==
+ thiz->mDataSource.mFormat.mMIME.containerType) {
+ thiz->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeMpeg2Ts;
+
+ // Set the container type for the StreamInformation interface
+ XAMediaContainerInformation *containerInfo =
+ (XAMediaContainerInformation*)
+ // always storing container info at index 0, as per spec
+ &(thiz->mStreamInfo.mStreamInfoTable.itemAt(0).
+ containerInfo);
+ containerInfo->containerType = XA_CONTAINERTYPE_MPEG_TS;
+ // there are no streams at this stage
+ containerInfo->numStreams = 0;
+
+ } else {
+ thiz->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeInvalid;
+ SL_LOGE("Invalid buffer type in Android Buffer Queue");
+ result = SL_RESULT_CONTENT_UNSUPPORTED;
+ }
+
+ // initialize ABQ memory
+ thiz->mAndroidBufferQueue.mBufferArray = (AdvancedBufferHeader *)
+ malloc( (nbBuffers + 1) * sizeof(AdvancedBufferHeader));
+ if (NULL == thiz->mAndroidBufferQueue.mBufferArray) {
+ result = SL_RESULT_MEMORY_FAILURE;
+ break;
+ } else {
+ for (XAuint16 i=0 ; i<(nbBuffers + 1) ; i++) {
+ thiz->mAndroidBufferQueue.mBufferArray[i].mDataBuffer = NULL;
+ thiz->mAndroidBufferQueue.mBufferArray[i].mDataSize = 0;
+ thiz->mAndroidBufferQueue.mBufferArray[i].mDataSizeConsumed = 0;
+ thiz->mAndroidBufferQueue.mBufferArray[i].mBufferContext = NULL;
+ thiz->mAndroidBufferQueue.mBufferArray[i].mBufferState =
+ XA_ANDROIDBUFFERQUEUEEVENT_NONE;
+ switch (thiz->mAndroidBufferQueue.mBufferType) {
+ case kAndroidBufferTypeMpeg2Ts:
+ thiz->mAndroidBufferQueue.mBufferArray[i].mItems.mTsCmdData.
+ mTsCmdCode = ANDROID_MP2TSEVENT_NONE;
+ thiz->mAndroidBufferQueue.mBufferArray[i].mItems.mTsCmdData.
+ mPts = 0;
+ break;
+ default:
+ result = SL_RESULT_CONTENT_UNSUPPORTED;
+ break;
+ }
+ }
+ thiz->mAndroidBufferQueue.mFront =
+ thiz->mAndroidBufferQueue.mBufferArray;
+ thiz->mAndroidBufferQueue.mRear =
+ thiz->mAndroidBufferQueue.mBufferArray;
+ }
+
+ thiz->mAndroidBufferQueue.mNumBuffers = nbBuffers;
+
+ }
+
+ // used to store the data source of our audio player
+ thiz->mDynamicSource.mDataSource = &thiz->mDataSource.u.mSource;
+