作者 ookk303

修改

1 # 编译链的配置 1 # 编译链的配置
2 2
3 #1、编译链与设备类型的选择 3 #1、编译链与设备类型的选择
4 -set(DEVICE_NAME JZ_C1) 4 +set(DEVICE_NAME JZ_H1T)
5 #上一行为禁止修改行 5 #上一行为禁止修改行
6 6
7 if("${DEVICE_NAME}" STREQUAL "JZ_H1E") 7 if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
@@ -75,7 +75,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode) @@ -75,7 +75,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
75 if (*mode == JZ_FLAGCODE_ON) 75 if (*mode == JZ_FLAGCODE_ON)
76 { 76 {
77 //先关闭播放 77 //先关闭播放
78 - Megaphone_StopPlay(JZ_FLAGCODE_OFF); 78 + //Megaphone_StopPlay(JZ_FLAGCODE_OFF);
79 79
80 //修改滤波 80 //修改滤波
81 AudioDeal_SetFilterMode(0x01); 81 AudioDeal_SetFilterMode(0x01);
@@ -83,7 +83,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode) @@ -83,7 +83,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
83 else 83 else
84 { 84 {
85 //先关闭播放 85 //先关闭播放
86 - Megaphone_StopPlay(JZ_FLAGCODE_OFF); 86 + //Megaphone_StopPlay(JZ_FLAGCODE_OFF);
87 87
88 //修改滤波 88 //修改滤波
89 AudioDeal_SetFilterMode(0x00); 89 AudioDeal_SetFilterMode(0x00);
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 #define VERSION_CHOOSE_H 7 #define VERSION_CHOOSE_H
8 #include "./ConfigParams.h" 8 #include "./ConfigParams.h"
9 //1~10行 除了D可以修改版本选择 禁止动任何东西 9 //1~10行 除了D可以修改版本选择 禁止动任何东西
10 -#define DEVICE_VERSION JZ_C1 10 +#define DEVICE_VERSION JZ_H1T
11 11
12 //禁止修改行 选择是串口程序 还是 psdk程序 12 //禁止修改行 选择是串口程序 还是 psdk程序
13 #define APP_VERSION APP_PSDK 13 #define APP_VERSION APP_PSDK
@@ -19,13 +19,13 @@ @@ -19,13 +19,13 @@
19 #define MAJOR_VERSION 0x01 19 #define MAJOR_VERSION 0x01
20 #define MINOR_VERSION 0x03 20 #define MINOR_VERSION 0x03
21 #define MODIFY_VERSION 0x09 21 #define MODIFY_VERSION 0x09
22 -#define DEBUG_VERSION 0x02 22 +#define DEBUG_VERSION 0x01
23 23
24 //禁止修改行 滤波方式 24 //禁止修改行 滤波方式
25 #define FILTERING_TYPE HIGH_PASS_FILTERING 25 #define FILTERING_TYPE HIGH_PASS_FILTERING
26 26
27 //禁止修改行固件属地 目前 国内版/海外版 27 //禁止修改行固件属地 目前 国内版/海外版
28 -#define FIRMWARE_ORIGIN OVERSEAS_VERSION 28 +#define FIRMWARE_ORIGIN DOMESTIC_VERSION
29 29
30 //禁止修改行指定特殊固件 30 //禁止修改行指定特殊固件
31 #define SPECIAL_VERSION SPECIAL_NORMAL 31 #define SPECIAL_VERSION SPECIAL_NORMAL
@@ -58,8 +58,10 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam @@ -58,8 +58,10 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam
58 } 58 }
59 59
60 //重采样 //仅处理一半样本量 60 //重采样 //仅处理一半样本量
61 - //void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen/2, &out_nb_samples);  
62 - void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen, &out_nb_samples); 61 + void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen/2, &out_nb_samples);
  62 + //void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen, &out_nb_samples);
  63 +
  64 + //JZSDK_LOG_INFO("播放 %d 数据",out_nb_samples
