From 0d7433fb2df1e8609c4c093f9b8a819b54bbdec4 Mon Sep 17 00:00:00 2001 From: rioskao Date: Tue, 11 Jun 2019 16:13:58 +0800 Subject: 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 --- cvq_ioctl.h | 2 +- cvq_util.c | 2 +- sound_trigger_hw_iaxxx.c | 171 +++++++++++++++++++++++++++++++++-------------- 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); -- cgit v1.2.3