AudioService: Fix SpatializerHelper asserts
Fix state update in onRoutingUpdated() in case of failure to communicate to the native spatializer: this can cause an exception later in setDispatchFeatureEnabledState(). Instead, try to recover by triggering a reset. Fix other places where exceptions are thrown instead of just logging an error or triggering a reset. Bug: 241018866 Test: make Change-Id: I2ca01b76d701e7f5db7ba08d159bba843b145e4e
This commit is contained in:
@@ -368,6 +368,7 @@ public class AudioService extends IAudioService.Stub
|
||||
private static final int MSG_DISPATCH_DEVICE_VOLUME_BEHAVIOR = 47;
|
||||
private static final int MSG_ROTATION_UPDATE = 48;
|
||||
private static final int MSG_FOLD_UPDATE = 49;
|
||||
private static final int MSG_RESET_SPATIALIZER = 50;
|
||||
|
||||
// start of messages handled under wakelock
|
||||
// these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),
|
||||
@@ -375,6 +376,7 @@ public class AudioService extends IAudioService.Stub
|
||||
private static final int MSG_DISABLE_AUDIO_FOR_UID = 100;
|
||||
private static final int MSG_INIT_STREAMS_VOLUMES = 101;
|
||||
private static final int MSG_INIT_SPATIALIZER = 102;
|
||||
|
||||
// end of messages handled under wakelock
|
||||
|
||||
// retry delay in case of failure to indicate system ready to AudioFlinger
|
||||
@@ -8297,6 +8299,10 @@ public class AudioService extends IAudioService.Stub
|
||||
onPersistSpatialAudioDeviceSettings();
|
||||
break;
|
||||
|
||||
case MSG_RESET_SPATIALIZER:
|
||||
mSpatializerHelper.reset(/* featureEnabled */ mHasSpatializerEffect);
|
||||
break;
|
||||
|
||||
case MSG_CHECK_MUSIC_ACTIVE:
|
||||
onCheckMusicActive((String) msg.obj);
|
||||
break;
|
||||
@@ -9275,6 +9281,16 @@ public class AudioService extends IAudioService.Stub
|
||||
/*arg1*/ 0, /*arg2*/ 0, TAG, /*delay*/ 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* post a message to schedule a reset of the spatializer state
|
||||
*/
|
||||
void postResetSpatializer() {
|
||||
sendMsg(mAudioHandler,
|
||||
MSG_RESET_SPATIALIZER,
|
||||
SENDMSG_REPLACE,
|
||||
/*arg1*/ 0, /*arg2*/ 0, TAG, /*delay*/ 0);
|
||||
}
|
||||
|
||||
void onInitSpatializer() {
|
||||
final String settings = mSettings.getSecureStringForUser(mContentResolver,
|
||||
Settings.Secure.SPATIAL_AUDIO_ENABLED, UserHandle.USER_CURRENT);
|
||||
|
||||
@@ -389,10 +389,10 @@ public class SpatializerHelper {
|
||||
try {
|
||||
mSpat.setLevel(level);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "Can't set spatializer level", e);
|
||||
mState = STATE_NOT_SUPPORTED;
|
||||
mCapableSpatLevel = Spatializer.SPATIALIZER_IMMERSIVE_LEVEL_NONE;
|
||||
enabled = false;
|
||||
Log.e(TAG, "onRoutingUpdated() Can't set spatializer level", e);
|
||||
// try to recover by resetting the native spatializer state
|
||||
postReset();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,6 +404,10 @@ public class SpatializerHelper {
|
||||
}
|
||||
}
|
||||
|
||||
private void postReset() {
|
||||
mAudioService.postResetSpatializer();
|
||||
}
|
||||
|
||||
//------------------------------------------------------
|
||||
// spatializer callback from native
|
||||
private final class SpatializerCallback extends INativeSpatializerCallback.Stub {
|
||||
@@ -1161,8 +1165,11 @@ public class SpatializerHelper {
|
||||
case STATE_DISABLED_AVAILABLE:
|
||||
case STATE_ENABLED_AVAILABLE:
|
||||
if (mSpat == null) {
|
||||
throw (new IllegalStateException(
|
||||
"null Spatializer when calling " + funcName));
|
||||
// try to recover by resetting the native spatializer state
|
||||
Log.e(TAG, "checkSpatForHeadTracking(): "
|
||||
+ "native spatializer should not be null in state: " + mState);
|
||||
postReset();
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1252,8 +1259,8 @@ public class SpatializerHelper {
|
||||
case STATE_DISABLED_AVAILABLE:
|
||||
case STATE_ENABLED_AVAILABLE:
|
||||
if (mSpat == null) {
|
||||
throw (new IllegalStateException(
|
||||
"null Spatializer for setParameter for key:" + key));
|
||||
Log.e(TAG, "setParameter(" + key + "): null spatializer in state: " + mState);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1276,8 +1283,8 @@ public class SpatializerHelper {
|
||||
case STATE_DISABLED_AVAILABLE:
|
||||
case STATE_ENABLED_AVAILABLE:
|
||||
if (mSpat == null) {
|
||||
throw (new IllegalStateException(
|
||||
"null Spatializer for getParameter for key:" + key));
|
||||
Log.e(TAG, "getParameter(" + key + "): null spatializer in state: " + mState);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user