f1 recording working

This commit is contained in:
Steven Dan
2026-06-05 16:31:17 +08:00
parent 344e04aa33
commit 0e3d9ed7c5
2 changed files with 25 additions and 80 deletions

View File

@@ -13,6 +13,7 @@
#include "xc_ptr.h" #include "xc_ptr.h"
#include "xua_conf.h" #include "xua_conf.h"
#include "share_buffer.h"
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1 #if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
/* 改动原因3 streaming chan + 1 普通 chan 传 us 192kHz跨 tile 静态内存不共享) */ /* 改动原因3 streaming chan + 1 普通 chan 传 us 192kHz跨 tile 静态内存不共享) */
@@ -24,24 +25,30 @@ uint32_t uc_ssrc_us_out; /* tile[1]→tile[0] 192kHz 升采样结果普通c
void dnr_exchange_buffer(int32_t *data); void dnr_exchange_buffer(int32_t *data);
/* 改动原因dsp.c 的 UserBufferManagement 已将播放路径 EQ 内化到 tile[1] // sample_freq 作为首字发送给 tile[0] 的 dsp_main用于采样率变化检测和 EQ 初始化
* buffer_exchange 现只交换 mic 数据sampsFromAudioToUsbsample_freq void buffer_exchange(chanend_t c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], unsigned sample_freq) {
* 对应 dsp.c line 364: buffer_exchange(uc_eq_data, sampsFromAudioToUsb, ubm_sample_freq)
* 原 4 参数版本(含 sampsFromUsbToAudio与实际调用不匹配是播放/录音均有噪音的根因 */
void buffer_exchange(chanend_t c_data,
unsigned sampsFromAudioToUsb[],
unsigned sample_freq)
{
chan_out_word(c_data, sample_freq); chan_out_word(c_data, sample_freq);
chan_out_buf_word(c_data, sampsFromAudioToUsb, 2); /* tile[1]→tile[0]: 原始 mic 数据 */ // chan_out_buf_word (c_data, sampsFromUsbToAudio, 2);
chan_in_buf_word (c_data, sampsFromAudioToUsb, 2); /* tile[0]→tile[1]: 经 SSRC/DNR 处理后的 mic */ // chan_in_buf_word (c_data , sampsFromUsbToAudio, 2);
#if DNR_ENABLE == 1
chan_out_buf_word (c_data, sampsFromAudioToUsb, 2);
chan_in_buf_word (c_data , sampsFromAudioToUsb, 2);
#endif
} }
void dsp_main (chanend_t c_data) { void dsp_main (chanend_t c_data) {
int play_input[NUM_USB_CHAN_OUT];
int play_output[I2S_CHANS_DAC];
int mic_input[I2S_CHANS_ADC]; int mic_input[I2S_CHANS_ADC];
int mic_output[I2S_CHANS_ADC]; int mic_output[I2S_CHANS_ADC];
int count = 0;
unsigned ch[1] = {2};
#if F1_MUSIC_UAC2 == 1
unsigned current_sample_freq = 0; unsigned current_sample_freq = 0;
#else
unsigned current_sample_freq = 48000;
#endif
#if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1 #if F1_MUSIC_UAC2 == 1 && DNR_ENABLE == 1
static int mic_48k[2] = {0, 0}; static int mic_48k[2] = {0, 0};
@@ -57,6 +64,7 @@ void dsp_main (chanend_t c_data) {
/* 协议tile[1] 先发 sample_freq再发 mic_input[2] /* 协议tile[1] 先发 sample_freq再发 mic_input[2]
* tile[0] 接收处理后发回 mic_output[2] */ * tile[0] 接收处理后发回 mic_output[2] */
unsigned sample_freq = (unsigned)chan_in_word(c_data); unsigned sample_freq = (unsigned)chan_in_word(c_data);
// chan_in_buf_word (c_data , play_input, 2);
/* 采样率变化:复位 SSRC 状态 */ /* 采样率变化:复位 SSRC 状态 */
if (sample_freq != current_sample_freq && sample_freq != 0) { if (sample_freq != current_sample_freq && sample_freq != 0) {
@@ -69,6 +77,7 @@ void dsp_main (chanend_t c_data) {
#endif #endif
} }
// chan_out_buf_word (c_data , play_output, I2S_CHANS_DAC);
chan_in_buf_word(c_data, mic_input, 2); /* 接收 tile[1] 发来的原始 mic */ chan_in_buf_word(c_data, mic_input, 2); /* 接收 tile[1] 发来的原始 mic */
#if DNR_ENABLE == 1 #if DNR_ENABLE == 1

View File

@@ -33,18 +33,8 @@ extern unsigned char load_value(unsigned char *path);
#if EQ_EN #if EQ_EN
#include "eq_flash_storage.h" #include "eq_flash_storage.h"
#include "eq.h"
/* 改动原因EQ 处理移至 tile[1] (UserBufferManagement) 直接处理,
* 不再绕行 tile[0] dsp_main消除跨 tile 来回导致的音频延迟与噪音 */
/* 改动原因handler_eq_filter 已在 eq.h 正确声明为 int32_t 返回,
* 此处重复声明为 unsigned int 导致类型冲突编译错误,删除冗余 extern */
extern uint32_t init_eq_data(unsigned sample_freq);
extern unsigned int is_mode_changed(void);
extern void change_eq_mode(unsigned sample_freq);
extern void clear_eq_status(unsigned sample_freq, unsigned ch_no);
extern unsigned g_request_eq_mode, g_new_eq_mode; extern unsigned g_request_eq_mode, g_new_eq_mode;
extern unsigned g_force_request_eq_mode_change, g_force_eq_mode_change; extern unsigned g_force_request_eq_mode_change, g_force_eq_mode_change;
#define LEN_FADE_UBM (2024)
#endif #endif
extern void device_reboot(void); extern void device_reboot(void);
@@ -171,11 +161,6 @@ void key_sender(chanend_t c)
void UserBufferManagementInit(unsigned sampFreq) void UserBufferManagementInit(unsigned sampFreq)
{ {
ubm_sample_freq = sampFreq; ubm_sample_freq = sampFreq;
#if EQ_EN
/* 改动原因EQ 移至 tile[1],在采样率初始化时直接初始化 EQ 系数,
* 无需再经由 tile[0] dsp_main 的 init_eq_data 调用 */
init_eq_data(sampFreq);
#endif
#if USE_EX3D == 1 #if USE_EX3D == 1
memset(ubm_ingress, 0, sizeof(ubm_ingress)); memset(ubm_ingress, 0, sizeof(ubm_ingress));
memset(ubm_egress, 0, sizeof(ubm_egress)); memset(ubm_egress, 0, sizeof(ubm_egress));
@@ -208,9 +193,7 @@ void UserBufferManagementInit(unsigned sampFreq)
} }
float fLevel[NUM_USB_CHAN_OUT] = {0,}; float fLevel[NUM_USB_CHAN_OUT] = {0,};
enum {UBM_A3D_OFF=0, UBM_A3D_VON=1, UBM_A3D_ON=2}; enum {UBM_A3D_OFF=0, UBM_A3D_VON=1, UBM_A3D_ON=2};
/* 改动原因buffer_exchange 改为只传 mic 数据sampsFromAudioToUsb extern void buffer_exchange(chanend_t c_data, unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], unsigned sample_freq);
* 播放路径 EQ 直接在 tile[1] UserBufferManagement 内处理,消除跨 tile 往返 */
extern void buffer_exchange(chanend_t c_data, unsigned sampsFromAudioToUsb[], unsigned sample_freq);
extern unsigned int is_eq_disabled(void); extern unsigned int is_eq_disabled(void);
extern unsigned int g_eq_enable; extern unsigned int g_eq_enable;
@@ -311,57 +294,10 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
chan_in_buf_word(uc_ex3d_to_ubm, (uint32_t *)ubm_ingress, EX3D_TO_UBM_CHANS * DSP_BLOCK_LENGTH); chan_in_buf_word(uc_ex3d_to_ubm, (uint32_t *)ubm_ingress, EX3D_TO_UBM_CHANS * DSP_BLOCK_LENGTH);
}; };
#endif #endif
#if 0// EQ_EN == 1 && USE_EX3D == 0 #if EQ_EN == 1 && USE_EX3D == 0
/* 改动原因:播放路径 EQ 直接在 tile[1] 处理,不再绕道 tile[0] dsp_main。 buffer_exchange(uc_eq_data, sampsFromUsbToAudio, sampsFromAudioToUsb, ubm_sample_freq);
* 原 dsp_core0.xc 通过 ring_buffer 管道做 EQ每 192kHz 拍都要跨 tile 通信, #elif DNR_ENABLE == 1
* 引入不确定延迟导致播放噪音。现改为在当前拍内直接调用 handler_eq_filter buffer_exchange(uc_eq_data, sampsFromUsbToAudio, sampsFromAudioToUsb, ubm_sample_freq);
* 并复制原 dsp_core0.xc 的淡入/淡出换模式逻辑。 */
{
static unsigned b_fade_in = 0, b_fade_out = 0;
static unsigned u_in_step = 0, u_out_step = 0;
int audio_out_0 = handler_eq_filter(ubm_sample_freq, 0, (int)sampsFromUsbToAudio[0]);
int audio_out_1 = handler_eq_filter(ubm_sample_freq, 1, (int)sampsFromUsbToAudio[1]);
if (is_mode_changed() && !b_fade_out && !b_fade_in) {
b_fade_out = 1;
u_out_step = 1;
}
if (b_fade_out) {
audio_out_0 /= LEN_FADE_UBM;
audio_out_0 *= (int)(LEN_FADE_UBM - u_out_step);
audio_out_1 /= LEN_FADE_UBM;
audio_out_1 *= (int)(LEN_FADE_UBM - u_out_step);
if (++u_out_step == LEN_FADE_UBM) {
b_fade_out = 0;
change_eq_mode(ubm_sample_freq);
clear_eq_status(ubm_sample_freq, 0);
clear_eq_status(ubm_sample_freq, 1);
b_fade_in = 1;
u_in_step = 1;
}
}
if (b_fade_in) {
audio_out_0 /= LEN_FADE_UBM;
audio_out_0 *= (int)u_in_step;
audio_out_1 /= LEN_FADE_UBM;
audio_out_1 *= (int)u_in_step;
if (++u_in_step >= LEN_FADE_UBM) {
b_fade_in = 0;
}
}
sampsFromUsbToAudio[0] = (unsigned)audio_out_0;
sampsFromUsbToAudio[1] = (unsigned)audio_out_1;
}
#endif
/* 改动原因mic 路径SSRC+DNR仍走 dsp_main但 buffer_exchange
* 已精简为只传 mic 数据,不再携带播放数据,降低每拍通信量 */
#if DNR_ENABLE == 1
buffer_exchange(uc_eq_data, sampsFromAudioToUsb, ubm_sample_freq);
#endif #endif
GET_SHARED_GLOBAL(is_monitor, g_monitor_switch_t1); GET_SHARED_GLOBAL(is_monitor, g_monitor_switch_t1);