Merge "agm: Changes to enable SwBinders IPC"
diff --git a/ipc/HwBinders/agm_ipc_client/src/agm_client_wrapper.cpp b/ipc/HwBinders/agm_ipc_client/src/agm_client_wrapper.cpp
index 8570662..f7b7df1 100644
--- a/ipc/HwBinders/agm_ipc_client/src/agm_client_wrapper.cpp
+++ b/ipc/HwBinders/agm_ipc_client/src/agm_client_wrapper.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -156,8 +157,7 @@
     ALOGV("%s called audio_intf = %d \n", __func__, audio_intf);
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
-        hidl_vec<AgmMediaConfig> media_config_hidl;
-        media_config_hidl.resize(sizeof(struct agm_media_config));
+        hidl_vec<AgmMediaConfig> media_config_hidl(1);
         media_config_hidl.data()->rate = media_config->rate;
         media_config_hidl.data()->channels = media_config->channels;
         media_config_hidl.data()->format = (::vendor::qti::hardware::AGMIPC::V1_0::AgmMediaFormat) media_config->format;
@@ -175,21 +175,18 @@
     ALOGV("%s called with handle = %llx \n", __func__, (unsigned long long)handle);
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
-        hidl_vec<AgmSessionConfig> session_config_hidl;
-        session_config_hidl.resize(sizeof(struct agm_session_config));
+        hidl_vec<AgmSessionConfig> session_config_hidl(1);
         memcpy(session_config_hidl.data(),
                session_config,
                sizeof(struct agm_session_config));
 
-        hidl_vec<AgmMediaConfig> media_config_hidl;
-        media_config_hidl.resize(sizeof(struct agm_media_config));
+        hidl_vec<AgmMediaConfig> media_config_hidl(1);
         media_config_hidl.data()->rate = media_config->rate;
         media_config_hidl.data()->channels = media_config->channels;
         media_config_hidl.data()->format = (::vendor::qti::hardware::AGMIPC::V1_0::AgmMediaFormat) media_config->format;
         media_config_hidl.data()->data_format = media_config->data_format;
 
-        hidl_vec<AgmBufferConfig> buffer_config_hidl;
-        buffer_config_hidl.resize(sizeof(struct agm_buffer_config));
+        hidl_vec<AgmBufferConfig> buffer_config_hidl(1);
         buffer_config_hidl.data()->count = buffer_config->count;
         buffer_config_hidl.data()->size = buffer_config->size;
         ALOGV("%s : Exit", __func__);
@@ -598,19 +595,14 @@
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
 
-        hidl_vec<AgmTagConfig> tag_cfg_hidl;
-        tag_cfg_hidl.resize(sizeof(struct agm_tag_config) +
-                             (tag_config->num_tkvs)*sizeof(agm_key_value));
+        hidl_vec<AgmTagConfig> tag_cfg_hidl(1);
         tag_cfg_hidl.data()->tag = tag_config->tag;
         tag_cfg_hidl.data()->num_tkvs = tag_config->num_tkvs;
-        AgmKeyValue * ptr = NULL;
-        for (int i=0 ; i < tag_cfg_hidl.data()->num_tkvs ; i++ ) {
-             ptr = (AgmKeyValue *)(tag_cfg_hidl.data()
-                                  + sizeof(struct agm_tag_config)
-                                  + (sizeof(AgmKeyValue) * i));
-             ptr->key = tag_config->kv[i].key;
-             ptr->value = tag_config->kv[i].value;
-    }
+        tag_cfg_hidl.data()->kv.resize(tag_config->num_tkvs);
+        for (int i = 0 ; i < tag_cfg_hidl.data()->num_tkvs ; i++ ) {
+             tag_cfg_hidl.data()->kv[i].key = tag_config->kv[i].key;
+             tag_cfg_hidl.data()->kv[i].value = tag_config->kv[i].value;
+        }
         return agm_client->ipc_agm_set_params_with_tag(session_id,
                                                          aif_id, tag_cfg_hidl);
     }
@@ -641,10 +633,7 @@
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
 
-        hidl_vec<AgmEventRegCfg> evt_reg_cfg_hidl;
-        size_t size_local = sizeof(struct agm_event_reg_cfg) +
-                      (evt_reg_cfg->event_config_payload_size);
-        evt_reg_cfg_hidl.resize(size_local);
+        hidl_vec<AgmEventRegCfg> evt_reg_cfg_hidl(1);
 
         evt_reg_cfg_hidl.data()->module_instance_id = evt_reg_cfg->module_instance_id;
         evt_reg_cfg_hidl.data()->event_id = evt_reg_cfg->event_id;
