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
Merged-In: I2ca01b76d701e7f5db7ba08d159bba843b145e4e
Change-Id: I2ca01b76d701e7f5db7ba08d159bba843b145e4e
(cherry picked from commit 2e76f6b609)
This commit is contained in:
Eric Laurent
2022-08-04 11:54:12 +02:00
committed by Andy Hung
parent 9c48327f61
commit 4b7cd0aa01
2 changed files with 33 additions and 10 deletions

View File

@@ -348,6 +348,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(),
@@ -355,6 +356,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
@@ -8181,6 +8183,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;
@@ -9159,6 +9165,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);

View File

@@ -383,10 +383,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;
}
}
@@ -398,6 +398,10 @@ public class SpatializerHelper {
}
}
private void postReset() {
mAudioService.postResetSpatializer();
}
//------------------------------------------------------
// spatializer callback from native
private final class SpatializerCallback extends INativeSpatializerCallback.Stub {
@@ -1168,8 +1172,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;
}
@@ -1259,8 +1266,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;
}
@@ -1283,8 +1290,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;
}