summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrioskao <rioskao@google.com>2019-06-11 16:13:58 +0800
committerrioskao <rioskao@google.com>2019-06-12 23:36:50 +0800
commit0d7433fb2df1e8609c4c093f9b8a819b54bbdec4 (patch)
treec10208a7757a8d022d84885a3c220d19c2199d64
parente844ab1acefa7f7050511285d99c36fb3e3cc133 (diff)
downloadandroid_hardware_knowles_athletico_sound_trigger_hal-0d7433fb2df1e8609c4c093f9b8a819b54bbdec4.tar.gz
android_hardware_knowles_athletico_sound_trigger_hal-0d7433fb2df1e8609c4c093f9b8a819b54bbdec4.tar.bz2
android_hardware_knowles_athletico_sound_trigger_hal-0d7433fb2df1e8609c4c093f9b8a819b54bbdec4.zip
sthal: adjust src/buf package logic
note: move src into handle_input_source move buf into start/stop logic. Those change will help us avoid hotword behavior to block codec enter sleep mode. That also solves some sequence crash issues due to the hmd turn off during the phone call case. Test: manual test ST, record, Voice call Bug: 134904721 Change-Id: I6115cbb34a584df18090108a8c09311c6a710a98
-rw-r--r--cvq_ioctl.h2
-rw-r--r--cvq_util.c2
-rw-r--r--sound_trigger_hw_iaxxx.c171
3 files changed, 124 insertions, 51 deletions
diff --git a/cvq_ioctl.h b/cvq_ioctl.h
index 4413379..2934404 100644
--- a/cvq_ioctl.h
+++ b/cvq_ioctl.h
@@ -187,7 +187,7 @@ int destroy_sensor_package(struct iaxxx_odsp_hw *odsp_hdl);
int setup_mixer_package(struct iaxxx_odsp_hw *odsp_hdl);
int destroy_mixer_package(struct iaxxx_odsp_hw *odsp_hdl);
int setup_src_package(struct iaxxx_odsp_hw *odsp_hdl);
-int destory_src_package(struct iaxxx_odsp_hw *odsp_hdl);
+int destroy_src_package(struct iaxxx_odsp_hw *odsp_hdl);
int setup_music_buffer(struct iaxxx_odsp_hw *odsp_hdl);
int destroy_music_buffer(struct iaxxx_odsp_hw *odsp_hdl);
diff --git a/cvq_util.c b/cvq_util.c
index 7ab6cc9..3313ed1 100644
--- a/cvq_util.c
+++ b/cvq_util.c
@@ -1231,7 +1231,7 @@ exit:
}
-int destory_src_package(struct iaxxx_odsp_hw *odsp_hdl)
+int destroy_src_package(struct iaxxx_odsp_hw *odsp_hdl)
{
int err = 0;
diff --git a/sound_trigger_hw_iaxxx.c b/sound_trigger_hw_iaxxx.c
index 539e338..fd1d6d4 100644
--- a/sound_trigger_hw_iaxxx.c
+++ b/sound_trigger_hw_iaxxx.c
@@ -557,6 +557,94 @@ static void update_recover_list(struct knowles_sound_trigger_device *stdev,
return;
}
+static int check_and_setup_src_package(
+ struct knowles_sound_trigger_device *stdev)
+{
+ int err = 0;
+
+ if (stdev->is_src_package_loaded == false) {
+ err = setup_src_package(stdev->odsp_hdl);
+ if (err != 0) {
+ ALOGE("%s: Failed to load SRC package", __func__);
+ goto exit;
+ } else {
+ ALOGD("%s: SRC package loaded", __func__);
+ stdev->is_src_package_loaded = true;
+ }
+ } else {
+ ALOGD("%s: SRC package is already loaded", __func__);
+ }
+
+exit:
+ return err;
+}
+
+static int check_and_destroy_src_package(
+ struct knowles_sound_trigger_device *stdev)
+{
+ int err = 0;
+
+ if (!is_any_model_active(stdev) && stdev->is_src_package_loaded == true) {
+ err = destroy_src_package(stdev->odsp_hdl);
+ if (err != 0) {
+ ALOGE("%s: Failed to destroy SRC package", __func__);
+ goto exit;
+ } else {
+ ALOGD("%s: SRC package destroy", __func__);
+ stdev->is_src_package_loaded = false;
+ }
+ }
+
+exit:
+ return err;
+}
+
+static int check_and_setup_buffer_package(
+ struct knowles_sound_trigger_device *stdev)
+{
+ int err = 0;
+
+ if (stdev->is_buffer_package_loaded == false) {
+ err = setup_buffer_package(stdev->odsp_hdl);
+ if (err != 0) {
+ ALOGE("%s: Failed to load Buffer package", __func__);
+ goto exit;
+ } else {
+ ALOGD("%s: Buffer package loaded", __func__);
+ stdev->is_buffer_package_loaded = true;
+ }
+ } else {
+ ALOGD("%s: Buffer package is already loaded", __func__);
+ }
+
+exit:
+ return err;
+}
+
+static int check_and_destroy_buffer_package(
+ struct knowles_sound_trigger_device *stdev)
+{
+ int err = 0;
+
+ if (!is_any_model_active(stdev) &&
+ stdev->is_buffer_package_loaded &&
+ !stdev->is_sensor_destroy_in_prog &&
+ !stdev->is_sensor_route_enabled) {
+
+ err = destroy_buffer_package(stdev->odsp_hdl);
+ if (err != 0) {
+ ALOGE("%s: Failed to destroy Buffer package", __func__);
+ goto exit;
+ } else {
+ ALOGD("%s: Buffer package destroy", __func__);
+ stdev->is_buffer_package_loaded = false;
+ }
+ }
+
+exit:
+ return err;
+}
+
static int setup_package(struct knowles_sound_trigger_device *stdev,
struct model_info *model)
{
@@ -925,6 +1013,11 @@ static int handle_input_source(struct knowles_sound_trigger_device *stdev,
*/
if (enable) {
if (stdev->is_mic_route_enabled == false) {
+ err = check_and_setup_src_package(stdev);
+ if (err != 0) {
+ ALOGE("Fail to setup src Package");
+ goto exit;
+ }
if (is_mic_controlled_by_audhal(stdev) == false) {
err = enable_mic_route(stdev->route_hdl, true, ct);
if (err != 0) {
@@ -1033,6 +1126,11 @@ static int handle_input_source(struct knowles_sound_trigger_device *stdev,
}
}
stdev->is_mic_route_enabled = false;
+ err = check_and_destroy_src_package(stdev);
+ if (err != 0) {
+ ALOGE("Fail to destroy src Package");
+ goto exit;
+ }
}
}
}
@@ -1092,7 +1190,7 @@ static bool do_handle_functions(struct knowles_sound_trigger_device *stdev,
}
}
handle_input_source(stdev, false);
-
+ check_and_destroy_buffer_package(stdev);
} else if (pre_mode == CON_ENABLED_ST && cur_mode == CON_ENABLED_CAPTURE_ST) {
//reconfig mic
if (stdev->is_mic_route_enabled == true) {
@@ -1137,6 +1235,7 @@ static bool do_handle_functions(struct knowles_sound_trigger_device *stdev,
// recover all models from list
if (is_uuid_in_recover_list(stdev, i)) {
if (stdev->models[i].is_active == false) {
+ check_and_setup_buffer_package(stdev);
stdev->models[i].is_active = true;
handle_input_source(stdev, true);
@@ -1422,21 +1521,6 @@ exit:
return err;
}
-static void remove_buffer(struct knowles_sound_trigger_device *stdev)
-{
- ALOGD("+%s+", __func__);
-
- if (!is_any_model_loaded(stdev) &&
- stdev->is_buffer_package_loaded &&
- !stdev->is_sensor_destroy_in_prog &&
- !stdev->is_sensor_route_enabled) {
- destroy_buffer_package(stdev->odsp_hdl);
- stdev->is_buffer_package_loaded = false;
- }
-
- ALOGD("-%s-", __func__);
-}
-
static void destroy_sensor_model(struct knowles_sound_trigger_device *stdev)
{
int ret, i;
@@ -1467,7 +1551,7 @@ static void destroy_sensor_model(struct knowles_sound_trigger_device *stdev)
}
stdev->is_sensor_destroy_in_prog = false;
- remove_buffer(stdev);
+ check_and_destroy_buffer_package(stdev);
// There could be another thread waiting for us to destroy so signal that
// thread, if no one is waiting then this signal will have no effect
@@ -1940,6 +2024,8 @@ static int stop_recognition(struct knowles_sound_trigger_device *stdev,
handle_input_source(stdev, false);
+ check_and_destroy_buffer_package(stdev);
+
exit:
return status;
}
@@ -2015,24 +2101,6 @@ static int stdev_load_sound_model(const struct sound_trigger_hw_device *dev,
stdev->models[i].data_sz = kw_model_sz;
}
- if (stdev->is_buffer_package_loaded == false) {
- ret = setup_buffer_package(stdev->odsp_hdl);
- if (ret != 0) {
- ALOGE("%s: ERROR: Failed to load the buffer package", __func__);
- goto exit;
- }
- stdev->is_buffer_package_loaded = true;
- }
-
- if (stdev->is_src_package_loaded == false) {
- ret = setup_src_package(stdev->odsp_hdl);
- if (ret != 0) {
- ALOGE("%s: ERROR: Failed to load the SRC package", __func__);
- goto exit;
- }
- stdev->is_src_package_loaded = true;
- }
-
// Send the keyword model to the chip only for hotword and ambient audio
if (check_uuid_equality(stdev->models[i].uuid,
stdev->hotword_model_uuid)) {
@@ -2049,6 +2117,12 @@ static int stdev_load_sound_model(const struct sound_trigger_hw_device *dev,
} else if (check_uuid_equality(stdev->models[i].uuid,
stdev->sensor_model_uuid)) {
// setup the sensor route
+ ret = check_and_setup_buffer_package(stdev);
+ if (ret != 0) {
+ ALOGE("%s: ERROR: Failed to load the buffer package", __func__);
+ goto exit;
+ }
+
ret = start_sensor_model(stdev);
if (ret) {
ALOGE("%s: ERROR: Failed to start sensor model", __func__);
@@ -2060,6 +2134,12 @@ static int stdev_load_sound_model(const struct sound_trigger_hw_device *dev,
// add chre to recover list
if (can_enable_chre(stdev)) {
if (stdev->models[i].is_active == false) {
+ ret = check_and_setup_buffer_package(stdev);
+ if (ret != 0) {
+ ALOGE("%s: ERROR: Failed to load the buffer package",
+ __func__);
+ goto exit;
+ }
stdev->models[i].is_active = true;
handle_input_source(stdev, true);
setup_package(stdev, &stdev->models[i]);
@@ -2092,10 +2172,6 @@ exit:
destroy_buffer_package(stdev->odsp_hdl);
stdev->is_buffer_package_loaded = false;
}
- if (!is_any_model_loaded(stdev) && stdev->is_src_package_loaded) {
- destory_src_package(stdev->odsp_hdl);
- stdev->is_src_package_loaded = false;
- }
}
pthread_mutex_unlock(&stdev->lock);
ALOGD("-%s handle %d-", __func__, *handle);
@@ -2184,6 +2260,7 @@ static int stdev_unload_sound_model(const struct sound_trigger_hw_device *dev,
stdev->is_bargein_route_enabled);
destroy_package(stdev, &stdev->models[handle]);
handle_input_source(stdev, false);
+ check_and_destroy_buffer_package(stdev);
}
}
@@ -2201,16 +2278,6 @@ static int stdev_unload_sound_model(const struct sound_trigger_hw_device *dev,
stdev->models[handle].data_sz = 0;
}
- if (!is_any_model_loaded(stdev) && stdev->is_buffer_package_loaded) {
- destroy_buffer_package(stdev->odsp_hdl);
- stdev->is_buffer_package_loaded = false;
- }
-
- if (!is_any_model_loaded(stdev) && stdev->is_src_package_loaded) {
- destory_src_package(stdev->odsp_hdl);
- stdev->is_src_package_loaded = false;
- }
-
ALOGD("%s: Successfully unloaded the model, handle - %d",
__func__, handle);
exit:
@@ -2292,6 +2359,12 @@ static int stdev_start_recognition(
goto exit;
}
+ status = check_and_setup_buffer_package(stdev);
+ if (status != 0) {
+ ALOGE("%s: ERROR: Failed to load the buffer package", __func__);
+ goto exit;
+ }
+
model->is_active = true;
handle_input_source(stdev, true);