@@ -667,17 +656,12 @@
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
 
-        hidl_vec<AgmCalConfig> cal_cfg_hidl;
-        cal_cfg_hidl.resize(sizeof(AgmCalConfig) +
-                            (cal_config->num_ckvs)*sizeof(AgmKeyValue));
+        hidl_vec<AgmCalConfig> cal_cfg_hidl(1);
         cal_cfg_hidl.data()->num_ckvs = cal_config->num_ckvs;
-        AgmKeyValue * ptr = NULL;
-        for (int i=0 ; i < cal_cfg_hidl.data()->num_ckvs ; i++ ) {
-            ptr = (AgmKeyValue *) (cal_cfg_hidl.data() +
-                                   sizeof(struct agm_cal_config) +
-                                   (sizeof(AgmKeyValue)*i));
-            ptr->key = cal_config->kv[i].key;
-            ptr->value = cal_config->kv[i].value;
+        cal_cfg_hidl.data()->kv.resize(cal_config->num_ckvs);
+        for (int i = 0; i < cal_cfg_hidl.data()->num_ckvs; i++) {
+            cal_cfg_hidl.data()->kv[i].key = cal_config->kv[i].key;
+            cal_cfg_hidl.data()->kv[i].value = cal_config->kv[i].value;
         }
         return agm_client->ipc_agm_session_aif_set_cal(session_id, aif_id,
                                                                   cal_cfg_hidl);
@@ -862,34 +846,29 @@
 
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
-        hidl_vec<AgmSessionConfig> session_config_hidl;
-        session_config_hidl.resize(sizeof(struct agm_session_config));
+        hidl_vec<AgmSessionConfig> session_config_hidl(1);
         memcpy(session_config_hidl.data(),
                session_config,
                sizeof(struct agm_session_config));
 
-        hidl_vec<AgmMediaConfig> in_media_config_hidl, out_media_config_hidl;
-        in_media_config_hidl.resize(sizeof(struct agm_media_config));
+        hidl_vec<AgmMediaConfig> in_media_config_hidl(1), out_media_config_hidl(1);
         in_media_config_hidl.data()->rate = in_media_config->rate;
         in_media_config_hidl.data()->channels = in_media_config->channels;
         in_media_config_hidl.data()->format =
                        (::vendor::qti::hardware::AGMIPC::V1_0::AgmMediaFormat) in_media_config->format;
         in_media_config_hidl.data()->data_format = in_media_config->data_format;
 
-        out_media_config_hidl.resize(sizeof(struct agm_media_config));
         out_media_config_hidl.data()->rate = out_media_config->rate;
         out_media_config_hidl.data()->channels = out_media_config->channels;
         out_media_config_hidl.data()->format =
                        (::vendor::qti::hardware::AGMIPC::V1_0::AgmMediaFormat) out_media_config->format;
         out_media_config_hidl.data()->data_format = out_media_config->data_format;
 
-        hidl_vec<AgmBufferConfig> in_buffer_config_hidl, out_buffer_config_hidl;
-        in_buffer_config_hidl.resize(sizeof(struct agm_buffer_config));
+        hidl_vec<AgmBufferConfig> in_buffer_config_hidl(1), out_buffer_config_hidl(1);
         in_buffer_config_hidl.data()->count = in_buffer_config->count;
         in_buffer_config_hidl.data()->size = in_buffer_config->size;
         in_buffer_config_hidl.data()->max_metadata_size = in_buffer_config->max_metadata_size;
 
-        out_buffer_config_hidl.resize(sizeof(struct agm_buffer_config));
         out_buffer_config_hidl.data()->count = out_buffer_config->count;
         out_buffer_config_hidl.data()->size = out_buffer_config->size;
         out_buffer_config_hidl.data()->max_metadata_size = out_buffer_config->max_metadata_size;
@@ -913,7 +892,7 @@
     if (!agm_server_died) {
         ALOGV("%s:%d hndl %p",__func__, __LINE__, handle);
         android::sp<IAGM> agm_client = get_agm_server();
-        hidl_vec<AgmBuff> buf_hidl;
+        hidl_vec<AgmBuff> buf_hidl(1);
         native_handle_t *allocHidlHandle = nullptr;
         allocHidlHandle = native_handle_create(1, 1);
         if (!allocHidlHandle) {
@@ -923,7 +902,6 @@
         }
         allocHidlHandle->data[0] = buf->alloc_info.alloc_handle;
         allocHidlHandle->data[1] = buf->alloc_info.alloc_handle;
-        buf_hidl.resize(sizeof(struct agm_buff));
         AgmBuff *agmBuff = buf_hidl.data();
         agmBuff->size = buf->size;
         agmBuff->buffer.resize(buf->size);
@@ -982,8 +960,7 @@
         allocHidlHandle->data[0] = buf->alloc_info.alloc_handle;
         allocHidlHandle->data[1] = buf->alloc_info.alloc_handle;
 
-        hidl_vec<AgmBuff> buf_hidl;
-        buf_hidl.resize(sizeof(struct agm_buff));
+        hidl_vec<AgmBuff> buf_hidl(1);
         AgmBuff *agmBuff = buf_hidl.data();
         agmBuff->size = buf->size;
         agmBuff->metadata_size = buf->metadata_size;
@@ -1034,8 +1011,7 @@
     ALOGV("%s called, group_id = %d \n", __func__, group_id);
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
-        hidl_vec<AgmGroupMediaConfig> media_config_hidl;
-        media_config_hidl.resize(sizeof(struct agm_group_media_config));
+        hidl_vec<AgmGroupMediaConfig> media_config_hidl(1);
         media_config_hidl.data()->rate = media_config->config.rate;
         media_config_hidl.data()->channels = media_config->config.channels;
         media_config_hidl.data()->format = (::vendor::qti::hardware::AGMIPC::V1_0::AgmMediaFormat) media_config->config.format;
@@ -1087,8 +1063,7 @@
 
     if (!agm_server_died) {
         android::sp<IAGM> agm_client = get_agm_server();
-        hidl_vec<AgmBuff> buf_hidl;
-        buf_hidl.resize(sizeof(struct agm_buff));
+        hidl_vec<AgmBuff> buf_hidl(1);
         AgmBuff *agmBuff = buf_hidl.data();
         agmBuff->size = buf->size;
         agmBuff->buffer.resize(buf->size);
diff --git a/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp b/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp
index fa2c6a1..7de89aa 100644
--- a/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp
+++ b/ipc/HwBinders/agm_ipc_service/src/agm_server_wrapper.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -361,8 +362,8 @@
     sp<IAGMCallback> clbk_bdr = NULL;
     struct listnode *node = NULL;
     struct listnode *tempnode = NULL;
-    hidl_vec<AgmEventCbParams> evt_param_l;
-    hidl_vec<AgmReadWriteEventCbParams> rw_evt_param_hidl;
+    hidl_vec<AgmEventCbParams> evt_param_l(1);
+    hidl_vec<AgmReadWriteEventCbParams> rw_evt_param_hidl(1);
     AgmReadWriteEventCbParams *rw_evt_param = NULL;
     AgmEventReadWriteDonePayload *rw_payload = NULL;
     struct gsl_event_read_write_done_payload *rw_done_payload;
@@ -438,7 +439,6 @@
             ALOGE("%s native_handle_create fails", __func__);
             return;
         }
-        rw_evt_param_hidl.resize(sizeof(struct AgmReadWriteEventCbParams));
         rw_evt_param = rw_evt_param_hidl.data();
         rw_evt_param->source_module_id = evt_param->source_module_id;
         rw_evt_param->event_payload_size = sizeof(struct agm_event_read_write_done_payload);
@@ -476,8 +476,6 @@
         if (allocHidlHandle)
             native_handle_delete(allocHidlHandle);
     } else {
-        evt_param_l.resize(sizeof(struct agm_event_cb_params) +
-                                evt_param->event_payload_size);
         evt_param_l.data()->source_module_id = evt_param->source_module_id;
         evt_param_l.data()->event_payload_size = evt_param->event_payload_size;
         evt_param_l.data()->event_id = evt_param->event_id;
@@ -716,13 +714,9 @@
             return -ENOMEM;
     }
     cal_config_local->num_ckvs = cal_config.data()->num_ckvs;
-    AgmKeyValue * ptr = NULL;
     for (int i=0 ; i < cal_config.data()->num_ckvs ; i++ ) {
-        ptr = (AgmKeyValue *) (cal_config.data() +
-                                             sizeof(struct agm_cal_config) +
-                                             (sizeof(AgmKeyValue)*i));
-        cal_config_local->kv[i].key = ptr->key;
-        cal_config_local->kv[i].value = ptr->value;
+        cal_config_local->kv[i].key = cal_config.data()->kv[i].key;
+        cal_config_local->kv[i].value = cal_config.data()->kv[i].value;
     }
     ret = agm_session_aif_set_cal(session_id, aif_id, cal_config_local);
     free(cal_config_local);
@@ -762,13 +756,9 @@
     }
     tag_config_local->num_tkvs = tag_config.data()->num_tkvs;
     tag_config_local->tag = tag_config.data()->tag;
