diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java index d98ad74a9d6b6..a18b690f08cd2 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java @@ -23,7 +23,6 @@ import android.hardware.soundtrigger.V2_3.Properties; import android.hardware.soundtrigger.V2_3.RecognitionConfig; import android.os.IHwBinder; import android.os.RemoteException; -import android.os.SystemProperties; import android.util.Log; import java.util.HashMap; @@ -49,130 +48,83 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { @Override public Properties getProperties() { - try { - return mUnderlying.getProperties(); - } catch (RuntimeException e) { - throw handleException(e); - } + return mUnderlying.getProperties(); } @Override public int loadSoundModel(ISoundTriggerHw.SoundModel soundModel, Callback callback, int cookie) { - try { - int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), - cookie); - synchronized (mModelStates) { - mModelStates.put(handle, false); - } - return handle; - } catch (RuntimeException e) { - throw handleException(e); + int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), cookie); + synchronized (mModelStates) { + mModelStates.put(handle, false); } + return handle; } @Override public int loadPhraseSoundModel(ISoundTriggerHw.PhraseSoundModel soundModel, Callback callback, int cookie) { - try { - int handle = mUnderlying.loadPhraseSoundModel(soundModel, - new CallbackEnforcer(callback), - cookie); - synchronized (mModelStates) { - mModelStates.put(handle, false); - } - return handle; - } catch (RuntimeException e) { - throw handleException(e); + int handle = mUnderlying.loadPhraseSoundModel(soundModel, new CallbackEnforcer(callback), + cookie); + synchronized (mModelStates) { + mModelStates.put(handle, false); } + return handle; } @Override public void unloadSoundModel(int modelHandle) { - try { - mUnderlying.unloadSoundModel(modelHandle); - synchronized (mModelStates) { - mModelStates.remove(modelHandle); - } - } catch (RuntimeException e) { - throw handleException(e); + mUnderlying.unloadSoundModel(modelHandle); + synchronized (mModelStates) { + mModelStates.remove(modelHandle); } } @Override public void stopRecognition(int modelHandle) { - try { - mUnderlying.stopRecognition(modelHandle); - synchronized (mModelStates) { - mModelStates.replace(modelHandle, false); - } - } catch (RuntimeException e) { - throw handleException(e); + mUnderlying.stopRecognition(modelHandle); + synchronized (mModelStates) { + mModelStates.replace(modelHandle, false); } } @Override public void stopAllRecognitions() { - try { - mUnderlying.stopAllRecognitions(); - synchronized (mModelStates) { - for (Map.Entry entry : mModelStates.entrySet()) { - entry.setValue(false); - } + mUnderlying.stopAllRecognitions(); + synchronized (mModelStates) { + for (Map.Entry entry : mModelStates.entrySet()) { + entry.setValue(false); } - } catch (RuntimeException e) { - throw handleException(e); } } @Override public void startRecognition(int modelHandle, RecognitionConfig config, Callback callback, int cookie) { - try { - mUnderlying.startRecognition(modelHandle, config, new CallbackEnforcer(callback), - cookie); - synchronized (mModelStates) { - mModelStates.replace(modelHandle, true); - } - } catch (RuntimeException e) { - throw handleException(e); + mUnderlying.startRecognition(modelHandle, config, new CallbackEnforcer(callback), cookie); + synchronized (mModelStates) { + mModelStates.replace(modelHandle, true); } } @Override public void getModelState(int modelHandle) { - try { - mUnderlying.getModelState(modelHandle); - } catch (RuntimeException e) { - throw handleException(e); - } + mUnderlying.getModelState(modelHandle); } @Override public int getModelParameter(int modelHandle, int param) { - try { - return mUnderlying.getModelParameter(modelHandle, param); - } catch (RuntimeException e) { - throw handleException(e); - } + return mUnderlying.getModelParameter(modelHandle, param); } @Override public void setModelParameter(int modelHandle, int param, int value) { - try { - mUnderlying.setModelParameter(modelHandle, param, value); - } catch (RuntimeException e) { - throw handleException(e); - } + mUnderlying.setModelParameter(modelHandle, param, value); } @Override public ModelParameterRange queryParameter(int modelHandle, int param) { - try { - return mUnderlying.queryParameter(modelHandle, param); - } catch (RuntimeException e) { - throw handleException(e); - } + return mUnderlying.queryParameter(modelHandle, param); } @Override @@ -190,17 +142,6 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { return mUnderlying.interfaceDescriptor(); } - private static RuntimeException handleException(RuntimeException e) { - Log.e(TAG, "Exception caught from HAL, rebooting HAL"); - rebootHal(); - throw e; - } - - private static void rebootHal() { - // This property needs to be defined in an init.rc script and trigger a HAL reboot. - SystemProperties.set("sys.audio.restart.hal", "1"); - } - private class CallbackEnforcer implements Callback { private final Callback mUnderlying; @@ -216,8 +157,6 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { synchronized (mModelStates) { if (!mModelStates.getOrDefault(model, false)) { Log.wtfStack(TAG, "Unexpected recognition event for model: " + model); - rebootHal(); - return; } if (event.header.status != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) { @@ -234,8 +173,6 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { synchronized (mModelStates) { if (!mModelStates.getOrDefault(model, false)) { Log.wtfStack(TAG, "Unexpected recognition event for model: " + model); - rebootHal(); - return; } if (event.common.header.status != android.media.soundtrigger_middleware.RecognitionStatus.FORCED) { diff --git a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java index 4b464d2d3e044..635cb613b934d 100644 --- a/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java +++ b/services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java @@ -27,7 +27,9 @@ import android.media.soundtrigger_middleware.PhraseSoundModel; import android.media.soundtrigger_middleware.RecognitionConfig; import android.media.soundtrigger_middleware.SoundModel; import android.media.soundtrigger_middleware.SoundTriggerModuleDescriptor; +import android.os.Parcel; import android.os.RemoteException; +import android.os.SystemProperties; import android.util.Log; import com.android.server.SystemService; @@ -99,6 +101,28 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic } } + @Override + public boolean onTransact(int code, Parcel data, Parcel reply, int flags) + throws RemoteException { + try { + return super.onTransact(code, data, reply, flags); + } catch (InternalServerError e) { + if (e.getCause() instanceof HalException) { + // We recover from any sort of HAL failure by rebooting the HAL process. + // This will likely reboot more than just the sound trigger HAL. + // The rest of the system should be able to tolerate that. + rebootHal(); + } + throw e; + } + } + + private static void rebootHal() { + Log.i(TAG, "Rebooting the sound trigger HAL"); + // This property needs to be defined in an init.rc script and trigger a HAL reboot. + SystemProperties.set("sys.audio.restart.hal", "1"); + } + private final static class ModuleService extends ISoundTriggerModule.Stub { private final ISoundTriggerModule mDelegate; @@ -158,6 +182,22 @@ public class SoundTriggerMiddlewareService extends ISoundTriggerMiddlewareServic public void detach() throws RemoteException { mDelegate.detach(); } + + @Override + public boolean onTransact(int code, Parcel data, Parcel reply, int flags) + throws RemoteException { + try { + return super.onTransact(code, data, reply, flags); + } catch (InternalServerError e) { + if (e.getCause() instanceof HalException) { + // We recover from any sort of HAL failure by rebooting the HAL process. + // This will likely reboot more than just the sound trigger HAL. + // The rest of the system should be able to tolerate that. + rebootHal(); + } + throw e; + } + } } /**