add SoundTrigger HAL V2.3 support

add support for model parameter control APIs with THRESHOLD_FACTOR
as the first supported parameter

Bug: 141929369
Test: Tested manually with test app and confirmed with GTS test
gts-tradefed run gts-dev -m GtsAssistIntentTestCases
Change-Id: I613dfe7486b4b4b695c79bda515b9f07fe750a70
diff --git a/soundtrigger/ISoundTrigger.cpp b/soundtrigger/ISoundTrigger.cpp
index f5b4b59..9b1da13 100644
--- a/soundtrigger/ISoundTrigger.cpp
+++ b/soundtrigger/ISoundTrigger.cpp
@@ -33,6 +33,9 @@
     START_RECOGNITION,
     STOP_RECOGNITION,
     GET_MODEL_STATE,
+    SET_PARAMETER,
+    GET_PARAMETER,
+    QUERY_PARAMETER,
 };
 
 class BpSoundTrigger: public BpInterface<ISoundTrigger>
@@ -126,6 +129,55 @@
         return status;
     }
 
+    virtual status_t setParameter(sound_model_handle_t handle,
+                                     sound_trigger_model_parameter_t param,
+                                     int32_t value)
+    {
+        Parcel data, reply;
+        data.writeInterfaceToken(ISoundTrigger::getInterfaceDescriptor());
+        data.write(&handle, sizeof(sound_model_handle_t));
+        data.write(&param, sizeof(sound_trigger_model_parameter_t));
+        data.writeInt32(value);
+        status_t status = remote()->transact(SET_PARAMETER, data, &reply);
+        if (status == NO_ERROR) {
+            status = (status_t)reply.readInt32();
+        }
+        return status;
+    }
+
+    virtual status_t getParameter(sound_model_handle_t handle,
+                                     sound_trigger_model_parameter_t param,
+                                     int32_t* value)
+    {
+        Parcel data, reply;
+        data.writeInterfaceToken(ISoundTrigger::getInterfaceDescriptor());
+        data.write(&handle, sizeof(sound_model_handle_t));
+        data.write(&param, sizeof(sound_trigger_model_parameter_t));
+        status_t status = remote()->transact(GET_PARAMETER, data, &reply);
+        if (status == NO_ERROR) {
+            status = (status_t)reply.readInt32();
+            *value = reply.readInt32();
+        }
+        return status;
+    }
+
+    virtual status_t queryParameter(sound_model_handle_t handle,
+            sound_trigger_model_parameter_t param,
+            sound_trigger_model_parameter_range_t* param_range)
+    {
+        Parcel data, reply;
+        data.writeInterfaceToken(ISoundTrigger::getInterfaceDescriptor());
+        data.write(&handle, sizeof(sound_model_handle_t));
+        data.write(&param, sizeof(sound_trigger_model_parameter_t));
+        status_t status = remote()->transact(QUERY_PARAMETER, data, &reply);
+        if (status == NO_ERROR) {
+            status = (status_t)reply.readInt32();
+            param_range->start = reply.readInt32();
+            param_range->end = reply.readInt32();
+        }
+        return status;
+    }
+
 };
 
 IMPLEMENT_META_INTERFACE(SoundTrigger, "android.hardware.ISoundTrigger");
@@ -193,6 +245,70 @@
             reply->writeInt32(status);
             return ret;
         }
+        case SET_PARAMETER: {
+            CHECK_INTERFACE(ISoundTrigger, data, reply);
+            sound_model_handle_t handle;
+            sound_trigger_model_parameter_t param;
+            int32_t value;
+            status_t status = UNKNOWN_ERROR;
+            status_t ret;
+            ret = data.read(&handle, sizeof(sound_model_handle_t));
+            if (ret != NO_ERROR) {
+                return ret;
+            }
+            ret = data.read(&param, sizeof(sound_trigger_model_parameter_t));
+            if (ret != NO_ERROR) {
+                return ret;
+            }
+            ret = data.read(&value, sizeof(int32_t));
+            if (ret != NO_ERROR) {
+                return ret;
+            }
+            status = setParameter(handle, param, value);
+            reply->writeInt32(status);
+            return NO_ERROR;
+        }
+        case GET_PARAMETER: {
+            CHECK_INTERFACE(ISoundTrigger, data, reply);
+            sound_model_handle_t handle;
+            sound_trigger_model_parameter_t param;
+            int32_t value;
+            status_t status = UNKNOWN_ERROR;
+            status_t ret;
+            ret = data.read(&handle, sizeof(sound_model_handle_t));
+            if (ret != NO_ERROR) {
+                return ret;
+            }
+            ret = data.read(&param, sizeof(sound_trigger_model_parameter_t));
+            if (ret != NO_ERROR) {
+                return ret;
+            }
+            status = getParameter(handle, param, &value);
+            reply->writeInt32(status);
+            reply->writeInt32(value);
+            return NO_ERROR;
+        }
+        case QUERY_PARAMETER: {
+            CHECK_INTERFACE(ISoundTrigger, data, reply);
+            sound_model_handle_t handle;
+            sound_trigger_model_parameter_t param;
+            status_t ret;
+            status_t status = UNKNOWN_ERROR;
+            sound_trigger_model_parameter_range_t retValue;
+            ret = data.read(&handle, sizeof(sound_model_handle_t));
+            if (ret != NO_ERROR) {
+                return ret;
+            }
+            ret = data.read(&param, sizeof(sound_trigger_model_parameter_t));
+            if (ret != NO_ERROR) {
+                return ret;
+            }
+            status = queryParameter(handle, param, &retValue);
+            reply->writeInt32(status);
+            reply->writeInt32(retValue.start);
+            reply->writeInt32(retValue.end);
+            return NO_ERROR;
+        }
         default:
             return BBinder::onTransact(code, data, reply, flags);
     }