-    AgmKeyValue * ptr = NULL;
-    for (int i=0 ; i < tag_config.data()->num_tkvs ; i++ ) {
-        ptr = (AgmKeyValue *) (tag_config.data() +
-                                             sizeof(struct agm_tag_config) +
-                                             (sizeof(AgmKeyValue)*i));
-        tag_config_local->kv[i].key = ptr->key;
-        tag_config_local->kv[i].value = ptr->value;
+    for (int i = 0; i < tag_config.data()->num_tkvs; i++) {
+        tag_config_local->kv[i].key = tag_config.data()->kv[i].key;
+        tag_config_local->kv[i].value = tag_config.data()->kv[i].value;
     }
     ret = agm_set_params_with_tag(session_id, aif_id, tag_config_local);
     free(tag_config_local);
@@ -824,13 +814,12 @@
                                        ipc_agm_session_open_cb _hidl_cb) {
     uint64_t handle = 0;
     agm_client_session_handle *session_handle = NULL;
-    hidl_vec<uint64_t> handle_ret;
+    hidl_vec<uint64_t> handle_ret(1);
     int32_t ret = -EINVAL;
     enum agm_session_mode session_mode = (enum agm_session_mode) sess_mode;
 
     ALOGV("%s: session_id=%d session_mode=%d\n", __func__, session_id,
               session_mode);
-    handle_ret.resize(sizeof(uint64_t));
     pthread_mutex_lock(&client_list_lock);
     session_handle = get_session_handle_l(session_id);
     pthread_mutex_unlock(&client_list_lock);
@@ -1046,7 +1035,7 @@
     }
     size_t num_aif_info_ret = (size_t) num_aif_info;
     ret = agm_get_aif_info_list(aif_list, &num_aif_info_ret);
