作者 ookk303

speex参数调整 t40s功率调整

@@ -209,7 +209,7 @@ void *JZ_T40_SubConnectTask(void *arg) @@ -209,7 +209,7 @@ void *JZ_T40_SubConnectTask(void *arg)
209 { 209 {
210 HalSend_type1Send_SearchLight_SetLumenPowerLimit(UART_DEV_2, 0x00, 0x64, 0x20, 0x00); 210 HalSend_type1Send_SearchLight_SetLumenPowerLimit(UART_DEV_2, 0x00, 0x64, 0x20, 0x00);
211 211
212 - SearchLight_SetExtrenLimit(90); 212 + SearchLight_SetExtrenLimit(85);
213 } 213 }
214 else 214 else
215 { 215 {
@@ -237,7 +237,7 @@ void *JZ_T40_SubConnectTask(void *arg) @@ -237,7 +237,7 @@ void *JZ_T40_SubConnectTask(void *arg)
237 { 237 {
238 HalSend_type1Send_SearchLight_SetLumenPowerLimit(UART_DEV_2, 0x00, 0x64, 0x20, 0x00); 238 HalSend_type1Send_SearchLight_SetLumenPowerLimit(UART_DEV_2, 0x00, 0x64, 0x20, 0x00);
239 239
240 - SearchLight_SetExtrenLimit(95); 240 + SearchLight_SetExtrenLimit(90);
241 } 241 }
242 else 242 else
243 { 243 {
@@ -260,7 +260,8 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, short *bu @@ -260,7 +260,8 @@ T_JZsdkReturnCode AudioDeal_PcmDataInput_RealTimeSteam(int In_Bitrate, short *bu
260 #ifdef SPEEX_STATUS_ON 260 #ifdef SPEEX_STATUS_ON
261 261
262 //回音消除+噪声抑制 262 //回音消除+噪声抑制
263 - Speex_ProcessMic(buffer, buffer); 263 + //Speex_ProcessMic(buffer, buffer);
  264 + Speex_DenoiseOnly_Process(buffer, buffer);
264 265
265 #endif 266 #endif
266 267
@@ -10,9 +10,9 @@ @@ -10,9 +10,9 @@
10 10
11 // ========== 可配置参数 ========== 11 // ========== 可配置参数 ==========
12 #define TAIL_MS 300 // 回声尾长(毫秒) 12 #define TAIL_MS 300 // 回声尾长(毫秒)
13 -#define FRAME_SAMPLES 640 // 每帧样本数 640个short 13 +#define FRAME_SAMPLES 640 // 每帧样本数(640个short)
14 #define SAMPLE_RATE 16000 // 采样率 14 #define SAMPLE_RATE 16000 // 采样率
15 -#define PLAYBACK_DELAY_FRAMES 1 // 播放延迟(帧数),1 表示用上一帧作为参考 15 +#define PLAYBACK_DELAY_FRAMES 19 // 播放延迟(帧数),软件时间0.75秒约19帧
16 // ================================= 16 // =================================
17 17
18 typedef struct JZ_SpeexInfo { 18 typedef struct JZ_SpeexInfo {
@@ -26,12 +26,12 @@ typedef struct JZ_SpeexInfo { @@ -26,12 +26,12 @@ typedef struct JZ_SpeexInfo {
26 26
27 // 环形缓冲区,存储历史输出帧(即播放过的数据) 27 // 环形缓冲区,存储历史输出帧(即播放过的数据)
28 short* HistoryBuffer; 28 short* HistoryBuffer;
29 - int HistorySize; // 缓冲区总长度(样本数)  
30 - int WritePos; // 下一个写入位置  
31 - int TotalWritten; // 累计写入样本数(用于判断缓冲区是否足够) 29 + int HistorySize;
  30 + int WritePos;
  31 + int TotalWritten;
32 32
33 SpeexPreprocessState* DenoiseOnlyState; 33 SpeexPreprocessState* DenoiseOnlyState;
34 - int DenoiseOnlyFlag; // 是否启用独立降噪模式 34 + int DenoiseOnlyFlag;
35 35
36 int Flag; 36 int Flag;
37 } JZ_SpeexInfo; 37 } JZ_SpeexInfo;
@@ -39,11 +39,14 @@ typedef struct JZ_SpeexInfo { @@ -39,11 +39,14 @@ typedef struct JZ_SpeexInfo {
39 static JZ_SpeexInfo g_SpeexInfo = { 0 }; 39 static JZ_SpeexInfo g_SpeexInfo = { 0 };
40 40
41 // 初始化历史缓冲区 41 // 初始化历史缓冲区
42 -static int InitHistoryBuffer(int size_samples) {  
43 - if (g_SpeexInfo.HistoryBuffer) { 42 +static int InitHistoryBuffer(int size_samples)
  43 +{
  44 + if (g_SpeexInfo.HistoryBuffer)
  45 + {
44 free(g_SpeexInfo.HistoryBuffer); 46 free(g_SpeexInfo.HistoryBuffer);
45 g_SpeexInfo.HistoryBuffer = NULL; 47 g_SpeexInfo.HistoryBuffer = NULL;
46 } 48 }
  49 +
47 g_SpeexInfo.HistoryBuffer = (short*)malloc(size_samples * sizeof(short)); 50 g_SpeexInfo.HistoryBuffer = (short*)malloc(size_samples * sizeof(short));
48 if (!g_SpeexInfo.HistoryBuffer) return -1; 51 if (!g_SpeexInfo.HistoryBuffer) return -1;
49 memset(g_SpeexInfo.HistoryBuffer, 0, size_samples * sizeof(short)); 52 memset(g_SpeexInfo.HistoryBuffer, 0, size_samples * sizeof(short));
@@ -54,7 +57,8 @@ static int InitHistoryBuffer(int size_samples) { @@ -54,7 +57,8 @@ static int InitHistoryBuffer(int size_samples) {
54 } 57 }
55 58
56 // 写入一帧到历史缓冲区(播放过的帧) 59 // 写入一帧到历史缓冲区(播放过的帧)
57 -static void WriteHistoryFrame(short* frame) { 60 +static void WriteHistoryFrame(short* frame)
  61 +{
58 int fs = g_SpeexInfo.FrameSize; 62 int fs = g_SpeexInfo.FrameSize;
59 int hist_size = g_SpeexInfo.HistorySize; 63 int hist_size = g_SpeexInfo.HistorySize;
60 int write_pos = g_SpeexInfo.WritePos; 64 int write_pos = g_SpeexInfo.WritePos;
@@ -72,7 +76,8 @@ static void WriteHistoryFrame(short* frame) { @@ -72,7 +76,8 @@ static void WriteHistoryFrame(short* frame) {
72 } 76 }
73 77
74 // 从历史缓冲区读取参考帧(对齐到当前麦克风时间) 78 // 从历史缓冲区读取参考帧(对齐到当前麦克风时间)
75 -static int ReadRefFrame(short* out_ref) { 79 +static int ReadRefFrame(short* out_ref)
  80 +{
76 int fs = g_SpeexInfo.FrameSize; 81 int fs = g_SpeexInfo.FrameSize;
77 int hist_size = g_SpeexInfo.HistorySize; 82 int hist_size = g_SpeexInfo.HistorySize;
78 int write_pos = g_SpeexInfo.WritePos; 83 int write_pos = g_SpeexInfo.WritePos;
@@ -122,8 +127,7 @@ T_JZsdkReturnCode Speex_Deinit() @@ -122,8 +127,7 @@ T_JZsdkReturnCode Speex_Deinit()
122 g_SpeexInfo.Flag = JZ_FLAGCODE_OFF; 127 g_SpeexInfo.Flag = JZ_FLAGCODE_OFF;
123 } 128 }
124 129
125 - //降噪注销  
126 - if (g_SpeexInfo.DenoiseOnlyState) 130 + if (g_SpeexInfo.DenoiseOnlyState)
127 { 131 {
128 speex_preprocess_state_destroy(g_SpeexInfo.DenoiseOnlyState); 132 speex_preprocess_state_destroy(g_SpeexInfo.DenoiseOnlyState);
129 g_SpeexInfo.DenoiseOnlyState = NULL; 133 g_SpeexInfo.DenoiseOnlyState = NULL;
@@ -133,8 +137,6 @@ T_JZsdkReturnCode Speex_Deinit() @@ -133,8 +137,6 @@ T_JZsdkReturnCode Speex_Deinit()
133 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 137 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
134 } 138 }
135 139
136 -// 初始化  
137 -// sample_rate: 采样率(如 16000)  
138 T_JZsdkReturnCode Speex_Init(int sample_rate) 140 T_JZsdkReturnCode Speex_Init(int sample_rate)
139 { 141 {
140 if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON) 142 if (g_SpeexInfo.Flag == JZ_FLAGCODE_ON)
@@ -153,7 +155,8 @@ T_JZsdkReturnCode Speex_Init(int sample_rate) @@ -153,7 +155,8 @@ T_JZsdkReturnCode Speex_Init(int sample_rate)
153 int hist_size = g_SpeexInfo.TailLen + g_SpeexInfo.PlaybackDelaySamples + frame_samples * 2; 155 int hist_size = g_SpeexInfo.TailLen + g_SpeexInfo.PlaybackDelaySamples + frame_samples * 2;
154 156
155 g_SpeexInfo.EchoState = speex_echo_state_init(frame_samples, g_SpeexInfo.TailLen); 157 g_SpeexInfo.EchoState = speex_echo_state_init(frame_samples, g_SpeexInfo.TailLen);
156 - if (!g_SpeexInfo.EchoState) { 158 + if (!g_SpeexInfo.EchoState)
  159 + {
157 JZSDK_LOG_DEBUG("Speex_Init: speex_echo_state_init failed\n"); 160 JZSDK_LOG_DEBUG("Speex_Init: speex_echo_state_init failed\n");
158 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 161 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
159 } 162 }
@@ -169,7 +172,8 @@ T_JZsdkReturnCode Speex_Init(int sample_rate) @@ -169,7 +172,8 @@ T_JZsdkReturnCode Speex_Init(int sample_rate)
169 172
170 speex_preprocess_ctl(g_SpeexInfo.PreprocessState, SPEEX_PREPROCESS_SET_ECHO_STATE, g_SpeexInfo.EchoState); 173 speex_preprocess_ctl(g_SpeexInfo.PreprocessState, SPEEX_PREPROCESS_SET_ECHO_STATE, g_SpeexInfo.EchoState);
171 174
172 - if (InitHistoryBuffer(hist_size) != 0) { 175 + if (InitHistoryBuffer(hist_size) != 0)
  176 + {
173 speex_echo_state_destroy(g_SpeexInfo.EchoState); 177 speex_echo_state_destroy(g_SpeexInfo.EchoState);
174 speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState); 178 speex_preprocess_state_destroy(g_SpeexInfo.PreprocessState);
175 JZSDK_LOG_DEBUG("Speex_Init: history buffer allocation failed\n"); 179 JZSDK_LOG_DEBUG("Speex_Init: history buffer allocation failed\n");
@@ -181,66 +185,66 @@ T_JZsdkReturnCode Speex_Init(int sample_rate) @@ -181,66 +185,66 @@ T_JZsdkReturnCode Speex_Init(int sample_rate)
181 sample_rate, frame_samples, g_SpeexInfo.TailLen, 185 sample_rate, frame_samples, g_SpeexInfo.TailLen,
182 g_SpeexInfo.PlaybackDelaySamples, hist_size); 186 g_SpeexInfo.PlaybackDelaySamples, hist_size);
183 187
184 -  
185 -  
186 -  
187 - /***********************************  
188 -  
189 - 降噪配置  
190 -  
191 -  
192 - *************************************/ 188 + // 独立降噪初始化
193 g_SpeexInfo.DenoiseOnlyState = speex_preprocess_state_init(FRAME_SAMPLES, sample_rate); 189 g_SpeexInfo.DenoiseOnlyState = speex_preprocess_state_init(FRAME_SAMPLES, sample_rate);
194 - if (!g_SpeexInfo.DenoiseOnlyState) { 190 + if (!g_SpeexInfo.DenoiseOnlyState)
  191 + {
195 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 192 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
196 } 193 }
197 194
198 - // 在 Speex_Init 中,创建 DenoiseOnlyState 后添加: 195 + //语音活动检测
199 int vad = 0; 196 int vad = 0;
200 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_VAD, &vad); 197 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_VAD, &vad);
  198 +
  199 + //自动增益
201 int agc = 0; 200 int agc = 0;
202 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_AGC, &agc); 201 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_AGC, &agc);
203 - int denoise = 1; // 保持开启 202 +
  203 + //启用降噪
  204 + int denoise = 1;
204 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_DENOISE, &denoise); 205 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_DENOISE, &denoise);
205 - // 可选:关闭降噪的自动增益补偿  
206 - int noise_suppress = 0; // 或者尝试 1,2... 206 +
  207 + int dereverb = 0; // 关闭去混响
  208 + speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_DEREVERB, &dereverb);
  209 +
  210 + /*
  211 + 设置噪声抑制最大衰减量 越低越激进,可以为负数 -40基本没有原噪音了,但是偶尔会有一点打印机一样的噪音
  212 + -15 没什么效果
  213 + -80 也是没有原噪音,但是引入的噪音没改善
  214 + -30 没什么效果
  215 + */
  216 + int noise_suppress = -40;
207 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &noise_suppress); 217 speex_preprocess_ctl(g_SpeexInfo.DenoiseOnlyState, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &noise_suppress);
208 218
209 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 219 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
210 } 220 }
211 221
212 -  
213 -// 独立降噪处理(char* 版本,原地处理) 222 +// 独立降噪处理
214 T_JZsdkReturnCode Speex_DenoiseOnly_Process(short* mic, short* out) 223 T_JZsdkReturnCode Speex_DenoiseOnly_Process(short* mic, short* out)
215 { 224 {
216 - if (!g_SpeexInfo.DenoiseOnlyState) 225 + if (!g_SpeexInfo.DenoiseOnlyState)
217 { 226 {
218 if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short)); 227 if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short));
219 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 228 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
220 } 229 }
221 230
222 if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short)); 231 if (out != mic) memcpy(out, mic, FRAME_SAMPLES * sizeof(short));
223 -  
224 speex_preprocess_run(g_SpeexInfo.DenoiseOnlyState, out); 232 speex_preprocess_run(g_SpeexInfo.DenoiseOnlyState, out);
225 -  
226 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 233 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
227 } 234 }
228 235
229 -// 处理麦克风数据(char* 版本)  
230 -// mic: 麦克风采集的原始 PCM 字节流(长度 = frame_samples * sizeof(short) = 640 字节)  
231 -// out: 处理后的干净 PCM 字节流(长度相同,可与 mic 共用内存)  
232 -// 注意:out 同时会被保存到历史缓冲区,作为下一帧的参考信号(播放数据) 236 +// 回声消除处理(使用历史输出作为参考信号)
233 T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out) 237 T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out)
234 { 238 {
235 - if (g_SpeexInfo.Flag == JZ_FLAGCODE_OFF) 239 + if (g_SpeexInfo.Flag == JZ_FLAGCODE_OFF)
236 { 240 {
237 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 241 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
238 } 242 }
239 243
240 - short ref_frame[FRAME_SAMPLES]; // 用于存放参考帧  
241 - if (ReadRefFrame(ref_frame) != 0) 244 + short ref_frame[FRAME_SAMPLES];
  245 + if (ReadRefFrame(ref_frame) != 0)
242 { 246 {
243 - // 历史数据不足,直接拷贝输出 247 + // 历史数据不足,直接拷贝输出并写入历史缓冲区
244 if (out != mic) memcpy(out, mic, g_SpeexInfo.FrameSize * sizeof(short)); 248 if (out != mic) memcpy(out, mic, g_SpeexInfo.FrameSize * sizeof(short));
245 WriteHistoryFrame(out); 249 WriteHistoryFrame(out);
246 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 250 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -249,11 +253,11 @@ T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out) @@ -249,11 +253,11 @@ T_JZsdkReturnCode Speex_ProcessMic(short* mic, short* out)
249 // 执行回声消除 253 // 执行回声消除
250 speex_echo_cancellation(g_SpeexInfo.EchoState, mic, ref_frame, out); 254 speex_echo_cancellation(g_SpeexInfo.EchoState, mic, ref_frame, out);
251 255
252 - // 执行后处理(噪声抑制等)  
253 - speex_preprocess_run(g_SpeexInfo.PreprocessState, out); 256 + // 后处理降噪
  257 + speex_preprocess_run(g_SpeexInfo.DenoiseOnlyState, out);
254 258
255 - // 将处理后的帧写入历史缓冲区(因为它即将被播放)  
256 - WriteHistoryFrame(out); 259 + // 将输出帧写入历史缓冲区(供后续帧作为参考)
  260 + //WriteHistoryFrame(out);
257 261
258 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 262 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
259 } 263 }
@@ -308,10 +308,15 @@ static void *DecodeAudioData_task(void *arg) @@ -308,10 +308,15 @@ static void *DecodeAudioData_task(void *arg)
308 308
309 DecodeFinsh: 309 DecodeFinsh:
310 USER_LOG_INFO("Decode Finished..."); 310 USER_LOG_INFO("Decode Finished...");
  311 + JZSDK_LOG_INFO("Decode Finished...");
311 s_isDecodeFinished = true; 312 s_isDecodeFinished = true;
312 313
313 //录音喊话解锁 314 //录音喊话解锁
314 SpeakerWidgetUseLock = JZ_FLAGCODE_OFF; 315 SpeakerWidgetUseLock = JZ_FLAGCODE_OFF;
  316 +
  317 + //新加入
  318 + StartPlay();
  319 +
315 #endif 320 #endif
316 } 321 }
317 322
@@ -320,7 +325,9 @@ DecodeFinsh: @@ -320,7 +325,9 @@ DecodeFinsh:
320 325
321 static T_DjiReturnCode DjiTest_PlayAudioData(void) 326 static T_DjiReturnCode DjiTest_PlayAudioData(void)
322 { 327 {
323 - JZSDK_LOG_INFO("播放固定位置的录音DjiTest_PlayAudioData "); 328 + USER_LOG_INFO("播放固定位置的录音DjiTest_PlayAudioData ");
  329 + JZSDK_LOG_INFO("播放固定位置的录音DjiTest_PlayAudioData ");
  330 +
324 #ifdef MEGAPHONE_CONFIG_STATUS_ON 331 #ifdef MEGAPHONE_CONFIG_STATUS_ON
325 do 332 do
326 { 333 {
@@ -467,7 +474,9 @@ static void SetSpeakerState(E_DjiWidgetSpeakerState speakerState) @@ -467,7 +474,9 @@ static void SetSpeakerState(E_DjiWidgetSpeakerState speakerState)
467 if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { 474 if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
468 USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode); 475 USER_LOG_ERROR("lock mutex error: 0x%08llX.", returnCode);
469 } 476 }
  477 +
470 USER_LOG_INFO("s_speakerState.state = %x", speakerState); 478 USER_LOG_INFO("s_speakerState.state = %x", speakerState);
  479 + JZSDK_LOG_INFO("s_speakerState.state = %x", speakerState);
471 s_speakerState.state = speakerState; 480 s_speakerState.state = speakerState;
472 481
473 returnCode = osalHandler->MutexUnlock(s_speakerMutex); 482 returnCode = osalHandler->MutexUnlock(s_speakerMutex);
@@ -572,16 +581,17 @@ static T_DjiReturnCode StartPlay(void) @@ -572,16 +581,17 @@ static T_DjiReturnCode StartPlay(void)
572 return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 581 return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
573 } 582 }
574 583
575 - //检查当前是否正在播放中  
576 - if (s_speakerState.state == DJI_WIDGET_SPEAKER_STATE_PLAYING)  
577 - {  
578 - //关闭上次播放  
579 - StopPlay(); 584 + ////检查当前是否正在播放中
  585 + //if (s_speakerState.state == DJI_WIDGET_SPEAKER_STATE_PLAYING)
  586 + //{
  587 + // //关闭上次播放
  588 + // StopPlay();
580 589
581 - delayMs(100);  
582 - } 590 + // delayMs(100);
  591 + //}