63 65
64 //如果滤波打开 66 //如果滤波打开
65 //滤波处理 67 //滤波处理
  1 +#include <stdio.h>
  2 +#include <stdlib.h>
  3 +#include <stdint.h>
  4 +#include <string.h>
  5 +
  6 +#include "JZsdkLib.h"
  7 +
  8 +T_JZsdkReturnCode PcmNoiseReduction(unsigned char *data, int len, int threshold)
  9 +{
  10 + for (int i = 0; i < len; i++)
  11 + {
  12 + if (abs(data) >= 0xFF)
  13 + {
  14 + data[i] = 0;
  15 + }
  16 + }
  17 +
  18 +
  19 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  20 +}
@@ -152,8 +152,6 @@ void *FF_Resample_Send_And_Get_ResampleData(struct AudioDealInfo *AD_Info, unsig @@ -152,8 +152,6 @@ void *FF_Resample_Send_And_Get_ResampleData(struct AudioDealInfo *AD_Info, unsig
152 return NULL; 152 return NULL;
153 } 153 }
154 154
155 - JZSDK_LOG_INFO("原长度 *out_nb_samples:%d",*out_nb_samples);  
156 -  
157 //重采样 155 //重采样
158 ret = swr_convert(ResampleInfo->m_swr, &dst, *out_nb_samples, (const uint8_t**)src, nb_samples); 156 ret = swr_convert(ResampleInfo->m_swr, &dst, *out_nb_samples, (const uint8_t**)src, nb_samples);
159 if (ret < 0) { 157 if (ret < 0) {
@@ -162,8 +160,6 @@ void *FF_Resample_Send_And_Get_ResampleData(struct AudioDealInfo *AD_Info, unsig @@ -162,8 +160,6 @@ void *FF_Resample_Send_And_Get_ResampleData(struct AudioDealInfo *AD_Info, unsig
162 return NULL; 160 return NULL;
163 } 161 }
164 162
165 - JZSDK_LOG_INFO("重采样后长度:%d", ret);  
166 -  
167 *out_nb_samples = ret; 163 *out_nb_samples = ret;
168 164
169 return (void*)dst; 165 return (void*)dst;
@@ -159,7 +159,7 @@ T_JZsdkReturnCode IRC_SPC_ParamCorrect(struct IRC_param *dealInfo, U16_t *MarkDa @@ -159,7 +159,7 @@ T_JZsdkReturnCode IRC_SPC_ParamCorrect(struct IRC_param *dealInfo, U16_t *MarkDa
159 } 159 }
160 } 160 }
161 161
162 - JZSDK_LOG_INFO("重新计算IPC参数 Avg%f",Avg); 162 + //JZSDK_LOG_INFO("重新计算IPC参数 Avg%f",Avg);
163 } 163 }
164 164
165 165
@@ -260,10 +260,10 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -260,10 +260,10 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
260 //修复上边 260 //修复上边
261 for (x = 2; x <= dealInfo->Width - 2; x++) 261 for (x = 2; x <= dealInfo->Width - 2; x++)
262 { 262 {
263 - int SourceIndex = Get_2DImage_PointToArray(x, 3, dealInfo->Width, dealInfo->Height); 263 + int SourceIndex = Get_2DImage_PointToArray(x, 3, dealInfo->Width, dealInfo->Height) * 3;
264 264
265 - int FirstIndex = Get_2DImage_PointToArray(x, 0, dealInfo->Width, dealInfo->Height);  
266 - int SecondIndex = Get_2DImage_PointToArray(x, 1, dealInfo->Width, dealInfo->Height); 265 + int FirstIndex = Get_2DImage_PointToArray(x, 0, dealInfo->Width, dealInfo->Height) * 3;
  266 + int SecondIndex = Get_2DImage_PointToArray(x, 1, dealInfo->Width, dealInfo->Height) * 3;
267 267
268 rgb_data[FirstIndex] = rgb_data[SourceIndex]; 268 rgb_data[FirstIndex] = rgb_data[SourceIndex];
269 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1]; 269 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
@@ -277,10 +277,10 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -277,10 +277,10 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
277 //修复下边 277 //修复下边
278 for (x = 2; x <= dealInfo->Width - 2; x++) 278 for (x = 2; x <= dealInfo->Width - 2; x++)
279 { 279 {
280 - int SourceIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 3, dealInfo->Width, dealInfo->Height); 280 + int SourceIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 3, dealInfo->Width, dealInfo->Height) * 3;
281 281
282 - int FirstIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 1, dealInfo->Width, dealInfo->Height);  
283 - int SecondIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 2, dealInfo->Width, dealInfo->Height); 282 + int FirstIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 1, dealInfo->Width, dealInfo->Height) * 3;
  283 + int SecondIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 2, dealInfo->Width, dealInfo->Height) * 3;