-    aif_list_ret.resize(sizeof(struct aif_info) * num_aif_info);
+    aif_list_ret.resize(num_aif_info);
     if ( aif_list != NULL) {
         for (int i=0 ; i<num_aif_info ; i++) {
             aif_list_ret.data()[i].aif_name = aif_list[i].aif_name;
@@ -1402,7 +1391,7 @@
 {
     struct agm_buff buf;
     int32_t ret = 0;
-    hidl_vec<AgmBuff> outBuff_hidl;
+    hidl_vec<AgmBuff> outBuff_hidl(1);
     uint32_t bufSize;
     uint32_t captured_size = captured_sz;
     const native_handle *allochandle = nullptr;
@@ -1429,7 +1418,6 @@
     ALOGV("%s:%d sz %d", __func__,__LINE__,bufSize);
     ret = agm_session_read_with_metadata(hndl, &buf, &captured_size);
     if (ret > 0) {
-        outBuff_hidl.resize(sizeof(struct agm_buff));
         outBuff_hidl.data()->size = (uint32_t)buf.size;
         outBuff_hidl.data()->buffer.resize(buf.size);
         memcpy(outBuff_hidl.data()->buffer.data(), buf.addr,
@@ -1488,7 +1476,7 @@
     }
     size_t num_aif_groups_ret = (size_t) num_groups;
     ret = agm_get_group_aif_info_list(aif_list, &num_aif_groups_ret);
-    aif_list_ret.resize(sizeof(struct aif_info) * num_groups);
+    aif_list_ret.resize(num_groups);
     if (aif_list != NULL) {
         for (int i = 0; i < num_groups ; i++) {
             aif_list_ret.data()[i].aif_name = aif_list[i].aif_name;