252 lines
7.0 KiB
C++
252 lines
7.0 KiB
C++
#include "app_voice_detector.h"
|
|
#include "app_thread.h"
|
|
#include "audioflinger.h"
|
|
#include "cmsis_os.h"
|
|
#include "hal_timer.h"
|
|
#include "hal_trace.h"
|
|
#include "tgt_hardware.h"
|
|
#include "voice_detector.h"
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
|
|
#define APP_VD_DEBUG
|
|
|
|
#ifdef APP_VD_DEBUG
|
|
#define APP_VD_LOG(str, ...) LOG_DEBUG(LOG_MOD(AUD), str, ##__VA_ARGS__)
|
|
#else
|
|
#define APP_VD_LOG(...) \
|
|
do { \
|
|
} while (0)
|
|
#endif
|
|
#define APP_VD_ERR(str, ...) LOG_ERROR(LOG_MOD(AUD), str, ##__VA_ARGS__)
|
|
|
|
osMutexId vd_mutex_id = NULL;
|
|
osMutexDef(vd_mutex);
|
|
|
|
static int cmd_arr_evt_vad_start[] = {
|
|
VOICE_DET_CMD_AUD_CAP_STOP, VOICE_DET_CMD_AUD_CAP_CLOSE,
|
|
VOICE_DET_CMD_VAD_OPEN, VOICE_DET_CMD_VAD_START,
|
|
VOICE_DET_CMD_SYS_CLK_32K,
|
|
};
|
|
#if 0
|
|
static int cmd_arr_evt_cap_start[] = {
|
|
VOICE_DET_CMD_VAD_STOP,
|
|
VOICE_DET_CMD_VAD_CLOSE,
|
|
VOICE_DET_CMD_AUD_CAP_OPEN,
|
|
VOICE_DET_CMD_AUD_CAP_START,
|
|
};
|
|
#else
|
|
static int cmd_arr_evt_cap_start[] = {
|
|
VOICE_DET_CMD_AUD_CAP_OPEN,
|
|
VOICE_DET_CMD_AUD_CAP_START,
|
|
VOICE_DET_CMD_VAD_STOP,
|
|
VOICE_DET_CMD_VAD_CLOSE,
|
|
};
|
|
#endif
|
|
static int cmd_arr_evt_close[] = {
|
|
VOICE_DET_CMD_AUD_CAP_STOP, VOICE_DET_CMD_AUD_CAP_CLOSE,
|
|
VOICE_DET_CMD_VAD_STOP, VOICE_DET_CMD_VAD_CLOSE,
|
|
VOICE_DET_CMD_EXIT,
|
|
};
|
|
#if 1
|
|
static int cmd_arr_evt_cap_close[] = {
|
|
VOICE_DET_CMD_AUD_CAP_STOP,
|
|
VOICE_DET_CMD_AUD_CAP_CLOSE,
|
|
VOICE_DET_CMD_EXIT,
|
|
};
|
|
#endif
|
|
static int cmd_arr_evt_vad_close[] = {
|
|
VOICE_DET_CMD_VAD_STOP,
|
|
VOICE_DET_CMD_VAD_CLOSE,
|
|
VOICE_DET_CMD_EXIT,
|
|
};
|
|
|
|
static int app_voice_detector_process(APP_MESSAGE_BODY *msg_body) {
|
|
enum voice_detector_id id = (enum voice_detector_id)msg_body->message_id;
|
|
enum voice_detector_evt evt = (enum voice_detector_evt)msg_body->message_ptr;
|
|
int ret = 0, num, *cmds;
|
|
|
|
voice_detector_enhance_perform(id); // set sys clock to 104M or 208M
|
|
|
|
osMutexWait(vd_mutex_id, osWaitForever);
|
|
switch (evt) {
|
|
case VOICE_DET_EVT_VAD_START:
|
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_CLOSE) {
|
|
cmds = &cmd_arr_evt_vad_start[0];
|
|
num = ARRAY_SIZE(cmd_arr_evt_vad_start);
|
|
} else {
|
|
cmds = &cmd_arr_evt_vad_start[2];
|
|
num = ARRAY_SIZE(cmd_arr_evt_vad_start) - 2;
|
|
}
|
|
break;
|
|
case VOICE_DET_EVT_AUD_CAP_START:
|
|
cmds = cmd_arr_evt_cap_start;
|
|
num = ARRAY_SIZE(cmd_arr_evt_cap_start);
|
|
break;
|
|
case VOICE_DET_EVT_CLOSE:
|
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_CLOSE) {
|
|
cmds = &cmd_arr_evt_cap_close[0];
|
|
num = ARRAY_SIZE(cmd_arr_evt_cap_close);
|
|
} else {
|
|
cmds = &cmd_arr_evt_vad_close[0];
|
|
num = ARRAY_SIZE(cmd_arr_evt_vad_close);
|
|
}
|
|
break;
|
|
default:
|
|
cmds = cmd_arr_evt_close;
|
|
num = ARRAY_SIZE(cmd_arr_evt_close);
|
|
break;
|
|
}
|
|
ret = voice_detector_send_cmd_array(id, cmds, num);
|
|
if (ret) {
|
|
APP_VD_ERR("%s, send cmd error %d", __func__, ret);
|
|
}
|
|
ret = voice_detector_run(id, VOICE_DET_MODE_EXEC_CMD);
|
|
if (ret) {
|
|
APP_VD_ERR("%s, run cmd error %d", __func__, ret);
|
|
}
|
|
if (evt == VOICE_DET_EVT_CLOSE) {
|
|
voice_detector_close(id);
|
|
}
|
|
osMutexRelease(vd_mutex_id);
|
|
return ret;
|
|
}
|
|
|
|
static void voice_detector_send_msg(uint32_t id, uint32_t evt) {
|
|
APP_MESSAGE_BLOCK msg;
|
|
|
|
msg.mod_id = APP_MODUAL_VOICE_DETECTOR;
|
|
msg.msg_body.message_id = id;
|
|
msg.msg_body.message_ptr = evt;
|
|
|
|
app_mailbox_put(&msg);
|
|
}
|
|
|
|
static void voice_detector_wakeup_system(int state, void *param) {
|
|
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
|
|
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_START) {
|
|
app_voice_detector_send_event(id, VOICE_DET_EVT_AUD_CAP_START);
|
|
}
|
|
|
|
APP_VD_LOG("%s, state=%d", __func__, state);
|
|
// APP_VD_LOG("cpu freq=%d", hal_sys_timer_calc_cpu_freq(5,0));
|
|
}
|
|
|
|
static void voice_not_detector_wakeup_system(int state, void *param) {
|
|
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
|
|
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_START) {
|
|
app_voice_detector_send_event(id, VOICE_DET_EVT_VAD_START);
|
|
}
|
|
|
|
APP_VD_LOG("%s, state=%d", __func__, state);
|
|
// APP_VD_LOG("cpu freq=%d", hal_sys_timer_calc_cpu_freq(5,0));
|
|
}
|
|
|
|
void app_voice_detector_init(void) {
|
|
APP_VD_LOG("%s", __func__);
|
|
|
|
if (vd_mutex_id == NULL) {
|
|
vd_mutex_id = osMutexCreate((osMutex(vd_mutex)));
|
|
app_set_threadhandle(APP_MODUAL_VOICE_DETECTOR, app_voice_detector_process);
|
|
}
|
|
}
|
|
|
|
int app_voice_detector_open(enum voice_detector_id id,
|
|
enum AUD_VAD_TYPE_T vad_type) {
|
|
int r;
|
|
|
|
APP_VD_LOG("%s", __func__);
|
|
|
|
if (!vd_mutex_id) {
|
|
APP_VD_LOG("%s, mutex is null", __func__);
|
|
return -1;
|
|
}
|
|
osMutexWait(vd_mutex_id, osWaitForever);
|
|
r = voice_detector_open(id, vad_type);
|
|
if (!r) {
|
|
voice_detector_setup_callback(id, VOICE_DET_FIND_APP,
|
|
voice_detector_wakeup_system, NULL);
|
|
voice_detector_setup_callback(id, VOICE_DET_NOT_FIND_APP,
|
|
voice_not_detector_wakeup_system, NULL);
|
|
}
|
|
osMutexRelease(vd_mutex_id);
|
|
return r;
|
|
}
|
|
|
|
int app_voice_detector_setup_vad(enum voice_detector_id id,
|
|
struct AUD_VAD_CONFIG_T *conf) {
|
|
int r;
|
|
|
|
APP_VD_LOG("%s", __func__);
|
|
|
|
if (!vd_mutex_id) {
|
|
APP_VD_LOG("%s, mutex is null", __func__);
|
|
return -1;
|
|
}
|
|
osMutexWait(vd_mutex_id, osWaitForever);
|
|
r = voice_detector_setup_vad(id, conf);
|
|
osMutexRelease(vd_mutex_id);
|
|
return r;
|
|
}
|
|
|
|
int app_voice_detector_setup_stream(enum voice_detector_id id,
|
|
enum AUD_STREAM_T stream_id,
|
|
struct AF_STREAM_CONFIG_T *stream) {
|
|
int r;
|
|
|
|
APP_VD_LOG("%s", __func__);
|
|
|
|
if (!vd_mutex_id) {
|
|
APP_VD_LOG("%s, mutex is null", __func__);
|
|
return -1;
|
|
}
|
|
osMutexWait(vd_mutex_id, osWaitForever);
|
|
r = voice_detector_setup_stream(id, stream_id, stream);
|
|
osMutexRelease(vd_mutex_id);
|
|
return r;
|
|
}
|
|
|
|
int app_voice_detector_setup_callback(enum voice_detector_id id,
|
|
enum voice_detector_cb_id func_id,
|
|
voice_detector_cb_t func, void *param) {
|
|
int r;
|
|
|
|
APP_VD_LOG("%s", __func__);
|
|
|
|
if (!vd_mutex_id) {
|
|
APP_VD_LOG("%s, mutex is null", __func__);
|
|
return -1;
|
|
}
|
|
osMutexWait(vd_mutex_id, osWaitForever);
|
|
r = voice_detector_setup_callback(id, func_id, func, param);
|
|
osMutexRelease(vd_mutex_id);
|
|
return r;
|
|
}
|
|
|
|
int app_voice_detector_send_event(enum voice_detector_id id,
|
|
enum voice_detector_evt evt) {
|
|
APP_VD_LOG("%s, id=%d, evt=%d", __func__, id, evt);
|
|
|
|
voice_detector_send_msg(id, evt);
|
|
return 0;
|
|
}
|
|
|
|
void app_voice_detector_close(enum voice_detector_id id) {
|
|
APP_VD_LOG("%s", __func__);
|
|
|
|
voice_detector_send_msg(id, VOICE_DET_EVT_CLOSE);
|
|
}
|
|
|
|
void app_voice_detector_capture_start(enum voice_detector_id id) {
|
|
APP_VD_LOG("%s", __func__);
|
|
|
|
voice_detector_send_msg(id, VOICE_DET_EVT_AUD_CAP_START);
|
|
}
|
|
|
|
void app_voice_detector_get_vad_data_info(
|
|
enum voice_detector_id id, struct CODEC_VAD_BUF_INFO_T *vad_buf_info) {
|
|
voice_detector_get_vad_data_info(id, vad_buf_info);
|
|
}
|