284 284
285 rgb_data[FirstIndex] = rgb_data[SourceIndex]; 285 rgb_data[FirstIndex] = rgb_data[SourceIndex];
286 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1]; 286 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
@@ -292,12 +292,13 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -292,12 +292,13 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
292 } 292 }
293 293
294 //修复左边 294 //修复左边
295 - for (int y = 0; y <= dealInfo->Height; y++) 295 + for (int y = 0; y < dealInfo->Height; y++)
296 { 296 {
297 - int SourceIndex = Get_2DImage_PointToArray(2, y, dealInfo->Width, dealInfo->Height); 297 + int SourceIndex = Get_2DImage_PointToArray(3, y, dealInfo->Width, dealInfo->Height) * 3;
298 298
299 - int FirstIndex = Get_2DImage_PointToArray(0, y, dealInfo->Width, dealInfo->Height);  
300 - int SecondIndex = Get_2DImage_PointToArray(1, y, dealInfo->Width, dealInfo->Height); 299 + int FirstIndex = Get_2DImage_PointToArray(0, y, dealInfo->Width, dealInfo->Height) * 3;
  300 + int SecondIndex = Get_2DImage_PointToArray(1, y, dealInfo->Width, dealInfo->Height) * 3;
  301 + int ThirdIndex = Get_2DImage_PointToArray(2, y, dealInfo->Width, dealInfo->Height) * 3;
301 302
302 rgb_data[FirstIndex] = rgb_data[SourceIndex]; 303 rgb_data[FirstIndex] = rgb_data[SourceIndex];
303 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1]; 304 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
@@ -306,14 +307,24 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -306,14 +307,24 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
306 rgb_data[SecondIndex] = rgb_data[SourceIndex]; 307 rgb_data[SecondIndex] = rgb_data[SourceIndex];
307 rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1]; 308 rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
308 rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2]; 309 rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
  310 +
  311 + rgb_data[ThirdIndex] = rgb_data[SourceIndex];
  312 + rgb_data[ThirdIndex + 1] = rgb_data[SourceIndex + 1];
  313 + rgb_data[ThirdIndex + 2] = rgb_data[SourceIndex + 2];
309 } 314 }
310 315
311 - //修复右边  
312 - for (int y = 0; y <= dealInfo->Height; y++) 316 + // 修复右边
  317 + for (int y = 0; y < dealInfo->Height; y++)
