}
break;
+ case android::GenericPlayer::kEventErrorAfterPrepare: {
+ SL_LOGI("kEventErrorAfterPrepare");
+
+ // assume no callback
+ slPrefetchCallback callback = NULL;
+ void* callbackPContext = NULL;
+
+ object_lock_exclusive(&ap->mObject);
+ if (IsInterfaceInitialized(&ap->mObject, MPH_PREFETCHSTATUS)) {
+ SL_LOGI("inited");
+ ap->mPrefetchStatus.mLevel = 0;
+ ap->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
+ if (!(~ap->mPrefetchStatus.mCallbackEventsMask &
+ (SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE))) {
+ SL_LOGI("enabled");
+ callback = ap->mPrefetchStatus.mCallback;
+ callbackPContext = ap->mPrefetchStatus.mContext;
+ }
+ }
+ object_unlock_exclusive(&ap->mObject);
+
+ // FIXME there's interesting information in data1, but no API to convey it to client
+ SL_LOGE("Error after prepare: %d", data1);
+
+ // callback with no lock held
+ SL_LOGE("callback=%p context=%p", callback, callbackPContext);
+ if (NULL != callback) {
+ (*callback)(&ap->mPrefetchStatus.mItf, callbackPContext,
+ SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE);
+ }
+
+ }
+ break;
+
+
default:
break;
}
}
break;
+ case android::GenericPlayer::kEventErrorAfterPrepare: {
+ SL_LOGV("kEventErrorAfterPrepare");
+
+ // assume no callback
+ slPrefetchCallback callback = NULL;
+ void* callbackPContext = NULL;
+
+ object_lock_exclusive(&mp->mObject);
+ if (IsInterfaceInitialized(&mp->mObject, MPH_XAPREFETCHSTATUS)) {
+ mp->mPrefetchStatus.mLevel = 0;
+ mp->mPrefetchStatus.mStatus = SL_PREFETCHSTATUS_UNDERFLOW;
+ if (!(~mp->mPrefetchStatus.mCallbackEventsMask &
+ (SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE))) {
+ callback = mp->mPrefetchStatus.mCallback;
+ callbackPContext = mp->mPrefetchStatus.mContext;
+ }
+ }
+ object_unlock_exclusive(&mp->mObject);
+
+ // FIXME there's interesting information in data1, but no API to convey it to client
+ SL_LOGE("Error after prepare: %d", data1);
+
+ // callback with no lock held
+ if (NULL != callback) {
+ (*callback)(&mp->mPrefetchStatus.mItf, callbackPContext,
+ SL_PREFETCHEVENT_FILLLEVELCHANGE | SL_PREFETCHEVENT_STATUSCHANGE);
+ }
+
+ }
+ break;
+
default: {
SL_LOGE("Received unknown event %d, data %d from AVPlayer", event, data1);
}
mPlayerPrepared = PREPARE_COMPLETED_UNSUCCESSFULLY;
mPlayerPreparedCondition.signal();
} else {
- // FIXME Currently no mechanism to inform client of errors after preparation
+ // inform client of errors after preparation
+ genericMediaPlayer->notify(PLAYEREVENT_ERRORAFTERPREPARE, ext1, true /*async*/);
}
}
break;
} else if (msg->findInt32(PLAYEREVENT_PLAY, &val1)) {
SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_PLAY, val1);
notifClient(kEventPlay, val1, 0, notifUser);
+ } else if (msg->findInt32(PLAYEREVENT_ERRORAFTERPREPARE, &val1)) {
+ SL_LOGV("GenericPlayer notifying %s = %d", PLAYEREVENT_ERRORAFTERPREPARE, val1);
+ notifClient(kEventErrorAfterPrepare, val1, 0, notifUser);
} else {
SL_LOGV("GenericPlayer notifying unknown");
}
kEventEndOfStream = 'eos',
kEventChannelCount = 'ccnt',
kEventPlay = 'play', // SL_PLAYEVENT_*
+ kEventErrorAfterPrepare = 'easp', // error after successful prepare
};
#define PLAYEREVENT_VIDEO_SIZE_UPDATE "vsiz"
#define PLAYEREVENT_CHANNEL_COUNT "ccnt" // channel count is now known
#define PLAYEREVENT_PLAY "play" // SL_PLAYEVENT_*
+#define PLAYEREVENT_ERRORAFTERPREPARE "easp" // error after successful prepare
/**