From 76d2089ea9cec8d4535609412f8129470826d326 Mon Sep 17 00:00:00 2001 From: Bharath Ramachandramurthy Date: Mon, 27 Apr 2015 15:47:55 -0700 Subject: [PATCH] hal: Read hotword data from sound trigger hal If the input stream is reading the hotword data, get it from sound trigger hal. Change-Id: Iebbc0bf60be3bb12d752a1c905f71e9ea14fbf46 --- hal/audio_extn/audio_extn.h | 3 ++ hal/audio_extn/soundtrigger.c | 42 ++++++++++++++++++++++++- hal/audio_hw.c | 58 +++++++++++++++-------------------- 3 files changed, 68 insertions(+), 35 deletions(-) diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h index e443f06e..8c893c67 100644 --- a/hal/audio_extn/audio_extn.h +++ b/hal/audio_extn/audio_extn.h @@ -224,6 +224,7 @@ void audio_extn_listen_set_parameters(struct audio_device *adev, #define audio_extn_sound_trigger_set_parameters(adev, parms) (0) #define audio_extn_sound_trigger_check_and_get_session(in) (0) #define audio_extn_sound_trigger_stop_lab(in) (0) +#define audio_extn_sound_trigger_read(in, buffer, bytes) (0) #else enum st_event_type { @@ -244,6 +245,8 @@ void audio_extn_sound_trigger_set_parameters(struct audio_device *adev, struct str_parms *parms); void audio_extn_sound_trigger_check_and_get_session(struct stream_in *in); void audio_extn_sound_trigger_stop_lab(struct stream_in *in); +int audio_extn_sound_trigger_read(struct stream_in *in, void *buffer, + size_t bytes); #endif #ifndef AUXPCM_BT_ENABLED diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c index 9051334a..3c16c88d 100644 --- a/hal/audio_extn/soundtrigger.c +++ b/hal/audio_extn/soundtrigger.c @@ -30,6 +30,7 @@ /* #define LOG_NDEBUG 0 */ #define LOG_NDDEBUG 0 +#include #include #include #include @@ -64,7 +65,7 @@ get_sound_trigger_info(int capture_handle) { struct sound_trigger_info *st_ses_info = NULL; struct listnode *node; - ALOGD("%s: list %d capture_handle %d", __func__, + ALOGV("%s: list empty %d capture_handle %d", __func__, list_empty(&st_dev->st_ses_list), capture_handle); list_for_each(node, &st_dev->st_ses_list) { st_ses_info = node_to_item(node, struct sound_trigger_info , list); @@ -128,6 +129,45 @@ int audio_hw_call_back(sound_trigger_event_type_t event, return status; } +int audio_extn_sound_trigger_read(struct stream_in *in, void *buffer, + size_t bytes) +{ + int ret = -1; + struct sound_trigger_info *st_info = NULL; + audio_event_info_t event; + + if (!st_dev) + return ret; + + if (!in->is_st_session_active) { + ALOGE(" %s: Sound trigger is not active", __func__); + goto exit; + } + if(in->standby) + in->standby = false; + + pthread_mutex_lock(&st_dev->lock); + st_info = get_sound_trigger_info(in->capture_handle); + pthread_mutex_unlock(&st_dev->lock); + if (st_info) { + event.u.aud_info.ses_info = &st_info->st_ses; + event.u.aud_info.buf = buffer; + event.u.aud_info.num_bytes = bytes; + ret = st_dev->st_callback(AUDIO_EVENT_READ_SAMPLES, &event); + } + +exit: + if (ret) { + if (-ENETRESET == ret) + in->is_st_session_active = false; + memset(buffer, 0, bytes); + ALOGV("%s: read failed status %d - sleep", __func__, ret); + usleep((bytes * 1000000) / (audio_stream_in_frame_size((struct audio_stream_in *)in) * + in->config.rate)); + } + return ret; +} + void audio_extn_sound_trigger_stop_lab(struct stream_in *in) { int status = 0; diff --git a/hal/audio_hw.c b/hal/audio_hw.c index 80f56a4d..1dbcf668 100644 --- a/hal/audio_hw.c +++ b/hal/audio_hw.c @@ -2603,31 +2603,29 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer, pthread_mutex_lock(&in->lock); - if (in->pcm) { - if(SND_CARD_STATE_OFFLINE == snd_scard_state) { - ALOGD(" %s: sound card is not active/SSR state", __func__); - ret= -EIO;; - goto exit; - } else { - if (in->is_st_session && !in->is_st_session_active) { - ALOGD(" %s: Sound trigger is not active/SSR", __func__); - ret= -EIO;; - goto exit; - } - } + if (in->is_st_session) { + ALOGVV(" %s: reading on st session bytes=%zu", __func__, bytes); + /* Read from sound trigger HAL */ + audio_extn_sound_trigger_read(in, buffer, bytes); + pthread_mutex_unlock(&in->lock); + return bytes; + } + + if (in->pcm && (SND_CARD_STATE_OFFLINE == snd_scard_state)) { + ALOGD(" %s: sound card is not active/SSR state", __func__); + ret= -EIO;; + goto exit; } if (in->standby) { - if (!in->is_st_session) { - pthread_mutex_lock(&adev->lock); - if (in->usecase == USECASE_COMPRESS_VOIP_CALL) - ret = voice_extn_compress_voip_start_input_stream(in); - else - ret = start_input_stream(in); - pthread_mutex_unlock(&adev->lock); - if (ret != 0) { - goto exit; - } + pthread_mutex_lock(&adev->lock); + if (in->usecase == USECASE_COMPRESS_VOIP_CALL) + ret = voice_extn_compress_voip_start_input_stream(in); + else + ret = start_input_stream(in); + pthread_mutex_unlock(&adev->lock); + if (ret != 0) { + goto exit; } in->standby = 0; } @@ -2657,17 +2655,9 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer, exit: /* ToDo: There may be a corner case when SSR happens back to back during start/stop. Need to post different error to handle that. */ - if (-ENETRESET == ret) { - /* CPE SSR results in kernel returning ENETRESET for sound trigger - session reading on LAB data. In this case do not set sound card state - offline, instead mark this sound trigger session inactive to avoid - further reading of LAB data from CPE driver. Marking the session - inactive handles both CPE and ADSP SSR for sound trigger session */ - if (!in->is_st_session) - set_snd_card_state(adev,SND_CARD_STATE_OFFLINE); - else - in->is_st_session_active = false; - } + if (-ENETRESET == ret) + set_snd_card_state(adev,SND_CARD_STATE_OFFLINE); + pthread_mutex_unlock(&in->lock); if (ret != 0) { @@ -3382,7 +3372,7 @@ static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev __unu } static int adev_open_input_stream(struct audio_hw_device *dev, - audio_io_handle_t handle __unused, + audio_io_handle_t handle, audio_devices_t devices, struct audio_config *config, struct audio_stream_in **stream_in,