313 { 318 {
314 - int SourceIndex = Get_2DImage_PointToArray(dealInfo->Width - 3, y, dealInfo->Width, dealInfo->Height);  
315 - int FirstIndex = Get_2DImage_PointToArray(dealInfo->Width - 1, y, dealInfo->Width, dealInfo->Height);  
316 - int SecondIndex = Get_2DImage_PointToArray(dealInfo->Width - 2, y, dealInfo->Width, dealInfo->Height); 319 + int SourceIndex = Get_2DImage_PointToArray(dealInfo->Width - 7, y, dealInfo->Width, dealInfo->Height) * 3;
  320 +
  321 + int FirstIndex = Get_2DImage_PointToArray(dealInfo->Width - 1, y, dealInfo->Width, dealInfo->Height) * 3;
  322 + int SecondIndex = Get_2DImage_PointToArray(dealInfo->Width - 2, y, dealInfo->Width, dealInfo->Height) * 3;
  323 + int ThirdIndex = Get_2DImage_PointToArray(dealInfo->Width - 3, y, dealInfo->Width, dealInfo->Height) * 3;
  324 + int FourthIndex = Get_2DImage_PointToArray(dealInfo->Width - 4, y, dealInfo->Width, dealInfo->Height) * 3;
  325 + int FifthIndex = Get_2DImage_PointToArray(dealInfo->Width - 5, y, dealInfo->Width, dealInfo->Height) * 3;
  326 + int SixthIndex = Get_2DImage_PointToArray(dealInfo->Width - 6, y, dealInfo->Width, dealInfo->Height) * 3;
  327 + int SeventhIndex = Get_2DImage_PointToArray(dealInfo->Width - 7, y, dealInfo->Width, dealInfo->Height) * 3;
317 328
318 rgb_data[FirstIndex] = rgb_data[SourceIndex]; 329 rgb_data[FirstIndex] = rgb_data[SourceIndex];
319 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1]; 330 rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
@@ -322,44 +333,66 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -322,44 +333,66 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
322 rgb_data[SecondIndex] = rgb_data[SourceIndex]; 333 rgb_data[SecondIndex] = rgb_data[SourceIndex];
323 rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1]; 334 rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
324 rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2]; 335 rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
325 - }  
326 - }  
327 -  
328 336
329 - // 在rgb图上画图形 337 + rgb_data[ThirdIndex] = rgb_data[SourceIndex];
  338 + rgb_data[ThirdIndex + 1] = rgb_data[SourceIndex + 1];
  339 + rgb_data[ThirdIndex + 2] = rgb_data[SourceIndex + 2];
330 340
331 - //不画  
332 - if (dealInfo->RegionMode == 0)  
333 - {  
334 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
335 - } 341 + rgb_data[FourthIndex] = rgb_data[SourceIndex];
  342 + rgb_data[FourthIndex + 1] = rgb_data[SourceIndex + 1];
  343 + rgb_data[FourthIndex + 2] = rgb_data[SourceIndex + 2];
336 344
337 - //画十字  
338 - if (dealInfo->RegionMode == 1)  
339 - {  
340 - Stream_rgb888_WriteCross(rgb_data,  
341 - dealInfo->Width, dealInfo->Height,  
342 - dealInfo->RegionBox[0],  
343 - dealInfo->RegionBox[1],  
344 - 255, 215, 0, 20, 20); 345 + rgb_data[FifthIndex] = rgb_data[SourceIndex];
  346 + rgb_data[FifthIndex + 1] = rgb_data[SourceIndex + 1];
  347 + rgb_data[FifthIndex + 2] = rgb_data[SourceIndex + 2];
345 348
346 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
347 - }  
348 -  
349 - //画十字  
350 - if (dealInfo->RegionMode == 2)  
351 - {  
352 - Stream_rgb888_WriteRectangle(rgb_data,  
353 - dealInfo->Width, dealInfo->Height,  
354 - dealInfo->RegionBox[0],  
355 - dealInfo->RegionBox[1],  
356 - dealInfo->RegionBox[2],  
357 - dealInfo->RegionBox[3],  
358 - 255, 215, 0, 1); 349 + rgb_data[SixthIndex] = rgb_data[SourceIndex];
  350 + rgb_data[SixthIndex + 1] = rgb_data[SourceIndex + 1];
  351 + rgb_data[SixthIndex + 2] = rgb_data[SourceIndex + 2];
  352 +
  353 + rgb_data[SeventhIndex] = rgb_data[SourceIndex];
  354 + rgb_data[SeventhIndex + 1] = rgb_data[SourceIndex + 1];
  355 + rgb_data[SeventhIndex + 2] = rgb_data[SourceIndex + 2];
  356 + }
