diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-05-07 16:26:34 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-05-07 16:26:34 +0000 |
| commit | aa6f421687cd9744d0b99a91c8b4f92d051ca80c (patch) | |
| tree | 5d585bf1a9b7131655d8d491915dffda789df1e8 | |
| parent | 5be4386f951e8702fd129d9ae06bc252bd6e7ce4 (diff) | |
| parent | 611f92cc43e8bdb30a2494eac58b9a2dfe3b3e9f (diff) | |
| download | android_hardware_knowles_athletico_sound_trigger_hal-aa6f421687cd9744d0b99a91c8b4f92d051ca80c.tar.gz android_hardware_knowles_athletico_sound_trigger_hal-aa6f421687cd9744d0b99a91c8b4f92d051ca80c.tar.bz2 android_hardware_knowles_athletico_sound_trigger_hal-aa6f421687cd9744d0b99a91c8b4f92d051ca80c.zip | |
Merge "sthal: separate two buffer for music IQ and hotword" into qt-dev
| -rw-r--r-- | cvq_ioctl.h | 22 | ||||
| -rw-r--r-- | cvq_util.c | 50 | ||||
| -rw-r--r-- | sound_trigger_hw_iaxxx.c | 631 |
3 files changed, 398 insertions, 305 deletions
diff --git a/cvq_ioctl.h b/cvq_ioctl.h index 2adc215..7da1f7d 100644 --- a/cvq_ioctl.h +++ b/cvq_ioctl.h @@ -116,6 +116,7 @@ #define MIC_ROUTE_INT_CLK "mic-route-internal-clock" #define BARGEIN_ROUTE "bargein-route" #define DOWNLINK_AUDIO_ROUTE "downlink-audio-route" +#define MUSIC_AUDIO_ROUTE "music-audio-route" #define SENSOR_ROTUE "oslo-route" #define HOTWORD_WITH_BARGEIN_ROUTE "hotword-route-with-bargein" #define HOTWORD_WITHOUT_BARGEIN_ROUTE "hotword-route-without-bargein" @@ -144,12 +145,6 @@ enum clock_type { EXTERNAL_OSCILLATOR }; -enum buffer_configuration { - TWO_SECOND, - MULTI_SECOND, // Configuration of 8 + 2 - NOT_CONFIGURED -}; - #define PLUGIN_DEF_CONFIG_ID 0 int write_model(struct iaxxx_odsp_hw *odsp_hdl, unsigned char *data, @@ -174,12 +169,12 @@ 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_downlink_buffer(struct iaxxx_odsp_hw *odsp_hdl); -int destroy_downlink_buffer(struct iaxxx_odsp_hw *odsp_hdl); -int setup_mic_buffer(struct iaxxx_odsp_hw *odsp_hdl, enum buffer_configuration bc); -int destroy_mic_buffer(struct iaxxx_odsp_hw *odsp_hdl); -int set_buffer_route(struct audio_route *route_hdl, bool bargein); -int tear_buffer_route(struct audio_route *route_hdl, bool bargein); +int setup_music_buffer(struct iaxxx_odsp_hw *odsp_hdl); +int destroy_music_buffer(struct iaxxx_odsp_hw *odsp_hdl); +int setup_howord_buffer(struct iaxxx_odsp_hw *odsp_hdl); +int destroy_howord_buffer(struct iaxxx_odsp_hw *odsp_hdl); +int set_hotword_buffer_route(struct audio_route *route_hdl, bool bargein); +int tear_hotword_buffer_route(struct audio_route *route_hdl, bool bargein); int enable_mic_route(struct audio_route *route_hdl, bool enable, enum clock_type ct); int set_sensor_route(struct audio_route *route_hdl, bool enable); @@ -195,7 +190,8 @@ int set_chre_audio_route(struct audio_route *route_hdl, bool bargein); int tear_chre_audio_route(struct audio_route *route_hdl, bool bargein); int reset_ambient_plugin(struct iaxxx_odsp_hw *odsp_hdl); int enable_bargein_route(struct audio_route *route_hdl, bool enable); -int enable_downlink_audio_route(struct audio_route *route_hdl, bool enable); +int set_music_buffer_route(struct audio_route *route_hdl, bool downlink); +int tear_music_buffer_route(struct audio_route *route_hdl, bool downlink); int flush_model(struct iaxxx_odsp_hw *odsp_hdl, int kw_type); int get_entity_param_blk(struct iaxxx_odsp_hw *odsp_hdl, void *payload, unsigned int payload_size); @@ -1186,7 +1186,7 @@ exit: return err; } -int setup_downlink_buffer(struct iaxxx_odsp_hw *odsp_hdl) +int setup_music_buffer(struct iaxxx_odsp_hw *odsp_hdl) { int err = 0; struct iaxxx_create_config_data cdata; @@ -1224,7 +1224,7 @@ exit: return err; } -int destroy_downlink_buffer(struct iaxxx_odsp_hw *odsp_hdl) +int destroy_music_buffer(struct iaxxx_odsp_hw *odsp_hdl) { int err = 0; @@ -1244,26 +1244,15 @@ exit: return err; } -int setup_mic_buffer(struct iaxxx_odsp_hw *odsp_hdl, enum buffer_configuration bc) +int setup_howord_buffer(struct iaxxx_odsp_hw *odsp_hdl) { struct iaxxx_create_config_data cdata; int err = 0; ALOGD("+%s+", __func__); - if (bc == NOT_CONFIGURED) { - err = -EINVAL; - ALOGE("%s: ERROR Invalid buffer configuration sent", __func__); - goto exit; - } - cdata.type = CONFIG_FILE; - if (bc == MULTI_SECOND) { - cdata.data.fdata.filename = BUFFER_CONFIG_VAL_MULTI_SEC; - } else if (bc == TWO_SECOND) { - cdata.data.fdata.filename = BUFFER_CONFIG_VAL_2_SEC; - } - + cdata.data.fdata.filename = BUFFER_CONFIG_VAL_2_SEC; err = iaxxx_odsp_plugin_set_creation_config(odsp_hdl, BUF_INSTANCE_ID, IAXXX_HMD_BLOCK_ID, @@ -1290,7 +1279,7 @@ exit: return err; } -int destroy_mic_buffer(struct iaxxx_odsp_hw *odsp_hdl) +int destroy_howord_buffer(struct iaxxx_odsp_hw *odsp_hdl) { int err = 0; @@ -1311,7 +1300,7 @@ exit: return err; } -int set_buffer_route(struct audio_route *route_hdl, bool bargein) +int set_hotword_buffer_route(struct audio_route *route_hdl, bool bargein) { int err = 0; @@ -1330,7 +1319,7 @@ int set_buffer_route(struct audio_route *route_hdl, bool bargein) return err; } -int tear_buffer_route(struct audio_route *route_hdl, bool bargein) +int tear_hotword_buffer_route(struct audio_route *route_hdl, bool bargein) { int err = 0; @@ -1361,22 +1350,39 @@ int enable_bargein_route(struct audio_route *route_hdl, bool enable) if (err) ALOGE("%s: route fail %d", __func__, err); - ALOGD("-%s-", __func__); return err; } -int enable_downlink_audio_route(struct audio_route *route_hdl, bool enable) +int set_music_buffer_route(struct audio_route *route_hdl, bool downlink) { int err = 0; - ALOGD("+%s+ %d", __func__, enable); - if (enable) + ALOGD("+%s+ %d", __func__, downlink); + if (downlink) err = audio_route_apply_and_update_path(route_hdl, DOWNLINK_AUDIO_ROUTE); else + err = audio_route_apply_and_update_path(route_hdl, + MUSIC_AUDIO_ROUTE); + if (err) + ALOGE("%s: route fail %d", __func__, err); + + ALOGD("-%s-", __func__); + return err; +} + +int tear_music_buffer_route(struct audio_route *route_hdl, bool downlink) +{ + int err = 0; + + ALOGD("+%s+ %d", __func__, downlink); + if (downlink) err = audio_route_reset_and_update_path(route_hdl, DOWNLINK_AUDIO_ROUTE); + else + err = audio_route_reset_and_update_path(route_hdl, + MUSIC_AUDIO_ROUTE); if (err) ALOGE("%s: route fail %d", __func__, err); diff --git a/sound_trigger_hw_iaxxx.c b/sound_trigger_hw_iaxxx.c index f4e08cf..1a5df36 100644 --- a/sound_trigger_hw_iaxxx.c +++ b/sound_trigger_hw_iaxxx.c @@ -58,8 +58,7 @@ #define USELESS_KW_ID (999) #define CVQ_ENDPOINT (IAXXX_SYSID_PLUGIN_1_OUT_EP_0) -#define COMMON_8SEC_BUF_ENDPOINT (IAXXX_SYSID_PLUGIN_1_OUT_EP_1) -#define DA_BUF_ENDPOINT (IAXXX_SYSID_PLUGIN_3_OUT_EP_1) +#define MUSIC_BUF_ENDPOINT (IAXXX_SYSID_PLUGIN_3_OUT_EP_1) #define IAXXX_VQ_EVENT_STR "IAXXX_VQ_EVENT" #define IAXXX_RECOVERY_EVENT_STR "IAXXX_RECOVERY_EVENT" @@ -147,15 +146,15 @@ struct knowles_sound_trigger_device { bool is_music_playing; bool is_bargein_route_enabled; bool is_buffer_package_loaded; - bool is_da_buffer_enabled; bool is_st_hal_ready; bool is_hmd_proc_on; bool is_dmx_proc_on; + int hotword_buffer_enable; + int music_buffer_enable; + bool is_chre_enable; unsigned int current_enable; - enum buffer_configuration bc; - struct audio_route *route_hdl; struct mixer *mixer; struct iaxxx_odsp_hw *odsp_hdl; @@ -420,45 +419,6 @@ static void stdev_close_term_sock(struct knowles_sound_trigger_device *stdev) } } -static int configure_buffer_plugin(struct knowles_sound_trigger_device *stdev, - enum buffer_configuration req_config) { - int err = 0; - - ALOGD("+%s+", __func__); - - // We are already in required configuration return; - if (stdev->bc == req_config || req_config == NOT_CONFIGURED) - return 0; - - // Tear down the current buffer configuration if present - if (stdev->bc != NOT_CONFIGURED) { - tear_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); - - err = destroy_mic_buffer(stdev->odsp_hdl); - if (err != 0) { - ALOGE("Failed to destroy the buffer plugin"); - goto exit; - } - } - - // Setup the required buffer configuration - err = setup_mic_buffer(stdev->odsp_hdl, req_config); - if (err != 0) { - ALOGE("Failed to create the buffer plugin"); - goto exit; - } - - // set route with new configuration - if (stdev->bc != NOT_CONFIGURED) - set_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); - - stdev->bc = req_config; - -exit: - ALOGD("-%s-", __func__); - return err; -} - static int setup_package(struct knowles_sound_trigger_device *stdev, struct model_info *model) { @@ -582,39 +542,106 @@ static int setup_buffer(struct knowles_sound_trigger_device *stdev, { int err = 0; if (enabled) { - if (check_uuid_equality(model->uuid, stdev->hotword_model_uuid)) { - if (stdev->bc == NOT_CONFIGURED) { - configure_buffer_plugin(stdev, TWO_SECOND); - } - } else if (check_uuid_equality(model->uuid, stdev->wakeup_model_uuid)) { - if (stdev->bc == NOT_CONFIGURED) { - configure_buffer_plugin(stdev, TWO_SECOND); + if ((check_uuid_equality(model->uuid, stdev->hotword_model_uuid)) + || (check_uuid_equality(model->uuid, stdev->wakeup_model_uuid))) { + + stdev->hotword_buffer_enable++; + if (stdev->hotword_buffer_enable > 1) + goto exit; + + err = setup_howord_buffer(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to create the buffer plugin"); + goto exit; } - } else if (check_uuid_equality(model->uuid, stdev->ambient_model_uuid)) { - if (stdev->bc == NOT_CONFIGURED || stdev->bc == TWO_SECOND) { - configure_buffer_plugin(stdev, MULTI_SECOND); + + if ((stdev->is_bargein_route_enabled) && !(stdev->is_chre_enable)) { + err = setup_aec_package(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to load AEC package"); + // We didn't load AEC package so don't setup the routes + goto exit; + } + + // Enable the bargein route if not enabled + err = enable_bargein_route(stdev->route_hdl, true); + if (err != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } } - } else if (check_uuid_equality(model->uuid, stdev->entity_model_uuid)) { - if (stdev->bc == NOT_CONFIGURED || stdev->bc == TWO_SECOND) { - configure_buffer_plugin(stdev, MULTI_SECOND); + } else if ((check_uuid_equality(model->uuid, stdev->ambient_model_uuid)) + || (check_uuid_equality(model->uuid, stdev->entity_model_uuid))) { + + stdev->music_buffer_enable++; + if (stdev->music_buffer_enable > 1) + goto exit; + + err = setup_music_buffer(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to load music buffer package"); + goto exit; } } } else { - if (!(stdev->current_enable & ENTITY_MASK) && - !(stdev->current_enable & AMBIENT_MASK) && - (stdev->current_enable & HOTWORD_MASK || - stdev->current_enable & WAKEUP_MASK)) { - // We need to switch to the 2 second buffer if only hotword is enabled - configure_buffer_plugin(stdev, TWO_SECOND); - } else if (!(stdev->current_enable & HOTWORD_MASK || - stdev->current_enable & WAKEUP_MASK || - stdev->current_enable & AMBIENT_MASK || - stdev->current_enable & ENTITY_MASK)) { - destroy_mic_buffer(stdev->odsp_hdl); - stdev->bc = NOT_CONFIGURED; - } + if ((check_uuid_equality(model->uuid, stdev->hotword_model_uuid)) + || (check_uuid_equality(model->uuid, stdev->wakeup_model_uuid))) { + + stdev->hotword_buffer_enable--; + if (stdev->hotword_buffer_enable != 0) + goto exit; + + err = tear_hotword_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (err != 0) { + ALOGE("Failed to disable hotword buffer route"); + goto exit; + } + + if ((stdev->is_bargein_route_enabled) && !(stdev->is_chre_enable)) { + err = enable_bargein_route(stdev->route_hdl, false); + if (err != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } + + err = destroy_aec_package(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to unload AEC package"); + goto exit; + } + } + + err = destroy_howord_buffer(stdev->odsp_hdl); + + if (err != 0) { + ALOGE("Failed to unload hotword buffer package"); + goto exit; + } + + } else if ((check_uuid_equality(model->uuid, stdev->ambient_model_uuid)) + || (check_uuid_equality(model->uuid, stdev->entity_model_uuid))) { + + stdev->music_buffer_enable--; + if (stdev->music_buffer_enable != 0) + goto exit; + + err = tear_music_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (err != 0) { + ALOGE("Failed to disable music buffer route"); + goto exit; + } + + err = destroy_music_buffer(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to unload music buffer package"); + goto exit; + } + } } +exit: return err; } @@ -809,89 +836,74 @@ static int handle_input_source(struct knowles_sound_trigger_device *stdev, } if (stdev->is_music_playing == true && stdev->is_bargein_route_enabled == false) { - err = setup_aec_package(stdev->odsp_hdl); - if (err != 0) { - ALOGE("Failed to load AEC package"); - // We didn't load AEC package so don't setup the routes - goto exit; - } - // Enable the bargein route if not enabled + stdev->is_bargein_route_enabled = true; - err = enable_bargein_route(stdev->route_hdl, - stdev->is_bargein_route_enabled); - if (err != 0) { - ALOGE("Failed to enable bargein route"); - stdev->is_bargein_route_enabled = false; - goto exit; - } - } - //setup DA buffer and route. - if (stdev->is_da_buffer_enabled == false && - stdev->is_music_playing == true && - stdev->is_buffer_package_loaded == true) { - err = setup_downlink_buffer(stdev->odsp_hdl); - if (err != 0) { - ALOGE("Failed to load DA buffer package"); - goto exit; - } - stdev->is_da_buffer_enabled = true; - err = enable_downlink_audio_route(stdev->route_hdl, - stdev->is_da_buffer_enabled); - if (err != 0) { - ALOGE("Failed to enable downlink-audio route"); - stdev->is_da_buffer_enabled = false; - destroy_downlink_buffer(stdev->odsp_hdl); - goto exit; - } - } - } else { - if (!is_any_model_active(stdev)) { - ALOGD("None of keywords are active"); - if (stdev->is_music_playing == true && - stdev->is_bargein_route_enabled == true) { - // Just disable the route and update the route status but retain - // bargein status - stdev->is_bargein_route_enabled = false; - err = enable_bargein_route(stdev->route_hdl, - stdev->is_bargein_route_enabled); + + if ((stdev->is_chre_enable) + || (stdev->hotword_buffer_enable)) { + err = setup_aec_package(stdev->odsp_hdl); if (err != 0) { - ALOGE("Failed to disable bargein route"); - stdev->is_bargein_route_enabled = true; + ALOGE("Failed to load AEC package"); + // We didn't load AEC package so don't setup the routes goto exit; } - err = destroy_aec_package(stdev->odsp_hdl); + + // Enable the bargein route if not enabled + err = enable_bargein_route(stdev->route_hdl, true); if (err != 0) { - ALOGE("Failed to unload AEC package"); + ALOGE("Failed to enable buffer route"); + stdev->is_bargein_route_enabled = false; goto exit; } - } - //disable DA buffer and route. - if (stdev->is_music_playing == true && - stdev->is_da_buffer_enabled == true) { - stdev->is_da_buffer_enabled = false; - err = enable_downlink_audio_route(stdev->route_hdl, - stdev->is_da_buffer_enabled); - if (err != 0) { - ALOGE("Failed to disable downlink-audio route"); - stdev->is_da_buffer_enabled = true; - goto exit; + + if (stdev->hotword_buffer_enable) { + // Enable the bargein route if not enabled + err = tear_hotword_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); + if (err != 0) { + ALOGE("Failed to tear old buffer route"); + goto exit; + } + + err = set_hotword_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (err != 0) { + ALOGE("Failed to enable buffer route"); + stdev->is_bargein_route_enabled = false; + goto exit; + } } - err = destroy_downlink_buffer(stdev->odsp_hdl); + } + + if (stdev->music_buffer_enable) { + err = tear_music_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); if (err != 0) { - ALOGE("Failed to unload DA buffer package"); + ALOGE("Failed to tear old music buffer route"); goto exit; } - } - if (stdev->is_mic_route_enabled == true) { - stdev->is_mic_route_enabled = false; - err = enable_mic_route(stdev->route_hdl, false, ct); + err = set_music_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); if (err != 0) { - ALOGE("Failed to disable mic route"); - stdev->is_mic_route_enabled = true; + ALOGE("Failed to enable buffer route"); goto exit; } } } + } else { + if (!is_any_model_active(stdev)) { + ALOGD("None of keywords are active"); + + if (stdev->is_mic_route_enabled == true) { + stdev->is_mic_route_enabled = false; + err = enable_mic_route(stdev->route_hdl, false, ct); + if (err != 0) { + ALOGE("Failed to disable mic route"); + stdev->is_mic_route_enabled = true; + goto exit; + } + } + } } exit: @@ -912,6 +924,9 @@ static int restart_recognition(struct knowles_sound_trigger_device *stdev) */ stdev->current_enable = 0; + stdev->hotword_buffer_enable = 0; + stdev->music_buffer_enable = 0; + stdev->is_chre_enable = false; if (stdev->is_hmd_proc_on == true) { power_on_proc_mem(stdev->route_hdl, false, IAXXX_HMD_ID); @@ -943,37 +958,54 @@ static int restart_recognition(struct knowles_sound_trigger_device *stdev) if (stdev->is_music_playing == true && stdev->is_bargein_route_enabled == true) { - err = setup_aec_package(stdev->odsp_hdl); - if (err != 0) { - ALOGE("Failed to restart AEC package"); - } - err = enable_bargein_route(stdev->route_hdl, - !stdev->is_bargein_route_enabled); - if (err != 0) { - ALOGE("Failed to tear bargein route"); - } - err = enable_bargein_route(stdev->route_hdl, - stdev->is_bargein_route_enabled); - if (err != 0) { - ALOGE("Failed to restart bargein route"); - } + if ((stdev->is_chre_enable) + || (stdev->hotword_buffer_enable)) { - //setup DA buffer and route. - if (stdev->is_da_buffer_enabled == true) { - err = setup_downlink_buffer(stdev->odsp_hdl); + err = setup_aec_package(stdev->odsp_hdl); if (err != 0) { - ALOGE("Failed to restart DA buffer package"); + ALOGE("Failed to restart AEC package"); } - err = enable_downlink_audio_route(stdev->route_hdl, - !stdev->is_da_buffer_enabled); + + err = enable_bargein_route(stdev->route_hdl, true); if (err != 0) { - ALOGE("Failed to tear downlink-audio route"); + ALOGE("Failed to enable buffer route"); + goto exit; + } + + if (stdev->hotword_buffer_enable) { + err = tear_hotword_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); + if (err != 0) { + ALOGE("Failed to tear old buffer route"); + goto exit; + } + + err = set_hotword_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (err != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } } - err = enable_downlink_audio_route(stdev->route_hdl, - stdev->is_da_buffer_enabled); + } + + if (stdev->music_buffer_enable) { + err = tear_music_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); if (err != 0) { - ALOGE("Failed to restart downlink-audio route"); + ALOGE("Failed to tear old music buffer route"); + goto exit; } + err = set_music_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (err != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } + } + + if (err != 0) { + ALOGE("Failed to restart bargein route"); } } @@ -1015,17 +1047,44 @@ static int restart_recognition(struct knowles_sound_trigger_device *stdev) } } - if (stdev->bc != NOT_CONFIGURED) { - // Setup the required buffer configuration - err = setup_mic_buffer(stdev->odsp_hdl, stdev->bc); - if (err != 0) { - ALOGE("Failed to create the buffer plugin"); - goto exit; + for (i = 0; i < MAX_MODELS; i++) { + if (stdev->models[i].is_active == true) { + if ((check_uuid_equality(stdev->models[i].uuid, stdev->hotword_model_uuid)) + || (check_uuid_equality(stdev->models[i].uuid, stdev->wakeup_model_uuid))) { + // Setup the required buffer configuration + stdev->hotword_buffer_enable++; + + if (stdev->hotword_buffer_enable > 1) + continue; + + err = setup_howord_buffer(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to create the buffer plugin"); + goto exit; + } + tear_hotword_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + set_hotword_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + } + + if ((check_uuid_equality(stdev->models[i].uuid, stdev->ambient_model_uuid)) + || (check_uuid_equality(stdev->models[i].uuid, stdev->entity_model_uuid))) { + // Setup the required buffer configuration + stdev->music_buffer_enable++; + + if (stdev->music_buffer_enable > 1) + continue; + + err = setup_music_buffer(stdev->odsp_hdl); + if (err != 0) { + ALOGE("Failed to create the buffer plugin"); + goto exit; + } + tear_music_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + set_music_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + } + } - tear_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); - set_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); } - ALOGD("%s: recovery done", __func__); exit: return err; @@ -1332,12 +1391,11 @@ static int stop_recognition(struct knowles_sound_trigger_device *stdev, destroy_package(stdev, model); - if (!((stdev->current_enable & HOTWORD_MASK) || - (stdev->current_enable & WAKEUP_MASK) || - (stdev->current_enable & AMBIENT_MASK) || - (stdev->current_enable & ENTITY_MASK))) { - tear_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); - } + if (!(stdev->current_enable & PLUGIN1_MASK)) + tear_hotword_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + + if (!(stdev->current_enable & PLUGIN2_MASK)) + tear_music_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); handle_input_source(stdev, false); @@ -1431,8 +1489,6 @@ static int stdev_load_sound_model(const struct sound_trigger_hw_device *dev, } // Setup and Configure the buffer plugin - // If we are NOT_CONFIGURED state then we need a 2 second configuration - // If we are in MULTI_SECOND state then no need to do anything if (stdev->is_buffer_package_loaded == true) { ret = setup_buffer(stdev, &stdev->models[i], true); if (ret != 0) { @@ -1474,6 +1530,7 @@ static int stdev_load_sound_model(const struct sound_trigger_hw_device *dev, stdev->chre_model_uuid)) { // setup the CHRE route and Mic route. stdev->models[i].is_active = true; + stdev->is_chre_enable = true; handle_input_source(stdev, true); setup_package(stdev, &stdev->models[i]); set_chre_audio_route(stdev->route_hdl, stdev->is_bargein_route_enabled); @@ -1557,6 +1614,22 @@ static int stdev_unload_sound_model(const struct sound_trigger_hw_device *dev, stdev->models[handle].is_active = false; tear_chre_audio_route(stdev->route_hdl, stdev->is_bargein_route_enabled); destroy_package(stdev, &stdev->models[handle]); + + if ((!stdev->hotword_buffer_enable) && (stdev->is_bargein_route_enabled)) { + ret = enable_bargein_route(stdev->route_hdl, false); + if (ret != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } + + ret = destroy_aec_package(stdev->odsp_hdl); + if (ret != 0) { + ALOGE("Failed to unload AEC package"); + goto exit; + } + } + + stdev->is_chre_enable = false; handle_input_source(stdev, false); } @@ -1659,11 +1732,22 @@ static int stdev_start_recognition( handle_input_source(stdev, true); - if (!((stdev->current_enable & HOTWORD_MASK) || - (stdev->current_enable & WAKEUP_MASK) || - (stdev->current_enable & AMBIENT_MASK) || - (stdev->current_enable & ENTITY_MASK))) { - set_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + if (check_uuid_equality(model->uuid, stdev->hotword_model_uuid) || + (check_uuid_equality(model->uuid, stdev->wakeup_model_uuid))) { + if ((stdev->hotword_buffer_enable) && + (!(stdev->current_enable & HOTWORD_MASK) || + (stdev->current_enable & WAKEUP_MASK))) { + set_hotword_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + } + } + + if (check_uuid_equality(model->uuid, stdev->ambient_model_uuid) || + (check_uuid_equality(model->uuid, stdev->entity_model_uuid))) { + if ((stdev->music_buffer_enable) && + (!(stdev->current_enable & AMBIENT_MASK) || + (stdev->current_enable & ENTITY_MASK))) { + set_music_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + } } setup_package(stdev, model); @@ -2098,11 +2182,12 @@ static int stdev_open(const hw_module_t *module, const char *name, stdev->is_mic_route_enabled = false; stdev->is_music_playing = false; + stdev->is_chre_enable = false; stdev->is_bargein_route_enabled = false; stdev->is_buffer_package_loaded = false; - stdev->is_da_buffer_enabled = false; + stdev->hotword_buffer_enable = 0; + stdev->music_buffer_enable = 0; stdev->current_enable = 0; - stdev->bc = NOT_CONFIGURED; stdev->is_hmd_proc_on = false; stdev->is_dmx_proc_on = false; @@ -2211,12 +2296,12 @@ int sound_trigger_hw_call_back(audio_event_type_t event, } } - if (!((stdev->current_enable & HOTWORD_MASK) || - (stdev->current_enable & WAKEUP_MASK) || - (stdev->current_enable & AMBIENT_MASK) || - (stdev->current_enable & ENTITY_MASK))) { - tear_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); - } + if (!(stdev->current_enable & PLUGIN1_MASK)) + tear_hotword_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + + if (!(stdev->current_enable & PLUGIN2_MASK)) + tear_music_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); + handle_input_source(stdev, false); break; case AUDIO_EVENT_PLAYBACK_STREAM_INACTIVE: @@ -2225,22 +2310,6 @@ int sound_trigger_hw_call_back(audio_event_type_t event, if (stdev->is_music_playing != false) { stdev->is_music_playing = false; if (stdev->is_mic_route_enabled != false) { - //Disable DA buffer - if (stdev->is_da_buffer_enabled == true) { - stdev->is_da_buffer_enabled = false; - ret = enable_downlink_audio_route(stdev->route_hdl, - stdev->is_da_buffer_enabled); - if (ret != 0) { - ALOGE("Failed to disable downlink-audio route"); - stdev->is_da_buffer_enabled = true; - goto exit; - } - ret = destroy_downlink_buffer(stdev->odsp_hdl); - if (ret != 0) { - ALOGE("Failed to unload DA buffer package"); - goto exit; - } - } // Atleast one keyword model is active so update the routes // Check if the bargein route is enabled if not enable bargein route // Check each model, if it is active then update it's route @@ -2269,32 +2338,52 @@ int sound_trigger_hw_call_back(audio_event_type_t event, } } } + //Switch buffer input source - ret = tear_buffer_route(stdev->route_hdl, - !stdev->is_bargein_route_enabled); - if (ret != 0) { - ALOGE("Failed to tear old buffer route"); - goto exit; - } + if ((stdev->is_chre_enable) || (stdev->hotword_buffer_enable)) { + if (stdev->hotword_buffer_enable) { + ret = tear_hotword_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); + if (ret != 0) { + ALOGE("Failed to tear old buffer route"); + goto exit; + } + ret = set_hotword_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (ret != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } + } - ret = set_buffer_route(stdev->route_hdl, - stdev->is_bargein_route_enabled); - if (ret != 0) { - ALOGE("Failed to enable buffer route"); - goto exit; + ret = enable_bargein_route(stdev->route_hdl, false); + if (ret != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } + + ret = destroy_aec_package(stdev->odsp_hdl); + if (ret != 0) { + ALOGE("Failed to unload AEC package"); + goto exit; + } } - ret = enable_bargein_route(stdev->route_hdl, + if (stdev->music_buffer_enable) { + ret = tear_music_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); + if (ret != 0) { + ALOGE("Failed to tear old music buffer route"); + goto exit; + } + ret = set_music_buffer_route(stdev->route_hdl, stdev->is_bargein_route_enabled); - if (ret != 0) { - ALOGE("Failed to disable bargein route"); - goto exit; - } - ret = destroy_aec_package(stdev->odsp_hdl); - if (ret != 0) { - ALOGE("Failed to unload AEC package"); - goto exit; + if (ret != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } } + ret = enable_mic_route(stdev->route_hdl, false, EXTERNAL_OSCILLATOR); if (ret != 0) { @@ -2318,24 +2407,6 @@ int sound_trigger_hw_call_back(audio_event_type_t event, if (stdev->is_music_playing != true) { stdev->is_music_playing = true; if (stdev->is_mic_route_enabled != false) { - //setup DA buffer and route. - if (stdev->is_da_buffer_enabled == false && - stdev->is_music_playing == true && - stdev->is_buffer_package_loaded == true) { - ret = setup_downlink_buffer(stdev->odsp_hdl); - if (ret != 0) { - ALOGE("Failed to load DA buffer package"); - goto exit; - } - stdev->is_da_buffer_enabled = true; - ret = enable_downlink_audio_route(stdev->route_hdl, - stdev->is_da_buffer_enabled); - if (ret != 0) { - ALOGE("Failed to enable downlink-audio route"); - stdev->is_da_buffer_enabled = false; - goto exit; - } - } // Atleast one keyword model is active so update the routes // Check if the bargein route is enabled if not enable bargein route // Check each model, if it is active then update it's route @@ -2353,33 +2424,54 @@ int sound_trigger_hw_call_back(audio_event_type_t event, ALOGE("Failed to enable mic route with EXT OSC"); goto exit; } - ret = setup_aec_package(stdev->odsp_hdl); - if (ret != 0) { - ALOGE("Failed to load AEC package"); - goto exit; - } + stdev->is_bargein_route_enabled = true; - ret = enable_bargein_route(stdev->route_hdl, - stdev->is_bargein_route_enabled); - if (ret != 0) { - ALOGE("Failed to enable bargein route"); - goto exit; - } + //Switch buffer input source - ret = tear_buffer_route(stdev->route_hdl, - !stdev->is_bargein_route_enabled); - if (ret != 0) { - ALOGE("Failed to tear old buffer route"); - goto exit; + if ((stdev->is_chre_enable) || (stdev->hotword_buffer_enable)) { + + ret = setup_aec_package(stdev->odsp_hdl); + if (ret != 0) { + ALOGE("Failed to load AEC package"); + goto exit; + } + + ret = enable_bargein_route(stdev->route_hdl, true); + if (ret != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } + + if (stdev->hotword_buffer_enable) { + ret = tear_hotword_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); + if (ret != 0) { + ALOGE("Failed to tear old buffer route"); + goto exit; + } + ret = set_hotword_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (ret != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } + } } - ret = set_buffer_route(stdev->route_hdl, - stdev->is_bargein_route_enabled); - if (ret != 0) { - ALOGE("Failed to enable buffer route"); - goto exit; + if (stdev->music_buffer_enable) { + ret = tear_music_buffer_route(stdev->route_hdl, + !stdev->is_bargein_route_enabled); + if (ret != 0) { + ALOGE("Failed to tear old music buffer route"); + goto exit; + } + ret = set_music_buffer_route(stdev->route_hdl, + stdev->is_bargein_route_enabled); + if (ret != 0) { + ALOGE("Failed to enable buffer route"); + goto exit; + } } - //[Todo] add downlink audio buffer handler // Check each model, if it is active then update it's route for (i = 0; i < MAX_MODELS; i++) { @@ -2438,11 +2530,10 @@ int sound_trigger_hw_call_back(audio_event_type_t event, break; case AMBIENT_KW_ID: case ENTITY_KW_ID: - stream_end_point = stdev->is_da_buffer_enabled ? - DA_BUF_ENDPOINT : COMMON_8SEC_BUF_ENDPOINT; + stream_end_point = MUSIC_BUF_ENDPOINT; break; default: - stream_end_point = COMMON_8SEC_BUF_ENDPOINT; + stream_end_point = CVQ_ENDPOINT; break; }; stdev->adnc_strm_handle = stdev->adnc_strm_open( |
