566 lines
19 KiB
C
566 lines
19 KiB
C
//小蜂管家
|
||
//你好小蜂
|
||
//小蜂你好
|
||
//小蜂小蜂
|
||
//小艾小艾
|
||
//小乐小乐
|
||
//小美小美
|
||
//小智小智
|
||
//小佳小佳
|
||
//小优小优
|
||
//小可小可
|
||
//会客模式
|
||
//用餐模式
|
||
//休息模式
|
||
//影音模式
|
||
//娱乐模式
|
||
//起夜模式
|
||
//会议模式
|
||
//投影模式
|
||
//离开模式
|
||
//派对模式
|
||
//回家模式
|
||
//打开窗帘
|
||
//关闭窗帘
|
||
//停止窗帘
|
||
//打开灯光
|
||
//关闭灯光
|
||
//调亮灯光
|
||
//调暗灯光
|
||
//调到白光
|
||
//调到黄光
|
||
//调到自然光
|
||
//打开空调
|
||
//关闭空调
|
||
//调高温度
|
||
//调低温度
|
||
//制冷模式
|
||
//加热模式
|
||
//通风模式
|
||
//除湿模式
|
||
//最小风量
|
||
//中等风量
|
||
//最大风量
|
||
//自动风量
|
||
//上下摆风
|
||
//左右摆风
|
||
//快捷配网
|
||
//打开语音
|
||
//关闭语音
|
||
//打开播报
|
||
//关闭播报
|
||
static const unsigned char result0[13] = {0xE5, 0xB0, 0x8F, 0xE8, 0x9C, 0x82, 0xE7, 0xAE, 0xA1, 0xE5, 0xAE, 0xB6, 0x00}; //小蜂管家
|
||
static const unsigned char result3[13] = {0xE5, 0xB0, 0x8F, 0xE8, 0x9C, 0x82, 0xE5, 0xB0, 0x8F, 0xE8, 0x9C, 0x82, 0x00}; //小蜂小蜂
|
||
static const unsigned char result4[13] = {0xE4, 0xBC, 0x9A, 0xE5, 0xAE, 0xA2, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //会客模式
|
||
static const unsigned char result5[13] = {0xE7, 0x94, 0xA8, 0xE9, 0xA4, 0x90, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //用餐模式
|
||
static const unsigned char result6[13] = {0xE4, 0xBC, 0x91, 0xE6, 0x81, 0xAF, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //休息模式
|
||
static const unsigned char result7[13] = {0xE5, 0xBD, 0xB1, 0xE9, 0x9F, 0xB3, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //影音模式
|
||
static const unsigned char result8[13] = {0xE5, 0xA8, 0xB1, 0xE4, 0xB9, 0x90, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //娱乐模式
|
||
static const unsigned char resultc[13] = {0xE7, 0xA6, 0xBB, 0xE5, 0xBC, 0x80, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //离开模式
|
||
static const unsigned char resulte[13] = {0xE5, 0x9B, 0x9E, 0xE5, 0xAE, 0xB6, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //回家模式
|
||
static const unsigned char resultf[13] = {0xE6, 0x89, 0x93, 0xE5, 0xBC, 0x80, 0xE7, 0xAA, 0x97, 0xE5, 0xB8, 0x98, 0x00}; //打开窗帘
|
||
static const unsigned char result10[13] = {0xE5, 0x85, 0xB3, 0xE9, 0x97, 0xAD, 0xE7, 0xAA, 0x97, 0xE5, 0xB8, 0x98, 0x00}; //关闭窗帘
|
||
static const unsigned char result11[13] = {0xE5, 0x81, 0x9C, 0xE6, 0xAD, 0xA2, 0xE7, 0xAA, 0x97, 0xE5, 0xB8, 0x98, 0x00}; //停止窗帘
|
||
static const unsigned char result12[13] = {0xE5, 0xB0, 0x8F, 0xE8, 0x9C, 0x82, 0xE5, 0xBC, 0x80, 0xE7, 0x81, 0xAF, 0x00}; //小蜂开灯
|
||
static const unsigned char result13[13] = {0xE5, 0xB0, 0x8F, 0xE8, 0x9C, 0x82, 0xE5, 0x85, 0xB3, 0xE7, 0x81, 0xAF, 0x00}; //小蜂关灯
|
||
static const unsigned char result16[13] = {0xE8, 0xB0, 0x83, 0xE4, 0xBA, 0xAE, 0xE4, 0xB8, 0x80, 0xE7, 0x82, 0xB9, 0x00}; //调亮一点
|
||
static const unsigned char result17[13] = {0xE8, 0xB0, 0x83, 0xE6, 0x9A, 0x97, 0xE4, 0xB8, 0x80, 0xE7, 0x82, 0xB9, 0x00}; //调暗一点
|
||
static const unsigned char result18[13] = {0xE6, 0x89, 0x93, 0xE5, 0xBC, 0x80, 0xE7, 0xA9, 0xBA, 0xE8, 0xB0, 0x83, 0x00}; //打开空调
|
||
static const unsigned char result19[13] = {0xE5, 0x85, 0xB3, 0xE9, 0x97, 0xAD, 0xE7, 0xA9, 0xBA, 0xE8, 0xB0, 0x83, 0x00}; //关闭空调
|
||
static const unsigned char result1b[13] = {0xE8, 0xB0, 0x83, 0xE9, 0xAB, 0x98, 0xE6, 0xB8, 0xA9, 0xE5, 0xBA, 0xA6, 0x00}; //调高温度
|
||
static const unsigned char result1d[13] = {0xE8, 0xB0, 0x83, 0xE4, 0xBD, 0x8E, 0xE6, 0xB8, 0xA9, 0xE5, 0xBA, 0xA6, 0x00}; //调低温度
|
||
static const unsigned char result1e[13] = {0xE5, 0x88, 0xB6, 0xE5, 0x86, 0xB7, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //制冷模式
|
||
static const unsigned char result1f[13] = {0xE5, 0x8A, 0xA0, 0xE7, 0x83, 0xAD, 0xE6, 0xA8, 0xA1, 0xE5, 0xBC, 0x8F, 0x00}; //加热模式
|
||
static const unsigned char result22[13] = {0xE6, 0x9C, 0x80, 0xE5, 0xB0, 0x8F, 0xE9, 0xA3, 0x8E, 0xE9, 0x87, 0x8F, 0x00}; //最小风量
|
||
static const unsigned char result23[13] = {0xE4, 0xB8, 0xAD, 0xE7, 0xAD, 0x89, 0xE9, 0xA3, 0x8E, 0xE9, 0x87, 0x8F, 0x00}; //中等风量
|
||
static const unsigned char result24[13] = {0xE6, 0x9C, 0x80, 0xE5, 0xA4, 0xA7, 0xE9, 0xA3, 0x8E, 0xE9, 0x87, 0x8F, 0x00}; //最大风量
|
||
static const unsigned char result25[13] = {0xE8, 0x87, 0xAA, 0xE5, 0x8A, 0xA8, 0xE9, 0xA3, 0x8E, 0xE9, 0x87, 0x8F, 0x00}; //自动风量
|
||
static const unsigned char result26[13] = {0xE6, 0x89, 0x93, 0xE5, 0xBC, 0x80, 0xE6, 0x91, 0x86, 0xE9, 0xA3, 0x8E, 0x00}; //打开摆风
|
||
static const unsigned char result27[13] = {0xE4, 0xB8, 0x8A, 0xE4, 0xB8, 0x8B, 0xE6, 0x91, 0x86, 0xE9, 0xA3, 0x8E, 0x00}; //上下摆风
|
||
static const unsigned char result28[13] = {0xE5, 0xB7, 0xA6, 0xE5, 0x8F, 0xB3, 0xE6, 0x91, 0x86, 0xE9, 0xA3, 0x8E, 0x00}; //左右摆风
|
||
static const unsigned char result29[13] = {0xE5, 0x85, 0xB3, 0xE9, 0x97, 0xAD, 0xE6, 0x91, 0x86, 0xE9, 0xA3, 0x8E, 0x00}; //关闭摆风
|
||
|
||
#include "server/audio_server.h"
|
||
#include "server/server_core.h"
|
||
#include "generic/circular_buf.h"
|
||
#include "fs/fs.h"
|
||
#include "os/os_api.h"
|
||
#include "fn_asr.h"
|
||
#include "event.h"
|
||
#include "app_config.h"
|
||
|
||
#if (defined CONFIG_ASR_ALGORITHM) && (CONFIG_ASR_ALGORITHM == WANSON_ALGORITHM)
|
||
|
||
#if defined CONFIG_VIDEO_ENABLE || defined CONFIG_NO_SDRAM_ENABLE
|
||
#define WANSON_DUAL_MIC_ALGORITHM 0 //0选择单mic/1选择双mic算法
|
||
#else
|
||
#define WANSON_DUAL_MIC_ALGORITHM 1 //0选择单mic/1选择双mic算法
|
||
#endif
|
||
|
||
#define DISABLE_AEC_CHANNEL 1
|
||
|
||
#if DISABLE_AEC_CHANNEL
|
||
#define CONFIG_AISP_DIFFER_MIC_REPLACE_LINEIN
|
||
#endif
|
||
|
||
#if CONFIG_AUDIO_ENC_SAMPLE_SOURCE != AUDIO_ENC_SAMPLE_SOURCE_MIC
|
||
|
||
#ifdef CONFIG_AISP_DIFFER_MIC_REPLACE_LINEIN
|
||
#define CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN_OTHER
|
||
#endif
|
||
#undef CONFIG_AISP_DIFFER_MIC_REPLACE_LINEIN
|
||
|
||
#else
|
||
|
||
#ifdef CONFIG_AISP_DIFFER_MIC_REPLACE_LINEIN
|
||
#define CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
#endif
|
||
|
||
#endif
|
||
|
||
#define ONCE_SR_POINTS 480
|
||
#define WANSON_BUF_SIZE (4 * ONCE_SR_POINTS) //跑不过来时适当加大倍数
|
||
|
||
#define PCM_TEST_MODE_0 0 //测试模式0,会发送当前音频给电脑
|
||
#define PCM_TEST_MODE_1 1 //测试模式1,会发唤醒时当前缓存音频给电脑
|
||
|
||
#define WIFI_PCM_STREAN_TEST PCM_TEST_MODE_0
|
||
|
||
static struct {
|
||
int pid;
|
||
u32 sample_rate;
|
||
int volatile run_flag;
|
||
OS_SEM sem;
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
void *linein_enc;
|
||
cbuffer_t linein_cbuf;
|
||
s16 linein_buf[WANSON_BUF_SIZE];
|
||
s16 mic_buf[WANSON_BUF_SIZE * (1 + WANSON_DUAL_MIC_ALGORITHM)];
|
||
#else
|
||
s16 mic_buf[WANSON_BUF_SIZE * (2 + WANSON_DUAL_MIC_ALGORITHM - DISABLE_AEC_CHANNEL)];
|
||
#endif
|
||
void *mic_enc;
|
||
cbuffer_t mic_cbuf;
|
||
#if defined WIFI_PCM_STREAN_SOCKET_ENABLE && !DISABLE_AEC_CHANNEL
|
||
cbuffer_t aec_cbuf;
|
||
s16 aec_buf[WANSON_BUF_SIZE];
|
||
short send_buf[ONCE_SR_POINTS * 4];
|
||
#endif
|
||
#if !defined CONFIG_NO_SDRAM_ENABLE && !DISABLE_AEC_CHANNEL
|
||
cbuffer_t asr_cbuf;
|
||
s16 asr_buf[WANSON_BUF_SIZE];
|
||
OS_SEM asr_sem;
|
||
#endif
|
||
} wanson_server;
|
||
|
||
#define __this (&wanson_server)
|
||
|
||
static void wanson_task(void *priv)
|
||
{
|
||
short buf[ONCE_SR_POINTS * (2 + WANSON_DUAL_MIC_ALGORITHM - DISABLE_AEC_CHANNEL)];
|
||
u32 mic_len, linein_len;
|
||
const char *text = NULL;
|
||
float score = 0;
|
||
|
||
if (Wanson_ASR_Init()) {
|
||
return;
|
||
}
|
||
Wanson_ASR_Reset();
|
||
|
||
printf("wanson asr start OK \n");
|
||
|
||
while (1) {
|
||
if (!__this->run_flag) {
|
||
os_sem_pend(&__this->sem, 0);
|
||
continue;
|
||
}
|
||
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
if ((cbuf_get_data_size(&__this->mic_cbuf) < ONCE_SR_POINTS * 2 * (WANSON_DUAL_MIC_ALGORITHM + 1))
|
||
|| (cbuf_get_data_size(&__this->linein_cbuf) < ONCE_SR_POINTS * 2)) {
|
||
os_sem_pend(&__this->sem, 0);
|
||
continue;
|
||
}
|
||
short tempbuf[ONCE_SR_POINTS * (2 + WANSON_DUAL_MIC_ALGORITHM)];
|
||
mic_len = cbuf_read(&__this->mic_cbuf, tempbuf, ONCE_SR_POINTS * 2 * (WANSON_DUAL_MIC_ALGORITHM + 1));
|
||
if (!mic_len) {
|
||
continue;
|
||
}
|
||
linein_len = cbuf_read(&__this->linein_cbuf, (u8 *)tempbuf + mic_len, ONCE_SR_POINTS * 2);
|
||
if (!linein_len) {
|
||
continue;
|
||
}
|
||
|
||
mic_len /= 2;
|
||
//重组数据
|
||
for (u32 i = 0, j = 0; j < ONCE_SR_POINTS; ++j) {
|
||
#if WANSON_DUAL_MIC_ALGORITHM
|
||
buf[i++] = tempbuf[j * 2];
|
||
buf[i++] = tempbuf[j * 2 + 1];
|
||
#else
|
||
buf[i++] = tempbuf[j];
|
||
#endif
|
||
buf[i++] = tempbuf[mic_len + j];
|
||
}
|
||
|
||
#else
|
||
|
||
mic_len = cbuf_read(&__this->mic_cbuf, buf, sizeof(buf));
|
||
if (!mic_len) {
|
||
os_sem_pend(&__this->sem, 0);
|
||
continue;
|
||
}
|
||
#if 0 //如果回采通道采用AD1需要打开此宏
|
||
#if WANSON_DUAL_MIC_ALGORITHM
|
||
s16 temp = 0;
|
||
for (u32 i = 0; i < ONCE_SR_POINTS; ++i) {
|
||
temp = buf[3 * i + 1];
|
||
buf[3 * i + 1] = buf[3 * i + 2];
|
||
buf[3 * i + 2] = temp;
|
||
}
|
||
#else
|
||
s16 temp = 0;
|
||
for (u32 i = 0; i < ONCE_SR_POINTS; ++i) {
|
||
temp = buf[2 * i + 1];
|
||
buf[2 * i + 1] = buf[2 * i];
|
||
buf[2 * i] = temp;
|
||
}
|
||
#endif
|
||
#endif
|
||
|
||
#endif
|
||
|
||
if (1 == Wanson_ASR_Recog(buf, ONCE_SR_POINTS, &text, &score)) {
|
||
printf("{ wakeup_word: %s}\n", text);
|
||
}
|
||
|
||
#ifdef WIFI_PCM_STREAN_SOCKET_ENABLE
|
||
#if (WIFI_PCM_STREAN_TEST == PCM_TEST_MODE_0) && !DISABLE_AEC_CHANNEL
|
||
short temp_buf[ONCE_SR_POINTS];
|
||
extern void wifi_pcm_stream_socket_send(u8 * buf, u32 len);
|
||
cbuf_read(&__this->aec_cbuf, temp_buf, sizeof(temp_buf));
|
||
for (u32 i = 0; i < ONCE_SR_POINTS; ++i) {
|
||
#if WANSON_DUAL_MIC_ALGORITHM
|
||
__this->send_buf[4 * i] = buf[3 * i];
|
||
__this->send_buf[4 * i + 1] = buf[3 * i + 1];
|
||
__this->send_buf[4 * i + 2] = buf[3 * i + 2];
|
||
__this->send_buf[4 * i + 3] = temp_buf[i];
|
||
#else
|
||
__this->send_buf[4 * i] = buf[2 * i];
|
||
__this->send_buf[4 * i + 2] = buf[2 * i + 1];
|
||
__this->send_buf[4 * i + 3] = temp_buf[i];
|
||
#endif
|
||
}
|
||
wifi_pcm_stream_socket_send((u8 *)__this->send_buf, sizeof(__this->send_buf));
|
||
#endif
|
||
#endif
|
||
}
|
||
|
||
Wanson_ASR_Release();
|
||
}
|
||
|
||
static void enc_server_event_handler(void *priv, int argc, int *argv)
|
||
{
|
||
switch (argv[0]) {
|
||
case AUDIO_SERVER_EVENT_ERR:
|
||
case AUDIO_SERVER_EVENT_END:
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
static int wanson_vfs_fwrite(void *file, void *data, u32 len)
|
||
{
|
||
cbuffer_t *cbuf = (cbuffer_t *)file;
|
||
|
||
u32 wlen = cbuf_write(cbuf, data, len);
|
||
if (wlen != len) {
|
||
cbuf_clear(&__this->mic_cbuf);
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
cbuf_clear(&__this->linein_cbuf);
|
||
#endif
|
||
#if defined WIFI_PCM_STREAN_SOCKET_ENABLE && !DISABLE_AEC_CHANNEL
|
||
cbuf_clear(&__this->aec_cbuf);
|
||
#endif
|
||
puts("busy!\n");
|
||
}
|
||
if (file == (void *)&__this->mic_cbuf) {
|
||
os_sem_set(&__this->sem, 0);
|
||
os_sem_post(&__this->sem);
|
||
}
|
||
|
||
return len;
|
||
}
|
||
|
||
static int wanson_vfs_fclose(void *file)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
static const struct audio_vfs_ops wanson_vfs_ops = {
|
||
.fwrite = wanson_vfs_fwrite,
|
||
.fclose = wanson_vfs_fclose,
|
||
};
|
||
|
||
#if !defined CONFIG_NO_SDRAM_ENABLE && !DISABLE_AEC_CHANNEL
|
||
int asr_read_input(u8 *buf, u32 len)
|
||
{
|
||
u32 rlen = 0;
|
||
|
||
do {
|
||
if (!__this->run_flag) {
|
||
return 0;
|
||
}
|
||
rlen = cbuf_read(&__this->asr_cbuf, buf, len);
|
||
if (rlen == len) {
|
||
break;
|
||
}
|
||
os_sem_pend(&__this->asr_sem, 0);
|
||
} while (!rlen);
|
||
|
||
return rlen;
|
||
}
|
||
#endif
|
||
|
||
void *get_asr_read_input_cb(void)
|
||
{
|
||
if (!__this->run_flag) {
|
||
return NULL;
|
||
}
|
||
|
||
#if !defined CONFIG_NO_SDRAM_ENABLE && !DISABLE_AEC_CHANNEL
|
||
os_sem_set(&__this->asr_sem, 0);
|
||
cbuf_clear(&__this->asr_cbuf);
|
||
return (void *)&asr_read_input;
|
||
#else
|
||
return NULL;
|
||
#endif
|
||
}
|
||
|
||
int aisp_open(u16 sample_rate)
|
||
{
|
||
union audio_req req = {0};
|
||
|
||
__this->mic_enc = server_open("audio_server", "enc");
|
||
if (!__this->mic_enc) {
|
||
goto __err;
|
||
}
|
||
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
__this->linein_enc = server_open("audio_server", "enc");
|
||
if (!__this->linein_enc) {
|
||
goto __err;
|
||
}
|
||
#endif
|
||
|
||
server_register_event_handler(__this->mic_enc, NULL, enc_server_event_handler);
|
||
cbuf_init(&__this->mic_cbuf, __this->mic_buf, sizeof(__this->mic_buf));
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
server_register_event_handler(__this->linein_enc, NULL, enc_server_event_handler);
|
||
cbuf_init(&__this->linein_cbuf, __this->linein_buf, sizeof(__this->linein_buf));
|
||
#endif
|
||
#if defined WIFI_PCM_STREAN_SOCKET_ENABLE && !DISABLE_AEC_CHANNEL
|
||
cbuf_init(&__this->aec_cbuf, __this->aec_buf, sizeof(__this->aec_buf));
|
||
#endif
|
||
#if !defined CONFIG_NO_SDRAM_ENABLE && !DISABLE_AEC_CHANNEL
|
||
cbuf_init(&__this->asr_cbuf, __this->asr_buf, sizeof(__this->asr_buf));
|
||
os_sem_create(&__this->asr_sem, 0);
|
||
#endif
|
||
|
||
os_sem_create(&__this->sem, 0);
|
||
|
||
thread_fork("wanson", 3, 1024, 0, &__this->pid, wanson_task, __this);
|
||
|
||
req.enc.cmd = AUDIO_ENC_OPEN;
|
||
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
#if WANSON_DUAL_MIC_ALGORITHM
|
||
req.enc.channel = 2;
|
||
req.enc.channel_bit_map = BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL);
|
||
#else
|
||
req.enc.channel = 1;
|
||
req.enc.channel_bit_map = BIT(CONFIG_AISP_MIC0_ADC_CHANNEL);
|
||
#endif
|
||
#else
|
||
#if WANSON_DUAL_MIC_ALGORITHM
|
||
req.enc.channel = DISABLE_AEC_CHANNEL ? 2 : 3;
|
||
req.enc.channel_bit_map = DISABLE_AEC_CHANNEL ? BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL) : \
|
||
BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL) | BIT(CONFIG_AISP_LINEIN_ADC_CHANNEL);
|
||
#else
|
||
req.enc.channel = DISABLE_AEC_CHANNEL ? 1 : 2;
|
||
req.enc.channel_bit_map = DISABLE_AEC_CHANNEL ? BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) : BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL);
|
||
#endif
|
||
#endif
|
||
req.enc.frame_size = ONCE_SR_POINTS * 2 * req.enc.channel;
|
||
req.enc.volume = CONFIG_AISP_MIC_ADC_GAIN;
|
||
req.enc.sample_rate = sample_rate;
|
||
req.enc.format = "pcm";
|
||
#if CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_PLNK0
|
||
req.enc.sample_source = "plnk0";
|
||
#elif CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_PLNK1
|
||
req.enc.sample_source = "plnk1";
|
||
#elif CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_IIS0
|
||
req.enc.sample_source = "iis0";
|
||
#elif CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_IIS1
|
||
req.enc.sample_source = "iis1";
|
||
#else
|
||
req.enc.sample_source = "mic";
|
||
#endif
|
||
req.enc.vfs_ops = &wanson_vfs_ops;
|
||
req.enc.output_buf_len = req.enc.frame_size * 3;
|
||
req.enc.file = (FILE *)&__this->mic_cbuf;
|
||
|
||
server_request(__this->mic_enc, AUDIO_REQ_ENC, &req);
|
||
|
||
#if defined CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
#if !DISABLE_AEC_CHANNEL
|
||
extern void adc_multiplex_set_gain(const char *source, u8 channel_bit_map, u8 gain);
|
||
adc_multiplex_set_gain("mic", BIT(CONFIG_AISP_LINEIN_ADC_CHANNEL), CONFIG_AISP_LINEIN_ADC_GAIN);
|
||
#endif
|
||
#else
|
||
memset(&req, 0, sizeof(req));
|
||
|
||
req.enc.cmd = AUDIO_ENC_OPEN;
|
||
req.enc.channel = 1;
|
||
req.enc.volume = CONFIG_AISP_LINEIN_ADC_GAIN;
|
||
req.enc.sample_rate = sample_rate;
|
||
req.enc.format = "pcm";
|
||
req.enc.frame_size = ONCE_SR_POINTS * 2;
|
||
#ifdef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN_OTHER
|
||
req.enc.sample_source = "mic"; //使用数字MIC且用差分MIC做回采时需要打开这个
|
||
#else
|
||
req.enc.sample_source = "linein";
|
||
#endif
|
||
req.enc.vfs_ops = &wanson_vfs_ops;
|
||
req.enc.output_buf_len = req.enc.frame_size * 3;
|
||
req.enc.channel_bit_map = BIT(CONFIG_AISP_LINEIN_ADC_CHANNEL);
|
||
req.enc.file = (FILE *)&__this->linein_cbuf;
|
||
|
||
server_request(__this->linein_enc, AUDIO_REQ_ENC, &req);
|
||
#endif
|
||
|
||
__this->sample_rate = sample_rate;
|
||
__this->run_flag = 1;
|
||
os_sem_post(&__this->sem);
|
||
|
||
return 0;
|
||
|
||
__err:
|
||
if (__this->mic_enc) {
|
||
server_close(__this->mic_enc);
|
||
__this->mic_enc = NULL;
|
||
}
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
if (__this->linein_enc) {
|
||
server_close(__this->linein_enc);
|
||
__this->linein_enc = NULL;
|
||
}
|
||
#endif
|
||
|
||
return -1;
|
||
}
|
||
|
||
void aisp_suspend(void)
|
||
{
|
||
union audio_req req = {0};
|
||
|
||
__this->run_flag = 0;
|
||
|
||
#if !defined CONFIG_NO_SDRAM_ENABLE && !DISABLE_AEC_CHANNEL
|
||
os_sem_post(&__this->asr_sem);
|
||
#endif
|
||
|
||
req.enc.cmd = AUDIO_ENC_STOP;
|
||
server_request(__this->mic_enc, AUDIO_REQ_ENC, &req);
|
||
cbuf_clear(&__this->mic_cbuf);
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
server_request(__this->linein_enc, AUDIO_REQ_ENC, &req);
|
||
cbuf_clear(&__this->linein_cbuf);
|
||
#endif
|
||
}
|
||
|
||
void aisp_resume(void)
|
||
{
|
||
union audio_req req = {0};
|
||
|
||
#if defined WIFI_PCM_STREAN_SOCKET_ENABLE && !DISABLE_AEC_CHANNEL
|
||
cbuf_clear(&__this->aec_cbuf);
|
||
#endif
|
||
|
||
Wanson_ASR_Reset();
|
||
|
||
__this->run_flag = 1;
|
||
os_sem_set(&__this->sem, 0);
|
||
os_sem_post(&__this->sem);
|
||
|
||
req.enc.cmd = AUDIO_ENC_OPEN;
|
||
#ifndef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
#if WANSON_DUAL_MIC_ALGORITHM
|
||
req.enc.channel = 2;
|
||
req.enc.channel_bit_map = BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL);
|
||
#else
|
||
req.enc.channel = 1;
|
||
req.enc.channel_bit_map = BIT(CONFIG_AISP_MIC0_ADC_CHANNEL);
|
||
#endif
|
||
#else
|
||
#if WANSON_DUAL_MIC_ALGORITHM
|
||
req.enc.channel = DISABLE_AEC_CHANNEL ? 2 : 3;
|
||
req.enc.channel_bit_map = DISABLE_AEC_CHANNEL ? BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL) : \
|
||
BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL) | BIT(CONFIG_AISP_LINEIN_ADC_CHANNEL);
|
||
#else
|
||
req.enc.channel = DISABLE_AEC_CHANNEL ? 1 : 2;
|
||
req.enc.channel_bit_map = DISABLE_AEC_CHANNEL ? BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) : BIT(CONFIG_AISP_MIC0_ADC_CHANNEL) | BIT(CONFIG_AISP_MIC1_ADC_CHANNEL);
|
||
#endif
|
||
#endif
|
||
req.enc.frame_size = ONCE_SR_POINTS * 2 * req.enc.channel;
|
||
req.enc.volume = CONFIG_AISP_MIC_ADC_GAIN;
|
||
req.enc.sample_rate = __this->sample_rate;
|
||
req.enc.format = "pcm";
|
||
#if CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_PLNK0
|
||
req.enc.sample_source = "plnk0";
|
||
#elif CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_PLNK1
|
||
req.enc.sample_source = "plnk1";
|
||
#elif CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_IIS0
|
||
req.enc.sample_source = "iis0";
|
||
#elif CONFIG_AUDIO_ENC_SAMPLE_SOURCE == AUDIO_ENC_SAMPLE_SOURCE_IIS1
|
||
req.enc.sample_source = "iis1";
|
||
#else
|
||
req.enc.sample_source = "mic";
|
||
#endif
|
||
req.enc.vfs_ops = &wanson_vfs_ops;
|
||
req.enc.output_buf_len = req.enc.frame_size * 3;
|
||
req.enc.file = (FILE *)&__this->mic_cbuf;
|
||
|
||
server_request(__this->mic_enc, AUDIO_REQ_ENC, &req);
|
||
|
||
#if defined CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN
|
||
#if !DISABLE_AEC_CHANNEL
|
||
extern void adc_multiplex_set_gain(const char *source, u8 channel_bit_map, u8 gain);
|
||
adc_multiplex_set_gain("mic", BIT(CONFIG_AISP_LINEIN_ADC_CHANNEL), CONFIG_AISP_LINEIN_ADC_GAIN);
|
||
#endif
|
||
#else
|
||
memset(&req, 0, sizeof(req));
|
||
|
||
req.enc.cmd = AUDIO_ENC_OPEN;
|
||
req.enc.channel = 1;
|
||
req.enc.volume = CONFIG_AISP_LINEIN_ADC_GAIN;
|
||
req.enc.sample_rate = __this->sample_rate;
|
||
req.enc.format = "pcm";
|
||
req.enc.frame_size = ONCE_SR_POINTS * 2;
|
||
#ifdef CONFIG_WANSON_DIFFER_MIC_REPLACE_LINEIN_OTHER
|
||
req.enc.sample_source = "mic"; //使用数字MIC且用差分MIC做回采时需要打开这个
|
||
#else
|
||
req.enc.sample_source = "linein";
|
||
#endif
|
||
req.enc.vfs_ops = &wanson_vfs_ops;
|
||
req.enc.output_buf_len = req.enc.frame_size * 3;
|
||
req.enc.channel_bit_map = BIT(CONFIG_AISP_LINEIN_ADC_CHANNEL);
|
||
req.enc.file = (FILE *)&__this->linein_cbuf;
|
||
|
||
server_request(__this->linein_enc, AUDIO_REQ_ENC, &req);
|
||
#endif
|
||
}
|
||
|
||
#endif
|