583 592
584 USER_LOG_INFO("Start widget speaker play"); 593 USER_LOG_INFO("Start widget speaker play");
  594 + JZSDK_LOG_INFO("Start widget speaker play");
585 SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_PLAYING); 595 SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_PLAYING);
586 596
587 //播放 597 //播放
@@ -717,6 +727,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -717,6 +727,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
717 { 727 {
718 s_isDecodeFinished = false; 728 s_isDecodeFinished = false;
719 USER_LOG_INFO("Create voice file."); 729 USER_LOG_INFO("Create voice file.");
  730 + JZSDK_LOG_INFO("开始录音喊话");
720 731
721 //a、创建一个保存录音数据的文件 732 //a、创建一个保存录音数据的文件
722 s_audioFile = fopen(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, "wb"); 733 s_audioFile = fopen(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, "wb");
@@ -738,6 +749,8 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -738,6 +749,8 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
738 749
739 //e、上锁 750 //e、上锁
740 SpeakerWidgetUseLock = JZ_FLAGCODE_ON; 751 SpeakerWidgetUseLock = JZ_FLAGCODE_ON;
  752 +
  753 +
741 } 754 }
742 //2、传输中 755 //2、传输中
743 else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT) 756 else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT)
@@ -762,6 +775,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -762,6 +775,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
762 else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_FINISH) 775 else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_FINISH)
763 { 776 {
764 USER_LOG_INFO("Close voice file."); 777 USER_LOG_INFO("Close voice file.");
  778 + JZSDK_LOG_INFO("结束录音喊话");
765 if (s_audioFile != NULL) { 779 if (s_audioFile != NULL) {
766 fclose(s_audioFile); 780 fclose(s_audioFile);
767 } 781 }
@@ -770,6 +784,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -770,6 +784,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
770 returnCode = DjiTest_CheckFileMd5Sum(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, buf, size); 784 returnCode = DjiTest_CheckFileMd5Sum(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, buf, size);
771 if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { 785 if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
772 USER_LOG_ERROR("File md5 sum check failed"); 786 USER_LOG_ERROR("File md5 sum check failed");
  787 + JZSDK_LOG_ERROR("File md5 sum check failed");
773 return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR; 788 return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
774 } 789 }
775 790
@@ -782,11 +797,12 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -782,11 +797,12 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
782 int task_ret = pthread_create(&V_DecodeAudioData_task,&task_attribute,DecodeAudioData_task,NULL); //TTS线程 797 int task_ret = pthread_create(&V_DecodeAudioData_task,&task_attribute,DecodeAudioData_task,NULL); //TTS线程
783 if(task_ret != 0) 798 if(task_ret != 0)
784 { 799 {
785 - printf("创建DecodeAudioData_task线程失败!\n"); 800 + JZSDK_LOG_ERROR("创建DecodeAudioData_task线程失败!");
786 //录音喊话解锁 801 //录音喊话解锁
787 SpeakerWidgetUseLock = JZ_FLAGCODE_OFF; 802 SpeakerWidgetUseLock = JZ_FLAGCODE_OFF;
788 //pthread_exit(NULL); 803 //pthread_exit(NULL);
789 } 804 }
  805 +
790 } 806 }
791 } 807 }
792 808
@@ -817,6 +833,14 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -817,6 +833,14 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
817 833
818 //e、上锁 834 //e、上锁
819 SpeakerWidgetUseLock = JZ_FLAGCODE_ON; 835 SpeakerWidgetUseLock = JZ_FLAGCODE_ON;
  836 +
  837 + JZSDK_LOG_INFO("开始实时喊话");
  838 +
  839 + //Temp、创建一个保存录音数据的文件
  840 + s_audioFile = fopen(WIDGET_SPEAKER_AUDIO_OPUS_FILE_NAME, "wb");
  841 + if (s_audioFile == NULL) {
  842 + USER_LOG_ERROR("Create tts file error.");
  843 + }
