diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp.c index 7a88951..c489460 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp.c @@ -15,33 +15,35 @@ #include "debug_print.h" unsigned g_dsp_eof = 0; + void dnr_exchange_buffer(int32_t *data) { +#if XMOS_NS_EN || DNR_50MS || DNR_11MS static unsigned buff_index = 0; - write_to_sample_in_buf(data[1], buff_index, 0); - read_from_sample_out_buf(&data[1],buff_index, 0); + unsigned out_sample = 0; + write_to_sample_in_buf((unsigned)data[1], buff_index, 0); + read_from_sample_out_buf(&out_sample, buff_index, 0); + data[1] = (int32_t)out_sample; data[0] = data[1]; buff_index++; -#if DNR_11MS - if (buff_index == 128) + /* 改动原因:XMOS NS 块长 1024,满帧后轮转 triple-buffer 并通知 tile0 处理任务。 */ + if (buff_index == DNR_DSP_FRAME_SIZE) { -#else - if (buff_index == 512) - { -#endif buf_slot_rotate(); buff_index = 0; SET_SHARED_GLOBAL(g_dsp_eof, 1); } +#else + /* 改动原因:未启用 NS/DNR 时直通,保持 extra_i2s 链接符号可用。 */ + data[0] = data[1]; +#endif } - -void Aizip_DNR_init(void); - void dnr_dsp_proc_task(void) { -#if DNR_50MS || DNR_11MS - Aizip_DNR_init(); +#if XMOS_NS_EN || DNR_50MS || DNR_11MS + /* 改动原因:由 Aizip_DNR_init 替换为 xmos_ns_init,对接 libxmos_ns.a。 */ + xmos_ns_init(); while(1) { unsigned dsp_eof = 0; GET_SHARED_GLOBAL(dsp_eof, g_dsp_eof); diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.c index 3a4336b..0c0fd0e 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.c @@ -13,18 +13,23 @@ #include #include #include "dnr_dsp_buf.h" -#include "aizip_dnr.h" #include "debug_print.h" + +#if XMOS_NS_EN +#include "ns_api.h" +#elif defined(DNR_50MS) || defined(DNR_11MS) +#include "aizip_dnr.h" #include "flash.h" #include "swlock.h" - -// Global flash lock defined in lfs_services.c — protects all flash hardware access extern swlock_t flash_lock; +#endif -//for AGC -//static agc_stage_ctx_t DWORD_ALIGNED agc_stage_state = {}; - -static unsigned __attribute__((aligned (4))) dsp_dnr_frame_buf[BUF_SLOT_NUM][DSP_CH_NUM][DNR_DSP_FRAME_SIZE]; +/* 改动原因:XMOS NS 使用 int16 样点缓冲;原 Aizip DNR 使用 unsigned 32bit 缓冲。 */ +#if XMOS_NS_EN +static int16_t __attribute__((aligned(8))) dsp_dnr_frame_buf[BUF_SLOT_NUM][DSP_CH_NUM][DNR_DSP_FRAME_SIZE]; +#else +static unsigned __attribute__((aligned(4))) dsp_dnr_frame_buf[BUF_SLOT_NUM][DSP_CH_NUM][DNR_DSP_FRAME_SIZE]; +#endif unsigned sample_in_buf_slot=0; unsigned processing_buf_slot=2; @@ -57,13 +62,56 @@ void buf_slot_rotate() void write_to_sample_in_buf(unsigned data, unsigned index, unsigned ch) { +#if XMOS_NS_EN + /* 改动原因:USB 24bit 样点存于 int32 高 24 位,右移 16 位得到 int16 送入 NS。 */ + dsp_dnr_frame_buf[sample_in_buf_slot][ch][index] = (int16_t)((int32_t)data >> 16); +#else dsp_dnr_frame_buf[sample_in_buf_slot][ch][index]=data; +#endif } void read_from_sample_out_buf(unsigned* read_data, unsigned index, unsigned ch) { +#if XMOS_NS_EN + /* 改动原因:NS 输出 int16 左移 16 位还原为 USB 32bit 样点格式。 */ + *read_data = (unsigned)((int32_t)dsp_dnr_frame_buf[sample_out_buf_slot][ch][index] << 16); +#else *read_data = dsp_dnr_frame_buf[sample_out_buf_slot][ch][index]; +#endif } + +#if XMOS_NS_EN + +unsigned ns_init_flag = 0; + +void xmos_ns_init(void) +{ + ns_xmos_xc_init(); + /* 改动原因:仅启用 NS 降噪,关闭 NS 库内 EQ,避免与主 EQ 引擎冲突。 */ + ns_xmos_xc_set_module_enable(1, 0); + int16_t gains_zero[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + ns_xmos_xc_eq_set_all_gains(gains_zero); + ns_init_flag = 1; + debug_printf("XMOS NS init done\n"); +} + +void start_dsp_processing(void) +{ + int16_t __attribute__((aligned(8))) ns_in[DNR_DSP_FRAME_SIZE]; + int16_t __attribute__((aligned(8))) ns_out[DNR_DSP_FRAME_SIZE]; + + /* 改动原因:从 processing slot 取出 1024 样点单声道数据,调用 ns_xmos_xc_process 处理后写回。 */ + memcpy(ns_in, &dsp_dnr_frame_buf[processing_buf_slot][0][0], + DNR_DSP_FRAME_SIZE * sizeof(int16_t)); + + ns_xmos_xc_process(ns_in, ns_out); + + memcpy(&dsp_dnr_frame_buf[processing_buf_slot][0][0], ns_out, + DNR_DSP_FRAME_SIZE * sizeof(int16_t)); +} + +#elif defined(DNR_50MS) || defined(DNR_11MS) + #if DNR_11MS int8_t buffer[4208] __attribute__((aligned(4))); int8_t buffer2[31136] __attribute__((aligned(4))); @@ -79,27 +127,22 @@ azp_dnr_param_t pram = { .sample_rate = 48000}; unsigned dnr_init_flag = 0; -void Aizip_DNR_init(void) -{ -#if DNR_50MS || DNR_11MS - delay_microseconks(10000); - // setFlashPortPins(XS1_PORT_1B,XS1_PORT_1C,XS1_PORT_4B, XS1_CLKBLK_3); +void xmos_ns_init(void) +{ + delay_microseconds(10000); swlock_acquire(&flash_lock); int sta = AI_DNR_init(&pram); swlock_release(&flash_lock); dnr_init_flag = 1; debug_printf("AI_DNR_init status %d\n", sta); -#endif } void start_dsp_processing(void) { -#if DNR_50MS || DNR_11MS float level = -200; - setNoisy_mix_factor(level); - AI_DNR_Processing((int32_t *)&dsp_dnr_frame_buf[processing_buf_slot][0][0]); -#endif } + +#endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.h index 61d2edd..1ccdb82 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.h +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/dnr_dsp_buf.h @@ -10,11 +10,16 @@ #include #include #include -#if DNR_11MS + +/* 改动原因:XMOS_NS_EN 时单帧 1024 样点,替代原 DNR_50MS(512)/DNR_11MS(128) 帧长。 */ +#if XMOS_NS_EN +#define DNR_DSP_FRAME_SIZE 1024 +#elif DNR_11MS #define DNR_DSP_FRAME_SIZE 128 #else #define DNR_DSP_FRAME_SIZE 512 #endif + #define BUF_SLOT_NUM 3 //one for input, one for output, one for processing #define DSP_CH_NUM 2 @@ -30,10 +35,10 @@ void write_to_sample_in_buf(unsigned data, unsigned index, unsigned ch); void read_from_sample_out_buf(unsigned* read_data, unsigned index, unsigned ch); void start_dsp_processing(void); -void Aizip_DNR_init(void); +/* 改动原因:Aizip_DNR_init 更名为 xmos_ns_init,对接 libxmos_ns.a。 */ +void xmos_ns_init(void); #if __XC__ } //extern c #endif #endif //RINGBUFFER_H - 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..db6734c 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/dnr/ns_api.h b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/ns_api.h new file mode 100644 index 0000000..37d196f --- /dev/null +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/dnr/ns_api.h @@ -0,0 +1,33 @@ +#ifndef __NS_API_H__ +#define __NS_API_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* 改动原因:由 Aizip DNR 切换为 XMOS NS 库,初始化 NS 处理链及默认运行状态。 */ +void ns_xmos_xc_init(void); + +/* + * 改动原因:运行时控制 NS/EQ 子模块开关;C1 仅使用 NS,EQ 由主 EQ 引擎处理故 eq_enable=0。 + * ns_enable: 0 旁路 NS,非 0 开启 + * eq_enable: 0 旁路 NS 内建 EQ,非 0 开启 + */ +void ns_xmos_xc_set_module_enable(int ns_enable, int eq_enable); + +/* 改动原因:NS 库内建 10 段 EQ 增益设置,C1 默认全 0 旁路。 */ +void ns_xmos_xc_eq_set_all_gains(int16_t *gains); +void ns_xmos_xc_eq_set_band_gain(int band, int16_t gain); + +/* + * 改动原因:单声道处理,block 长度 1024 Samples(用户指定,替代原 DNR 512/128 帧)。 + */ +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/extra_i2s.xc b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/extra_i2s.xc index 247e6bc..d76fa90 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 @@ -15,48 +15,21 @@ #include "xc_ptr.h" #include "tile1_clk.h" -#if BR_UAC2 -unsigned g_3d_fps = 2; -#elif XMOS_FPS_EN +#if XMOS_FPS_EN unsigned g_3d_fps = 1; #else unsigned g_3d_fps = 0; #endif +/* 改动原因:factory 无 UAC1 时 UserBufferManagement 不编译,但 user_main 仍赋值 uc_br_data,须全局定义避免链接错误 */ +unsafe chanend uc_br_data; + /* TODO - Seperate recording and playback SRC related defines */ #if UAC1 -#ifndef USE_ASRC -#define USE_ASRC (0)//(0) -#endif - -#define DISABLE_ASRC_HIGHER_THAN_192000 1 - -#ifndef EXTRA_I2S_CHAN_COUNT_IN -#define EXTRA_I2S_CHAN_COUNT_IN (2) -#endif - -#ifndef EXTRA_I2S_CHAN_INDEX_IN -#define EXTRA_I2S_CHAN_INDEX_IN (0)//(0) -#endif - -#ifndef EXTRA_I2S_CHAN_COUNT_OUT -#define EXTRA_I2S_CHAN_COUNT_OUT (0) -#endif - -#ifndef EXTRA_I2S_CHAN_INDEX_OUT -#define EXTRA_I2S_CHAN_INDEX_OUT (0)//(0) -#endif - -#define DATA_BITS (32) - -#define SAMPLE_FREQUENCY (48000) -#define MASTER_CLOCK_FREQUENCY (24576000) - unsafe chanend uc_i2s; -unsafe chanend uc_br_data; /* Note, re-using I2S data lines on MC audio board for LR and Bit clocks */ @@ -95,12 +68,7 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi GET_SHARED_GLOBAL(tile1_ready, g_tile1_audio_ready); #endif - if (l_3d_fps == 2) - { - if (tile1_ready) - buffer_exchange((chanend) uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, NUM_USB_CHAN_OUT); - } - else if (l_3d_fps == 1) + if (l_3d_fps == 1) { if (tile1_ready) buffer_exchange((chanend)uc_br_data, sampsFromUsbToAudio, sampsFromAudioToUsb, 2); @@ -108,22 +76,14 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi if (dnr_enable) { - dnr_exchange_buffer((int32_t *)&sampsFromAudioToUsb[EXTRA_I2S_CHAN_INDEX_IN]); + dnr_exchange_buffer((int32_t *)&sampsFromAudioToUsb[0]); } else { sampsFromAudioToUsb[0] = sampsFromAudioToUsb[1]; } - if (adc_loop) - { - // sampsFromUsbToAudio[0] = (sampsFromAudioToUsb[1]) + (sampsFromUsbToAudio[0]); - // sampsFromUsbToAudio[1] = (sampsFromAudioToUsb[1]) + (sampsFromUsbToAudio[1]); - } - - // sampsFromAudioToUsb[0] = sampsFromUsbToAudio[0]; - // sampsFromAudioToUsb[0] = tmp; - } + } #endif } #endif diff --git a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c index 0f9d0c4..c82ef23 100644 --- a/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c +++ b/sw_usb_audio/app_usb_aud_fosi_c1/src/extensions/fps_wrapper.c @@ -10,8 +10,10 @@ #include "xc_ptr.h" #include "xua_conf.h" -/* 改动原因:FPS库V1.5改为单核xc接口,使用fps_api.h中的fps_xmos_xc_*声明 */ +#if XMOS_FPS_EN +/* 改动原因:FPS库V1.5改为单核xc接口,使用fps_api.h中的fps_xmos_xc_*声明;factory 不链接 libxmos_fps 故不编译 */ #include "fps_api.h" +#endif #include "fps_eq_sync.h" @@ -97,6 +99,8 @@ void fps_eq_publish_mode_and_gains(unsigned mode, const int16_t gains[FPS_EQ_BAN fps_eq_publish_gains_to_shared(gains); } +#if XMOS_FPS_EN + void fps_apply_eq_mode(void) { int16_t gains[FPS_EQ_BAND_COUNT]; @@ -257,4 +261,6 @@ void fps1_dsp_proc_task() SET_SHARED_GLOBAL(fps_buf_ready, 0); } } -} \ No newline at end of file +} + +#endif /* XMOS_FPS_EN */ \ No newline at end of file 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 fe94159..25fb3a2 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 @@ -520,6 +520,14 @@ int main() { USER_MAIN_CORES +#if XMOS_NS_EN + /* 改动原因:XMOS NS 降噪在 tile[0] 独立核运行,与 extra_i2s 的 triple-buffer 配合处理 1024 样点块。 */ + on tile[0]: { + set_core_high_priority_on(); + dnr_dsp_proc_task(); + } +#endif + #if XMOS_FPS_EN on tile[1]: { debug_printf("start fps_main\n"); @@ -532,12 +540,6 @@ int main() set_core_high_priority_on(); fps1_dsp_proc_task(); } -#else -#if UAC1 - on tile[1]: { - dsp_main(c_data_transport, cc_br_eof); - } -#endif #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); 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 a107a04..665aa6a 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 @@ -3,7 +3,6 @@ #define _USER_MAIN_H_ #ifdef __XC__ -#if (!MQA_EN) #include "app_dsp.h" // 改动原因:mode/mic mute LED物理端口在tile1,定义跨tile的LED控制interface,供tile0按键逻辑调用,tile1统一驱动硬件LED。 @@ -13,8 +12,7 @@ interface c1_led_ctrl_if { // 改动原因:规格 mic 指示灯仅反映静音——0=静音红灯常亮,1=非静音全灭;DNR 无灯由 APP 显示。 void set_mic_mute_state(unsigned mute_switch); }; -void switch_handler(void); -void flag_handler(); + /* 改动原因:固件升级 START 在 AudioHwRemote2 处理,需传入 c_dfu;其余升级命令在 process_send_params 直接处理 */ void AudioHwRemote(streaming chanend c, client interface c1_led_ctrl_if i_c1_led_ctrl, streaming chanend c_dfu, chanend c_app_sync); void i2s_driver(chanend c); @@ -55,7 +53,7 @@ extern unsigned g_fps_drc_mode; unsafe { \ uc_audiohw = (chanend) c_audiohw;\ uc_dfu = (chanend) c_dfu;\ - /* 改动原因:FPS/BR 音频经 c_data_transport 与 tile1 fps_main 交换;未赋值 uc_br_data 会导致 UserBufferManagement buffer_exchange ECALL */\ + /* 改动原因:FPS/BR 音频经 c_data_transport 与 tile1 fps_main 交换;factory 亦定义 uc_br_data 占位,避免链接错误 */\ uc_br_data = (chanend) c_data_transport;\ } \ }\ @@ -65,11 +63,6 @@ extern unsigned g_fps_drc_mode; on tile[1]: app_control_slave(i_c1_led_ctrl, c_app_sync); \ \ -#else - -#define USER_MAIN_DECLARATIONS_A -#define USER_MAIN_CORES_A // on tile[0]:{board_setup();} -#endif #endif