Loading services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java +27 −90 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -49,130 +48,83 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { @Override public Properties getProperties() { try { return mUnderlying.getProperties(); } catch (RuntimeException e) { throw handleException(e); } } @Override public int loadSoundModel(ISoundTriggerHw.SoundModel soundModel, Callback callback, int cookie) { try { int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), cookie); int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), cookie); synchronized (mModelStates) { mModelStates.put(handle, false); } return handle; } catch (RuntimeException e) { throw handleException(e); } } @Override public int loadPhraseSoundModel(ISoundTriggerHw.PhraseSoundModel soundModel, Callback callback, int cookie) { try { int handle = mUnderlying.loadPhraseSoundModel(soundModel, new CallbackEnforcer(callback), int handle = mUnderlying.loadPhraseSoundModel(soundModel, new CallbackEnforcer(callback), cookie); synchronized (mModelStates) { mModelStates.put(handle, false); } return handle; } catch (RuntimeException e) { throw handleException(e); } } @Override public void unloadSoundModel(int modelHandle) { try { mUnderlying.unloadSoundModel(modelHandle); synchronized (mModelStates) { mModelStates.remove(modelHandle); } } catch (RuntimeException e) { throw handleException(e); } } @Override public void stopRecognition(int modelHandle) { try { mUnderlying.stopRecognition(modelHandle); synchronized (mModelStates) { mModelStates.replace(modelHandle, false); } } catch (RuntimeException e) { throw handleException(e); } } @Override public void stopAllRecognitions() { try { mUnderlying.stopAllRecognitions(); synchronized (mModelStates) { for (Map.Entry<Integer, Boolean> 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); mUnderlying.startRecognition(modelHandle, config, new CallbackEnforcer(callback), cookie); synchronized (mModelStates) { mModelStates.replace(modelHandle, true); } } catch (RuntimeException e) { throw handleException(e); } } @Override public void getModelState(int modelHandle) { try { mUnderlying.getModelState(modelHandle); } catch (RuntimeException e) { throw handleException(e); } } @Override public int getModelParameter(int modelHandle, int param) { try { return mUnderlying.getModelParameter(modelHandle, param); } catch (RuntimeException e) { throw handleException(e); } } @Override public void setModelParameter(int modelHandle, int param, int value) { try { mUnderlying.setModelParameter(modelHandle, param, value); } catch (RuntimeException e) { throw handleException(e); } } @Override public ModelParameterRange queryParameter(int modelHandle, int param) { try { return mUnderlying.queryParameter(modelHandle, param); } catch (RuntimeException e) { throw handleException(e); } } @Override Loading @@ -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; Loading @@ -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) { Loading @@ -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) { Loading services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java +40 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } } } /** Loading Loading
services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerHw2Enforcer.java +27 −90 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -49,130 +48,83 @@ public class SoundTriggerHw2Enforcer implements ISoundTriggerHw2 { @Override public Properties getProperties() { try { return mUnderlying.getProperties(); } catch (RuntimeException e) { throw handleException(e); } } @Override public int loadSoundModel(ISoundTriggerHw.SoundModel soundModel, Callback callback, int cookie) { try { int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), cookie); int handle = mUnderlying.loadSoundModel(soundModel, new CallbackEnforcer(callback), cookie); synchronized (mModelStates) { mModelStates.put(handle, false); } return handle; } catch (RuntimeException e) { throw handleException(e); } } @Override public int loadPhraseSoundModel(ISoundTriggerHw.PhraseSoundModel soundModel, Callback callback, int cookie) { try { int handle = mUnderlying.loadPhraseSoundModel(soundModel, new CallbackEnforcer(callback), int handle = mUnderlying.loadPhraseSoundModel(soundModel, new CallbackEnforcer(callback), cookie); synchronized (mModelStates) { mModelStates.put(handle, false); } return handle; } catch (RuntimeException e) { throw handleException(e); } } @Override public void unloadSoundModel(int modelHandle) { try { mUnderlying.unloadSoundModel(modelHandle); synchronized (mModelStates) { mModelStates.remove(modelHandle); } } catch (RuntimeException e) { throw handleException(e); } } @Override public void stopRecognition(int modelHandle) { try { mUnderlying.stopRecognition(modelHandle); synchronized (mModelStates) { mModelStates.replace(modelHandle, false); } } catch (RuntimeException e) { throw handleException(e); } } @Override public void stopAllRecognitions() { try { mUnderlying.stopAllRecognitions(); synchronized (mModelStates) { for (Map.Entry<Integer, Boolean> 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); mUnderlying.startRecognition(modelHandle, config, new CallbackEnforcer(callback), cookie); synchronized (mModelStates) { mModelStates.replace(modelHandle, true); } } catch (RuntimeException e) { throw handleException(e); } } @Override public void getModelState(int modelHandle) { try { mUnderlying.getModelState(modelHandle); } catch (RuntimeException e) { throw handleException(e); } } @Override public int getModelParameter(int modelHandle, int param) { try { return mUnderlying.getModelParameter(modelHandle, param); } catch (RuntimeException e) { throw handleException(e); } } @Override public void setModelParameter(int modelHandle, int param, int value) { try { mUnderlying.setModelParameter(modelHandle, param, value); } catch (RuntimeException e) { throw handleException(e); } } @Override public ModelParameterRange queryParameter(int modelHandle, int param) { try { return mUnderlying.queryParameter(modelHandle, param); } catch (RuntimeException e) { throw handleException(e); } } @Override Loading @@ -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; Loading @@ -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) { Loading @@ -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) { Loading
services/core/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareService.java +40 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } } } /** Loading