OSDN Git Service

Fix SoundPool lockup
authorMarco Nelissen <marcone@google.com>
Tue, 26 Aug 2014 20:57:32 +0000 (13:57 -0700)
committerMarco Nelissen <marcone@google.com>
Tue, 26 Aug 2014 21:14:42 +0000 (14:14 -0700)
NuPlayerDriver needs to update its internal state before calling
its listener, so that when the listener calls back into NuPlayerDriver,
NuPlayerDriver has the right state.

Bug: 14057920
Change-Id: I224882c427f5e3c9d4bf96c5d68075e235062401

media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp

index 2f60072..c4bbcdf 100644 (file)
@@ -287,8 +287,9 @@ status_t NuPlayerDriver::stop() {
             // fall through
 
         case STATE_PAUSED:
+            mState = STATE_STOPPED;
             notifyListener_l(MEDIA_STOPPED);
-            // fall through
+            break;
 
         case STATE_PREPARED:
         case STATE_STOPPED:
@@ -314,6 +315,8 @@ status_t NuPlayerDriver::pause() {
             return OK;
 
         case STATE_RUNNING:
+            setPauseStartedTimeIfNeeded();
+            mState = STATE_PAUSED;
             notifyListener_l(MEDIA_PAUSED);
             mPlayer->pause();
             break;
@@ -322,9 +325,6 @@ status_t NuPlayerDriver::pause() {
             return INVALID_OPERATION;
     }
 
-    setPauseStartedTimeIfNeeded();
-    mState = STATE_PAUSED;
-
     return OK;
 }
 
@@ -675,15 +675,17 @@ void NuPlayerDriver::notifyPrepareCompleted(status_t err) {
     mAsyncResult = err;
 
     if (err == OK) {
+        // update state before notifying client, so that if client calls back into NuPlayerDriver
+        // in response, NuPlayerDriver has the right state
+        mState = STATE_PREPARED;
         if (mIsAsyncPrepare) {
             notifyListener_l(MEDIA_PREPARED);
         }
-        mState = STATE_PREPARED;
     } else {
+        mState = STATE_UNPREPARED;
         if (mIsAsyncPrepare) {
             notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
         }
-        mState = STATE_UNPREPARED;
     }
 
     mCondition.broadcast();