diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt b/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt index e60b057..2f191b1 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt +++ b/sw_usb_audio/app_usb_aud_fosi_c1/CMakeLists.txt @@ -101,6 +101,7 @@ set(APP_COMPILER_FLAGS_factory ${SW_FACT_AUDIO_FLAGS} -DI2S_CHANS_DA -DMIN_FREQ=\(48000\) -DDEFAULT_FREQ=\(48000\) -DUART_DEBUG=0 + -mcmodel=large -DHID_CONTROLS=1 -DEQ_EN=1 -DHID_DFU_EN=1 @@ -134,17 +135,19 @@ set(APP_COMPILER_FLAGS_fps_uac1 ${SW_USB_AUDIO_FLAGS} -DXUA_SPDIF_RX -DMIN_FREQ=\(48000\) -DDEFAULT_FREQ=\(48000\) -lxmos_fps + -lxmos_ns -DHID_CONTROLS_UAC1=1 -DHID_DFU_EN=1 -DEQ_EN=1 + -mcmodel=large -DXMOS_FPS_EN=1 + #-DXMOS_NS_EN=1 -DUAC1=1 -DWIN_OS_DETECTION=1 - #-DLOW_POWER_EN=1 -DCHAN_BUFF_CTRL=1 -DXUD_PRIORITY_HIGH=1 -DHID_CONTROLS=1 - -DDNR_50MS=1 + #-DDNR_50MS=1 -ldnr_50ms #-DDEBUG_MEMORY_LOG_ENABLED=1 -DNO_LOG_TIMESTAPS=0 diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_ns.a b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_ns.a new file mode 100644 index 0000000..1a56511 Binary files /dev/null and b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/libxmos_ns.a differ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc index f69bad4..b772482 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc @@ -65,7 +65,22 @@ void UserBufferManagementInit(unsigned samFreq) } extern void buffer_exchange(chanend c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], int num_chan); +#if XMOS_NS_EN +/* 改动原因:tile0侧ADC->USB交换在.xc实现,避免chanend与C侧chanend_t(unsigned)链接类型不匹配 */ +void ns_exchange_buffer_data(chanend c_data, int32_t *data) +{ + int sample; + + sample = data[1]; + c_data <: sample; + c_data :> sample; + data[1] = sample; + data[0] = data[1]; +} +unsafe chanend uc_ns_data; +#else void dnr_exchange_buffer(int32_t * unsafe data); +#endif extern unsigned g_dnr_enable; extern unsigned g_adc_loop; #if UAC1 @@ -89,7 +104,7 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi if (l_3d_fps == 2) { buffer_exchange((chanend) uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, NUM_USB_CHAN_OUT); - } + } else if (l_3d_fps == 1) { buffer_exchange((chanend)uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, 2); @@ -97,13 +112,18 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi if (dnr_enable) { +#if XMOS_NS_EN + /* 改动原因:XMOS_NS_EN时用tile1的NS库处理ADC->USB,替代tile0旧DNR */ + ns_exchange_buffer_data((chanend)uc_ns_data, (int32_t *)&sampsFromAudioToUsb[EXTRA_I2S_CHAN_INDEX_IN]); +#else dnr_exchange_buffer((int32_t *)&sampsFromAudioToUsb[EXTRA_I2S_CHAN_INDEX_IN]); +#endif } else { sampsFromAudioToUsb[0] = sampsFromAudioToUsb[1]; } - + if (adc_loop) { // sampsFromUsbToAudio[0] = (sampsFromAudioToUsb[1]) + (sampsFromUsbToAudio[0]); diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc index 2484cb8..f74b0b1 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/main.xc @@ -424,6 +424,14 @@ extern void fps_main(chanend c_data); extern void fps1_dsp_proc_task(); #endif +#if XMOS_NS_EN +/* 改动原因:NS集成放在main.xc而非user_main.h,避免user_main.h内嵌#if破坏MQA_EN/UAC1预处理结构 */ +extern void ns_main(chanend c_data); +extern void ns1_dsp_proc_task(void); +extern unsafe chanend uc_ns_data; + +#endif /* XMOS_NS_EN */ + /* Main for USB Audio Applications */ int main() { @@ -534,6 +542,19 @@ int main() } #endif #endif + +#if XMOS_NS_EN + /* 改动原因:NS处理ADC->USB单声道数据,运行在tile1,与FPS(USB->DAC)方向相反 */ + on tile[1]: { + set_core_high_priority_on(); + ns_main(c_ns_transport); + } + on tile[1]: { + set_core_high_priority_on(); + ns1_dsp_proc_task(); + } +#endif + #if (((XUA_SYNCMODE == XUA_SYNCMODE_SYNC && !XUA_USE_SW_PLL) || XUA_SPDIF_RX_EN || XUA_ADAT_RX_EN)) on tile[PLL_REF_TILE]: PllRefPinTask(i_pll_ref, p_pll_ref); #endif @@ -552,6 +573,9 @@ int main() { #ifdef XUD_PRIORITY_HIGH set_core_high_priority_on(); +#endif +#if XMOS_NS_EN + unsafe { uc_ns_data = (chanend) c_ns_transport; } #endif /* Run UAC2.0 at high-speed, UAC1.0 at full-speed */ unsigned usbSpeed = (AUDIO_CLASS == 2) ? XUD_SPEED_HS : XUD_SPEED_FS; diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_api.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_api.h new file mode 100644 index 0000000..200c8c0 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_api.h @@ -0,0 +1,37 @@ +#ifndef __NS_API_H__ +#define __NS_API_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* 初始化 NS 处理链及默认运行状态。 */ +void ns_xmos_xc_init(void); + +/* + * 设置运行时两个子模块的开关。 + * ns_enable: 0 表示旁路 NS 主处理,非 0 表示开启 + * eq_enable: 0 表示在 NS 阶段旁路 EQ,非 0 表示开启 + */ +void ns_xmos_xc_set_module_enable(int ns_enable, int eq_enable); + +/* 初始化运行,调节过程中不运行。 */ +/* 设置 10 段 EQ 的全部增益,单位为 0.01 dB,范围 -600 ~ 600。 */ +void ns_xmos_xc_eq_set_all_gains(int16_t *gains); + +/* 初始化不运行,调节过程中运行。 */ +/* 设置单个 EQ 频段增益,单位为 0.01 dB,范围 -600 ~ 600。 */ +void ns_xmos_xc_eq_set_band_gain(int band, int16_t gain); + +/* + * 单声道,block长度768 Samples + */ +void ns_xmos_xc_process(int16_t *input, int16_t *output); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_flash.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_flash.c new file mode 100644 index 0000000..cecb69b --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_flash.c @@ -0,0 +1,167 @@ +/* 改动原因:NS ns_eq 五模式增益在tile0侧LittleFS持久化,参照fps_eq_flash实现 */ +#include +#include +#include "ns_eq_flash.h" +#include "lfs_io.h" +#include "debug_print.h" + +#define NS_EQ_FLASH_PATH "ns_eq_store" +#define NS_EQ_FLASH_VERSION 0x01u + +static void ns_eq_default_name(uint8_t mode, char out_name[NS_EQ_NAME_LEN]) +{ + /* 改动原因:按协议约定提供小写默认模式名 ns_eq_0 ~ ns_eq_4 */ + snprintf(out_name, NS_EQ_NAME_LEN, "ns_eq_%u", (unsigned)mode); +} + +/* 改动原因:与fps_eq_flash相同逻辑,判断Flash中是否已有有效模式名 */ +static int ns_eq_name_has_saved_value(const char name[NS_EQ_NAME_LEN]) +{ + int i; + int all_zero = 1; + int all_ff = 1; + int has_terminator = 0; + unsigned char first = (unsigned char)name[0]; + + for (i = 0; i < NS_EQ_NAME_LEN; i++) { + unsigned char c = (unsigned char)name[i]; + if (c != 0x00) { + all_zero = 0; + } + if (c != 0xFF) { + all_ff = 0; + } + if (c == '\0') { + has_terminator = 1; + break; + } + } + + if (all_zero || all_ff) { + return 0; + } + if (first < 0x20) { + return 0; + } + if (!has_terminator) { + return 0; + } + return 1; +} + +void ns_eq_flash_set_defaults(ns_eq_flash_store_t *store) +{ + int m, b; + + memset(store, 0, sizeof(*store)); + store->magic = NS_EQ_FLASH_MAGIC; + store->version = NS_EQ_FLASH_VERSION; + store->current_mode = 0; + for (m = 0; m < NS_EQ_MODE_COUNT; m++) { + ns_eq_default_name((uint8_t)m, store->mode_names[m]); + for (b = 0; b < NS_EQ_BAND_COUNT; b++) { + store->gains[m][b] = NS_EQ_GAIN_DEFAULT; + } + } +} + +int16_t ns_eq_clamp_gain(int16_t gain) +{ + if (gain < NS_EQ_GAIN_MIN) { + return NS_EQ_GAIN_MIN; + } + if (gain > NS_EQ_GAIN_MAX) { + return NS_EQ_GAIN_MAX; + } + return gain; +} + +int ns_eq_flash_load(ns_eq_flash_store_t *out) +{ + ns_eq_flash_store_t tmp; + int m; + int need_repair = 0; + + ns_eq_flash_set_defaults(out); + + if (lfs_init() != 0) { + return -1; + } + + lfs_read_config((unsigned char *)NS_EQ_FLASH_PATH, + (unsigned char *)&tmp, + sizeof(tmp)); + lfs_deinit(); + + if (tmp.magic != NS_EQ_FLASH_MAGIC) { + debug_printf("ns_eq_flash: invalid magic, use defaults\n"); + return -1; + } + if (tmp.version != NS_EQ_FLASH_VERSION) { + debug_printf("ns_eq_flash: version mismatch, reset defaults\n"); + return -1; + } + + if (tmp.current_mode >= NS_EQ_MODE_COUNT) { + tmp.current_mode = 0; + need_repair = 1; + } + for (m = 0; m < NS_EQ_MODE_COUNT; m++) { + tmp.mode_names[m][NS_EQ_NAME_LEN - 1] = '\0'; + if (!ns_eq_name_has_saved_value(tmp.mode_names[m])) { + ns_eq_default_name((uint8_t)m, tmp.mode_names[m]); + need_repair = 1; + } + } + + *out = tmp; + if (need_repair) { + (void)ns_eq_flash_save(out); + } + return 0; +} + +int ns_eq_flash_save(const ns_eq_flash_store_t *store) +{ + ns_eq_flash_store_t to_write = *store; + int m; + + to_write.magic = NS_EQ_FLASH_MAGIC; + to_write.version = NS_EQ_FLASH_VERSION; + if (to_write.current_mode >= NS_EQ_MODE_COUNT) { + to_write.current_mode = 0; + } + for (m = 0; m < NS_EQ_MODE_COUNT; m++) { + to_write.mode_names[m][NS_EQ_NAME_LEN - 1] = '\0'; + if (to_write.mode_names[m][0] == '\0') { + ns_eq_default_name((uint8_t)m, to_write.mode_names[m]); + } + } + + if (lfs_init() != 0) { + return -1; + } + + lfs_write_config((unsigned char *)NS_EQ_FLASH_PATH, + (unsigned char *)&to_write, + sizeof(to_write)); + lfs_deinit(); + return 0; +} + +void ns_eq_name_get(const ns_eq_flash_store_t *store, uint8_t mode, char out_name[NS_EQ_NAME_LEN]) +{ + if (mode >= NS_EQ_MODE_COUNT) { + mode = 0; + } + memcpy(out_name, store->mode_names[mode], NS_EQ_NAME_LEN); + out_name[NS_EQ_NAME_LEN - 1] = '\0'; +} + +void ns_eq_name_set(ns_eq_flash_store_t *store, uint8_t mode, const char *name) +{ + if (store == NULL || mode >= NS_EQ_MODE_COUNT || name == NULL) { + return; + } + snprintf(store->mode_names[mode], NS_EQ_NAME_LEN, "%s", name); +} diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_flash.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_flash.h new file mode 100644 index 0000000..43f89b6 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_flash.h @@ -0,0 +1,32 @@ +#ifndef NS_EQ_FLASH_H +#define NS_EQ_FLASH_H + +#include + +/* 改动原因:NS库ns_eq五套预设(模式0-4),每套10段增益,单位0.01dB,存于tile0 Flash,结构参照fps_eq */ +#define NS_EQ_MODE_COUNT 5 +#define NS_EQ_BAND_COUNT 10 +#define NS_EQ_NAME_LEN 16 +#define NS_EQ_GAIN_DEFAULT 0 +#define NS_EQ_GAIN_MIN (-600) +#define NS_EQ_GAIN_MAX 600 +#define NS_EQ_FLASH_MAGIC 0x4E534551u /* "NSEQ" */ + +typedef struct { + uint32_t magic; + uint8_t version; + uint8_t current_mode; + uint8_t reserved[2]; + char mode_names[NS_EQ_MODE_COUNT][NS_EQ_NAME_LEN]; + int16_t gains[NS_EQ_MODE_COUNT][NS_EQ_BAND_COUNT]; +} ns_eq_flash_store_t; + +void ns_eq_flash_set_defaults(ns_eq_flash_store_t *store); +int ns_eq_flash_load(ns_eq_flash_store_t *out); +int ns_eq_flash_save(const ns_eq_flash_store_t *store); + +int16_t ns_eq_clamp_gain(int16_t gain); +void ns_eq_name_get(const ns_eq_flash_store_t *store, uint8_t mode, char out_name[NS_EQ_NAME_LEN]); +void ns_eq_name_set(ns_eq_flash_store_t *store, uint8_t mode, const char *name); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_sync.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_sync.h new file mode 100644 index 0000000..001c516 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_eq_sync.h @@ -0,0 +1,23 @@ +#ifndef NS_EQ_SYNC_H +#define NS_EQ_SYNC_H + +#include +#include "ns_eq_flash.h" + +/* 改动原因:int16增益经5个int32共享字在tile0/tile1间传递(dp仅支持32位SHARED_GLOBAL),参照fps_eq_sync */ +extern unsigned g_ns_eq_mode; +extern int32_t g_ns_eq_pack0; +extern int32_t g_ns_eq_pack1; +extern int32_t g_ns_eq_pack2; +extern int32_t g_ns_eq_pack3; +extern int32_t g_ns_eq_pack4; + +void ns_eq_unpack_gains(int16_t out[NS_EQ_BAND_COUNT]); +void ns_eq_publish_gains_to_shared(const int16_t gains[NS_EQ_BAND_COUNT]); +void ns_eq_publish_mode_and_gains(unsigned mode, const int16_t gains[NS_EQ_BAND_COUNT]); + +void ns_apply_eq_mode(void); +void ns_apply_eq_band_gain(unsigned band, int16_t gain); +void ns_apply_module_enable(void); + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_wrapper.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_wrapper.c new file mode 100644 index 0000000..a2b2411 --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/ns_wrapper.c @@ -0,0 +1,200 @@ +// Copyright 2024 XMOS LIMITED. +// This Software is subject to the terms of the XMOS Public Licence: Version 1. +#include +#include +#include +#include +#include +#include +#include +#include "xc_ptr.h" + +#include "xua_conf.h" +#if XMOS_NS_EN +/* 改动原因:NS库单核xc接口,使用dnr/ns_api.h中的ns_xmos_xc_*声明;数据流为ADC->USB,与FPS相反 */ +#include "ns_api.h" +#include "ns_eq_sync.h" + +#define NS_SLOT_NUM 3 +#define NS_FRAME_SIZE 768 +/* 改动原因:ns_api.h约定单声道块长度768 sample */ + +short __attribute__((aligned (4))) dsp_ns_input_buf[NS_SLOT_NUM][NS_FRAME_SIZE]; +short __attribute__((aligned (4))) dsp_ns_out_buf[NS_SLOT_NUM][NS_FRAME_SIZE]; + +unsigned ns_buf_ready = 0; +unsigned ns_write_pos = 0; +unsigned ns_process_pos = 0; +/* 改动原因:ns主处理开关由tile0的g_dnr_enable(麦克风长按)控制,与旧DNR用户操作一致 */ +unsigned g_ns_eq_enable = 0; +/* 改动原因:g_dnr_enable定义在audiohw.xc(tile0),NS主处理开关与其绑定 */ +extern unsigned g_dnr_enable; + +/* 改动原因:ns_eq当前模式(0-4)与10段增益,经5个pack字在tile0/tile1共享 */ +unsigned g_ns_eq_mode = 0; +int32_t g_ns_eq_pack0 = 0; +int32_t g_ns_eq_pack1 = 0; +int32_t g_ns_eq_pack2 = 0; +int32_t g_ns_eq_pack3 = 0; +int32_t g_ns_eq_pack4 = 0; + +static int32_t ns_eq_make_pack(int16_t lo, int16_t hi) +{ + return ((int32_t)(uint16_t)lo) | (((int32_t)(uint16_t)hi) << 16); +} + +static int16_t ns_eq_pack_lo(int32_t w) +{ + return (int16_t)(w & 0xFFFF); +} + +static int16_t ns_eq_pack_hi(int32_t w) +{ + return (int16_t)((w >> 16) & 0xFFFF); +} + +void ns_eq_unpack_gains(int16_t out[NS_EQ_BAND_COUNT]) +{ + int32_t p0, p1, p2, p3, p4; + + GET_SHARED_GLOBAL(p0, g_ns_eq_pack0); + GET_SHARED_GLOBAL(p1, g_ns_eq_pack1); + GET_SHARED_GLOBAL(p2, g_ns_eq_pack2); + GET_SHARED_GLOBAL(p3, g_ns_eq_pack3); + GET_SHARED_GLOBAL(p4, g_ns_eq_pack4); + + out[0] = ns_eq_pack_lo(p0); + out[1] = ns_eq_pack_hi(p0); + out[2] = ns_eq_pack_lo(p1); + out[3] = ns_eq_pack_hi(p1); + out[4] = ns_eq_pack_lo(p2); + out[5] = ns_eq_pack_hi(p2); + out[6] = ns_eq_pack_lo(p3); + out[7] = ns_eq_pack_hi(p3); + out[8] = ns_eq_pack_lo(p4); + out[9] = ns_eq_pack_hi(p4); +} + +void ns_eq_publish_gains_to_shared(const int16_t gains[NS_EQ_BAND_COUNT]) +{ + SET_SHARED_GLOBAL(g_ns_eq_pack0, ns_eq_make_pack(gains[0], gains[1])); + SET_SHARED_GLOBAL(g_ns_eq_pack1, ns_eq_make_pack(gains[2], gains[3])); + SET_SHARED_GLOBAL(g_ns_eq_pack2, ns_eq_make_pack(gains[4], gains[5])); + SET_SHARED_GLOBAL(g_ns_eq_pack3, ns_eq_make_pack(gains[6], gains[7])); + SET_SHARED_GLOBAL(g_ns_eq_pack4, ns_eq_make_pack(gains[8], gains[9])); +} + +void ns_eq_publish_mode_and_gains(unsigned mode, const int16_t gains[NS_EQ_BAND_COUNT]) +{ + SET_SHARED_GLOBAL(g_ns_eq_mode, mode); + ns_eq_publish_gains_to_shared(gains); +} + +void ns_apply_eq_mode(void) +{ + int16_t gains[NS_EQ_BAND_COUNT]; + + ns_eq_unpack_gains(gains); + /* 改动原因:切换模式时用eq_set_all_gains一次性加载当前模式10段增益 */ + ns_xmos_xc_eq_set_all_gains(gains); +} + +void ns_apply_eq_band_gain(unsigned band, int16_t gain) +{ + if (band >= NS_EQ_BAND_COUNT) { + return; + } + /* 改动原因:运行中单段调节使用ns_xmos_xc_eq_set_band_gain */ + ns_xmos_xc_eq_set_band_gain((int)band, gain); +} + +/* 改动原因:tile0侧ns_exchange_buffer_data已移至extra_i2s.xc(.xc用chanend),本文件仅保留tile1侧ns_main/DSP */ + +/* 改动原因:tile1侧单声道帧收发,累积768 sample后触发DSP;输出为延迟后的处理结果 */ +void ns_main(chanend_t c_data) +{ + int input[1]; + int output[1]; + int count = 0; + unsigned write_pos = 0; + unsigned read_pos = 0; + + while (1) { + chan_in_buf_word(c_data, input, 1); + chan_out_buf_word(c_data, output, 1); + + if (count == 0) { + read_pos = (write_pos + 1 + NS_SLOT_NUM) % NS_SLOT_NUM; + } + + dsp_ns_input_buf[write_pos][count] = (short)(input[0] >> 16); + output[0] = (int)(dsp_ns_out_buf[read_pos][count]) << 16; + + if (count != (NS_FRAME_SIZE - 1)) { + count++; + } else { + count = 0; + + SET_SHARED_GLOBAL(ns_process_pos, write_pos); + + write_pos = (write_pos + 1) % NS_SLOT_NUM; + SET_SHARED_GLOBAL(ns_write_pos, write_pos); + + SET_SHARED_GLOBAL(ns_buf_ready, 1); + } + } +} + +/* 改动原因:按g_dnr_enable(用户DNR开关)与g_ns_eq_enable同步NS主处理/ns_eq两模块开关到算法库 */ +void ns_apply_module_enable(void) +{ + unsigned ns_enable; + unsigned eq_enable; + + GET_SHARED_GLOBAL(ns_enable, g_dnr_enable); + GET_SHARED_GLOBAL(eq_enable, g_ns_eq_enable); + + ns_xmos_xc_set_module_enable( + (ns_enable != 0) ? 1 : 0, + (eq_enable != 0) ? 1 : 0); +} + +/* 改动原因:集中NS库初始化顺序——init→ns_eq全段增益→两模块使能 */ +static void ns_xmos_modules_init(void) +{ + int16_t gains[NS_EQ_BAND_COUNT]; + + ns_xmos_xc_init(); + + ns_eq_unpack_gains(gains); + ns_xmos_xc_eq_set_all_gains(gains); + + ns_apply_module_enable(); +} + +#pragma stackfunction 4096 +void ns1_dsp_proc_task(void) +{ + ns_xmos_modules_init(); + + while (1) { + unsigned ready; + + GET_SHARED_GLOBAL(ready, ns_buf_ready); + while (ready) { + unsigned cur_pos; + + GET_SHARED_GLOBAL(cur_pos, ns_process_pos); + + /* 改动原因:每帧处理前刷新模块使能,支持运行时切换g_dnr_enable */ + ns_apply_module_enable(); + + ns_xmos_xc_process(dsp_ns_input_buf[cur_pos], dsp_ns_out_buf[cur_pos]); + + ready = 0; + SET_SHARED_GLOBAL(ns_buf_ready, 0); + } + } +} + +#endif /* XMOS_NS_EN */ diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h index 59edb91..8431929 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/user_main.h @@ -26,6 +26,7 @@ void i2s_driver(chanend c); extern unsafe chanend uc_i2s; extern unsafe chanend uc_br_data; extern unsafe chanend uc_eq_data; +extern unsafe chanend uc_ns_data; extern void UserBufferManagementSetChan(chanend c); extern void dsp_main (chanend c_data , chanend cc_br_eof); extern void br_dsp_proc_task(chanend c_validate, chanend cc_br_eof); @@ -39,10 +40,10 @@ extern unsafe streaming chanend uc_dfu; extern void fps1_dsp_proc_task(void); extern void fps2_dsp_proc_task(void); -#define USER_MAIN_DECLARATIONS chan c_data_transport, cc_br_eof, c_validate; \ +#define USER_MAIN_DECLARATIONS chan cc_br_eof, c_validate, c_ns_transport, c_data_transport; \ streaming chan c_audiohw; streaming chan c_dfu; interface c1_led_ctrl_if i_c1_led_ctrl; \ chan c_usb_to_io; chan c_io_to_usb; chan c_io_to_dspL; chan c_dspL_to_io; chan c_io_to_dspR; chan c_dspR_to_io; \ - chan c_erase; + chan c_erase; @@ -66,15 +67,10 @@ extern void fps2_dsp_proc_task(void); #else #define USER_MAIN_CORES on tile[0]: {\ - dnr_dsp_proc_task();\ - }\ - on tile[0]: {\ unsafe { \ uc_audiohw = (chanend) c_audiohw;\ - uc_br_data = (chanend) c_data_transport;\ uc_dfu = (chanend) c_dfu;\ } \ - validate_algo(c_validate); \ }\ on tile[0]: {\ AudioHwRemote(c_audiohw, i_c1_led_ctrl, c_erase, c_dfu);\