summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTreeHugger Robot <treehugger-gerrit@google.com>2019-05-07 16:26:34 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-05-07 16:26:34 +0000
commitaa6f421687cd9744d0b99a91c8b4f92d051ca80c (patch)
tree5d585bf1a9b7131655d8d491915dffda789df1e8
parent5be4386f951e8702fd129d9ae06bc252bd6e7ce4 (diff)
parent611f92cc43e8bdb30a2494eac58b9a2dfe3b3e9f (diff)
downloadandroid_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.h22
-rw-r--r--cvq_util.c50
-rw-r--r--sound_trigger_hw_iaxxx.c631
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);
diff --git a/cvq_util.c b/cvq_util.c
index 98f6f34..b541704 100644
--- a/cvq_util.c
+++ b/cvq_util.c
@@ -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(