diff options
author | JJ Lee <leejj@google.com> | 2019-06-20 20:08:36 +0800 |
---|---|---|
committer | Rios Kao <rioskao@google.com> | 2019-07-26 17:36:26 -0700 |
commit | f2a7fcbee820a9ae062a83bf508f6a611b367e18 (patch) | |
tree | 1a620233850311d9a9f8adf909d61dd30cbafa64 | |
parent | 4d5652116ffb1a1449652b5e92f9c3f9197e8fd5 (diff) | |
download | android_hardware_knowles_athletico_sound_trigger_hal-f2a7fcbee820a9ae062a83bf508f6a611b367e18.tar.gz android_hardware_knowles_athletico_sound_trigger_hal-f2a7fcbee820a9ae062a83bf508f6a611b367e18.tar.bz2 android_hardware_knowles_athletico_sound_trigger_hal-f2a7fcbee820a9ae062a83bf508f6a611b367e18.zip |
sthal: fix chre package unload failed in call
note: Skip destory chre buffer plugin during
incall mode to avoid race condition when
CHRE is active.
Test: verify chre related task.
Bug: 136425157
Change-Id: I68237c541a1724c23514a9083690a177679d47c1
Signed-off-by: JJ Lee <leejj@google.com>
-rw-r--r-- | sound_trigger_hw_iaxxx.c | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/sound_trigger_hw_iaxxx.c b/sound_trigger_hw_iaxxx.c index 4a88600..9247f00 100644 --- a/sound_trigger_hw_iaxxx.c +++ b/sound_trigger_hw_iaxxx.c @@ -164,7 +164,7 @@ struct knowles_sound_trigger_device { bool is_mic_route_enabled; bool is_music_playing; bool is_bargein_route_enabled; - bool is_chre_route_enabled; + bool is_chre_loaded; bool is_buffer_package_loaded; bool is_sensor_route_enabled; bool is_src_package_loaded; @@ -671,7 +671,7 @@ static int check_and_destroy_buffer_package( (!stdev->is_sensor_destroy_in_prog && !stdev->is_sensor_route_enabled) && (!stdev->is_chre_destroy_in_prog && - !stdev->is_chre_route_enabled)) { + !stdev->is_chre_loaded)) { err = destroy_buffer_package(stdev->odsp_hdl); if (err != 0) { @@ -984,8 +984,9 @@ static int set_package_route(struct knowles_sound_trigger_device *stdev, * b/119390722 for tracing. */ if (check_uuid_equality(uuid, stdev->chre_model_uuid)) { - set_chre_audio_route(stdev->route_hdl, bargein); - stdev->is_chre_route_enabled = true; + if (stdev->is_chre_loaded == true) { + set_chre_audio_route(stdev->route_hdl, bargein); + } } else if (check_uuid_equality(uuid, stdev->hotword_model_uuid)) { if (!((stdev->current_enable & PLUGIN1_MASK) & ~HOTWORD_MASK)) { set_hotword_route(stdev->route_hdl, bargein); @@ -1017,8 +1018,9 @@ static int tear_package_route(struct knowles_sound_trigger_device *stdev, * b/119390722 for tracing. */ if (check_uuid_equality(uuid, stdev->chre_model_uuid)) { - tear_chre_audio_route(stdev->route_hdl, bargein); - stdev->is_chre_route_enabled = false; + if (stdev->is_chre_loaded == true) { + tear_chre_audio_route(stdev->route_hdl, bargein); + } } else if (check_uuid_equality(uuid, stdev->hotword_model_uuid)) { if (!((stdev->current_enable & PLUGIN1_MASK) & ~HOTWORD_MASK)) tear_hotword_route(stdev->route_hdl, bargein); @@ -1334,7 +1336,10 @@ static bool do_handle_functions(struct knowles_sound_trigger_device *stdev, tear_package_route(stdev, stdev->models[i].uuid, stdev->is_bargein_route_enabled); stdev->models[i].is_active = false; - destroy_package(stdev, &stdev->models[i]); + if (!check_uuid_equality(stdev->models[i].uuid, + stdev->chre_model_uuid)) + destroy_package(stdev, &stdev->models[i]); + if ((stdev->hotword_buffer_enable) && !(stdev->current_enable & PLUGIN1_MASK)) { tear_hotword_buffer_route(stdev->route_hdl, @@ -1412,7 +1417,9 @@ static bool do_handle_functions(struct knowles_sound_trigger_device *stdev, stdev->is_bargein_route_enabled); } - setup_package(stdev, &stdev->models[i]); + if (!check_uuid_equality(stdev->models[i].uuid, + stdev->chre_model_uuid)) + setup_package(stdev, &stdev->models[i]); set_package_route(stdev, stdev->models[i].uuid, stdev->is_bargein_route_enabled); } @@ -1538,6 +1545,14 @@ static int restart_recognition(struct knowles_sound_trigger_device *stdev) tear_package_route(stdev, stdev->models[i].uuid, stdev->is_bargein_route_enabled); } + // if chre enabled before crash during call, need to setup package for SLPI. + if (stdev->is_chre_loaded == true) { + err = setup_chre_package(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to load CHRE package"); + } + stdev->current_enable = stdev->current_enable | CHRE_MASK; + } goto reload_oslo; } @@ -1883,11 +1898,10 @@ static void chre_crash_handler(struct knowles_sound_trigger_device *stdev) stdev->chre_timer_created = false; } - if (stdev->is_chre_route_enabled == true) { + if (stdev->is_chre_loaded == true) { for (i = 0; i < MAX_MODELS; i++) { if (check_uuid_equality(stdev->models[i].uuid, - stdev->chre_model_uuid) && - stdev->models[i].is_active == true) { + stdev->chre_model_uuid)) { stdev->models[i].is_active = false; stdev->models[i].is_loaded = false; memset(&stdev->models[i].uuid, 0, @@ -1895,7 +1909,7 @@ static void chre_crash_handler(struct knowles_sound_trigger_device *stdev) break; } } - stdev->is_chre_route_enabled = false; + stdev->is_chre_loaded = false; stdev->current_enable &= ~CHRE_MASK; } stdev->is_chre_destroy_in_prog = false; @@ -1942,7 +1956,6 @@ static int start_chre_model(struct knowles_sound_trigger_device *stdev, goto exit; } - // setup the sensor route err = check_and_setup_buffer_package(stdev); if (err != 0) { ALOGE("%s: ERROR: Failed to load the buffer package", __func__); @@ -1951,20 +1964,28 @@ static int start_chre_model(struct knowles_sound_trigger_device *stdev, // add chre to recover list if (can_enable_chre(stdev)) { - if(stdev->is_chre_route_enabled == false) { + if(stdev->is_chre_loaded == false) { stdev->models[model_id].is_active = true; handle_input_source(stdev, true); setup_chre_package(stdev->odsp_hdl); set_chre_audio_route(stdev->route_hdl, - stdev->is_bargein_route_enabled); - stdev->is_chre_route_enabled = true; + stdev->is_bargein_route_enabled); + stdev->is_chre_loaded = true; stdev->current_enable = stdev->current_enable | CHRE_MASK; } } else { - ALOGW("%s: device is recording / in call, can't enable chre now", + ALOGW("%s: device is in call, setup CHRE for SLPI", __func__); - if (can_update_recover_list(stdev) == true) - update_recover_list(stdev, model_id, true); + //Setup CHRE package and allow SLPI connect + //during in-call mode. + if (stdev->is_chre_loaded == false) { + setup_chre_package(stdev->odsp_hdl); + stdev->models[model_id].uuid = stdev->chre_model_uuid; + stdev->is_chre_loaded = true; + stdev->current_enable = stdev->current_enable | CHRE_MASK; + if (can_update_recover_list(stdev) == true) + update_recover_list(stdev, model_id, true); + } } exit: @@ -1976,7 +1997,7 @@ static void destroy_chre_model(struct knowles_sound_trigger_device *stdev) int err = 0; ALOGD("+%s+", __func__); - if (stdev->is_chre_route_enabled == true) { + if (stdev->is_chre_loaded == true) { int i; tear_chre_audio_route(stdev->route_hdl, stdev->is_bargein_route_enabled); @@ -1985,11 +2006,12 @@ static void destroy_chre_model(struct knowles_sound_trigger_device *stdev) ALOGE("%s: ERROR: Failed to destroy chre package", __func__); } - // now we can change the flag + //Need force reset the flag for chre due to in-call state + //The model is inactive, but need to clean if user disable it + //during call. for (i = 0; i < MAX_MODELS; i++) { if (check_uuid_equality(stdev->models[i].uuid, - stdev->chre_model_uuid) && - stdev->models[i].is_active == true) { + stdev->chre_model_uuid)) { stdev->models[i].is_active = false; stdev->models[i].is_loaded = false; memset(&stdev->models[i].uuid, 0, @@ -1998,7 +2020,7 @@ static void destroy_chre_model(struct knowles_sound_trigger_device *stdev) } } handle_input_source(stdev, false); - stdev->is_chre_route_enabled = false; + stdev->is_chre_loaded = false; stdev->current_enable = stdev->current_enable & ~CHRE_MASK; } @@ -2749,7 +2771,7 @@ static int stdev_unload_sound_model(const struct sound_trigger_hw_device *dev, update_recover_list(stdev, handle, false); // Disable the CHRE route - if (true == stdev->is_chre_route_enabled) { + if (stdev->is_chre_loaded == true) { struct itimerspec chre_timer_spec; struct sigevent chre_sigevent; @@ -3367,7 +3389,7 @@ static int stdev_open(const hw_module_t *module, const char *name, stdev->is_voice_voip_stop = false; stdev->is_music_playing = false; stdev->is_bargein_route_enabled = false; - stdev->is_chre_route_enabled = false; + stdev->is_chre_loaded = false; stdev->is_buffer_package_loaded = false; stdev->hotword_buffer_enable = 0; stdev->music_buffer_enable = 0; |