OSDN Git Service

Bug 5526807 inform client of errors after prepare
authorGlenn Kasten <gkasten@google.com>
Thu, 27 Oct 2011 21:16:20 +0000 (14:16 -0700)
committerGlenn Kasten <gkasten@google.com>
Thu, 27 Oct 2011 21:16:20 +0000 (14:16 -0700)
Change-Id: Ic5c88f8e1c8e7d6226a7a71a2a89a70f0fa876f8

wilhelm/src/android/AudioPlayer_to_android.cpp
wilhelm/src/android/MediaPlayer_to_android.cpp
wilhelm/src/android/android_GenericMediaPlayer.cpp
wilhelm/src/android/android_GenericPlayer.cpp
wilhelm/src/android/android_GenericPlayer.h
wilhelm/src/android/android_defs.h

index f904fbd..8a41ddb 100644 (file)
@@ -838,6 +838,41 @@ static void sfplayer_handlePrefetchEvent(int event, int data1, int data2, void*
         }
         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;
     }
index 97217d7..43240db 100644 (file)
@@ -244,6 +244,37 @@ static void player_handleMediaPlayerEventNotifications(int event, int data1, int
       }
       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);
       }
index 256e133..8ff9841 100644 (file)
@@ -136,7 +136,8 @@ void MediaPlayerNotificationClient::notify(int msg, int ext1, int ext2, const Pa
             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;
index bfc9db2..d7a6d67 100644 (file)
@@ -428,6 +428,9 @@ void GenericPlayer::onNotify(const sp<AMessage> &msg) {
     } 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");
     }
index 16ee14e..fff2172 100644 (file)
@@ -52,6 +52,7 @@ public:
         kEventEndOfStream             = 'eos',
         kEventChannelCount            = 'ccnt',
         kEventPlay                    = 'play', // SL_PLAYEVENT_*
+        kEventErrorAfterPrepare       = 'easp', // error after successful prepare
     };
 
 
index 6f8ecc8..05755fd 100644 (file)
@@ -114,6 +114,7 @@ typedef size_t (*data_push_cbf_t)(const uint8_t *data, size_t size, CAudioPlayer
 #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
 
 
 /**