Fix SoundPool lockup

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
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index 2f60072..c4bbcdf 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -287,8 +287,9 @@
             // 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 @@
             return OK;
 
         case STATE_RUNNING:
+            setPauseStartedTimeIfNeeded();
+            mState = STATE_PAUSED;
             notifyListener_l(MEDIA_PAUSED);
             mPlayer->pause();
             break;
@@ -322,9 +325,6 @@
             return INVALID_OPERATION;
     }
 
-    setPauseStartedTimeIfNeeded();
-    mState = STATE_PAUSED;
-
     return OK;
 }
 
@@ -675,15 +675,17 @@
     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();