820 } 844 }
821 //2、传输过程 845 //2、传输过程
822 else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT) 846 else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT)
@@ -831,6 +855,15 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -831,6 +855,15 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
831 { 855 {
832 SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_TRANSMITTING); 856 SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_TRANSMITTING);
833 } 857 }
  858 +
  859 + //Temp如果创建的保存文件不为空
  860 + if (s_audioFile != NULL) {
  861 + fseek(s_audioFile, offset, SEEK_SET); //重设光标位,并写入语音数据
  862 + writeLen = fwrite(buf, 1, size, s_audioFile);
  863 + if (writeLen != size) {
  864 + USER_LOG_ERROR("Write tts file error %d", writeLen);
  865 + }
  866 + }
834 } 867 }
835 //3、传输结束 868 //3、传输结束
836 else if(event == DJI_WIDGET_TRANSMIT_DATA_EVENT_FINISH) 869 else if(event == DJI_WIDGET_TRANSMIT_DATA_EVENT_FINISH)
@@ -844,6 +877,13 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event, @@ -844,6 +877,13 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
844 877
845 //解锁 878 //解锁
846 SpeakerWidgetUseLock = JZ_FLAGCODE_OFF; 879 SpeakerWidgetUseLock = JZ_FLAGCODE_OFF;
  880 +
  881 + JZSDK_LOG_INFO("结束实时喊话");
  882 +
  883 + //Temp结束
  884 + if (s_audioFile != NULL) {
  885 + fclose(s_audioFile);
  886 + }
847 } 887 }
848 } 888 }
849 889
@@ -926,7 +966,7 @@ T_JZsdkReturnCode Speaker_Set_SpeakerState_state(int value) @@ -926,7 +966,7 @@ T_JZsdkReturnCode Speaker_Set_SpeakerState_state(int value)
926 s_speakerState.state = value; 966 s_speakerState.state = value;
927 } 967 }
928 968
929 -//循环模式90 969 +//循环模式
930 T_JZsdkReturnCode Speaker_Set_SpeakerPlaymode(int value) 970 T_JZsdkReturnCode Speaker_Set_SpeakerPlaymode(int value)
931 { 971 {
932 s_speakerState.playMode = value; 972 s_speakerState.playMode = value;