359 357
360 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
361 } 358 }
362 359
  360 +
  361 +
  362 + // 在rgb图上画图形
  363 +
  364 + // //不画
  365 + // if (dealInfo->RegionMode == 0)
  366 + // {
  367 + // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  368 + // }
  369 +
  370 + // //画十字
  371 + // if (dealInfo->RegionMode == 1)
  372 + // {
  373 + // Stream_rgb888_WriteCross(rgb_data,
  374 + // dealInfo->Width, dealInfo->Height,
  375 + // dealInfo->RegionBox[0],
  376 + // dealInfo->RegionBox[1],
  377 + // 255, 215, 0, 20, 20);
  378 +
  379 + // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  380 + // }
  381 +
  382 + // //画十字
  383 + // if (dealInfo->RegionMode == 2)
  384 + // {
  385 + // Stream_rgb888_WriteRectangle(rgb_data,
  386 + // dealInfo->Width, dealInfo->Height,
  387 + // dealInfo->RegionBox[0],
  388 + // dealInfo->RegionBox[1],
  389 + // dealInfo->RegionBox[2],
  390 + // dealInfo->RegionBox[3],
  391 + // 255, 215, 0, 1);
  392 +
  393 + // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  394 + // }
  395 +
363 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 396 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
364 } 397 }
365 398
@@ -419,10 +419,14 @@ static T_JZsdkReturnCode Opus_Decode() @@ -419,10 +419,14 @@ static T_JZsdkReturnCode Opus_Decode()
419 //解码完成 419 //解码完成
420 printf("decode data to file: %d\r\n", frame_size * OPUS_CHANNELS); 420 printf("decode data to file: %d\r\n", frame_size * OPUS_CHANNELS);
421 /* Convert to little-endian ordering. */ 421 /* Convert to little-endian ordering. */
422 - for (i = 0; i < OPUS_CHANNELS * frame_size; i++) { 422 + for (i = 0; i < OPUS_CHANNELS * frame_size; i++)
  423 + {
423 pcm_bytes[2 * i] = out[i] & 0xFF; 424 pcm_bytes[2 * i] = out[i] & 0xFF;
424 pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF; 425 pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF;
425 } 426 }
  427 +
  428 + //PcmNoiseReduction(pcm_bytes, frame_size*2 , 1) ;
  429 +
426 430
427 //保存解码内容 431 //保存解码内容
428 fwrite(pcm_bytes, sizeof(short), frame_size * OPUS_CHANNELS, fout); 432 fwrite(pcm_bytes, sizeof(short), frame_size * OPUS_CHANNELS, fout);
@@ -284,9 +284,20 @@ static void *DecodeAudioData_task(void *arg) @@ -284,9 +284,20 @@ static void *DecodeAudioData_task(void *arg)
284 USER_LOG_INFO("decode data to file: %d\r\n", frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS); 284 USER_LOG_INFO("decode data to file: %d\r\n", frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS);
285 /* Convert to little-endian ordering. */ 285 /* Convert to little-endian ordering. */
286 for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) { 286 for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) {
  287 +
  288 +
  289 +
  290 + if (out[i] == 0xFFFF)
  291 + {
  292 + pcm_bytes[2 * i] = 0x00;
  293 + pcm_bytes[2 * i + 1] = 0x00;
  294 + continue;
  295 + }
  296 +
287 pcm_bytes[2 * i] = out[i] & 0xFF; 297 pcm_bytes[2 * i] = out[i] & 0xFF;
288 pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF; 298 pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF;
289 } 299 }
  300 +
290 /* Write the decoded audio to file. */ 301 /* Write the decoded audio to file. */
291 fwrite(pcm_bytes, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout); 302 fwrite(pcm_bytes, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout);
292 } 303 }
1 # cmake 最低版本要求 第三行名字不能动 1 # cmake 最低版本要求 第三行名字不能动
2 cmake_minimum_required(VERSION 2.8) 2 cmake_minimum_required(VERSION 2.8)
3 -project(JZ_C1) 3 +project(JZ_H1T)
4 4
5 set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++") 5 set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。 6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。