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();