作者 ookk303

将opus列表改成了pcm列表

@@ -109,7 +109,9 @@ @@ -109,7 +109,9 @@
109 "jzsdk_errorcodedef.h": "c", 109 "jzsdk_errorcodedef.h": "c",
110 "jzsdk_timer.h": "c", 110 "jzsdk_timer.h": "c",
111 "jzsdk_framecomparsion_6aframe.h": "c", 111 "jzsdk_framecomparsion_6aframe.h": "c",
112 - "jzsdk_uart.h": "c" 112 + "jzsdk_uart.h": "c",
  113 + "audiomange.h": "c",
  114 + "pcmaudiofile.h": "c"
113 }, 115 },
114 "Codegeex.GenerationPreference": "automatic", 116 "Codegeex.GenerationPreference": "automatic",
115 "C_Cpp.dimInactiveRegions": false 117 "C_Cpp.dimInactiveRegions": false
@@ -122,7 +122,10 @@ typedef enum { @@ -122,7 +122,10 @@ typedef enum {
122 122
123 JZ_INSCODE_5AFRAME_OPUS_PLAY = 0x10000910, //opus播放 123 JZ_INSCODE_5AFRAME_OPUS_PLAY = 0x10000910, //opus播放
124 124
125 - JZ_INSCODE_5AFRAME_OPUS_GETOPUSLIST = 0x10000911, //获取opus列表 125 + JZ_INSCODE_5AFRAME_PCM_PLAY = 0x10000920, //pcm播放
  126 +
  127 + JZ_INSCODE_5AFRAME_PCM_GETPCMLIST = 0x10000930, //获pcm列表
  128 +
126 129
127 JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_START = 0x10000A00, //开启opus实时语音 130 JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_START = 0x10000A00, //开启opus实时语音
128 JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_UNLIMIT_TRANSMISSION = 0x10000A01, //无限制传输opus实时语音 131 JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_UNLIMIT_TRANSMISSION = 0x10000A01, //无限制传输opus实时语音
@@ -333,9 +333,9 @@ static int Comparison_5AFRAME_FirstLevelCode_0x58(char *getdata) @@ -333,9 +333,9 @@ static int Comparison_5AFRAME_FirstLevelCode_0x58(char *getdata)
333 return JZ_INSCODE_5AFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE; 333 return JZ_INSCODE_5AFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE;
334 break; 334 break;
335 335
336 - //获取opus列表 336 + //获取pcm列表
337 case 0x10: 337 case 0x10:
338 - return JZ_INSCODE_5AFRAME_OPUS_GETOPUSLIST; 338 + return JZ_INSCODE_5AFRAME_PCM_GETPCMLIST;
339 break; 339 break;
340 340
341 default: 341 default:
@@ -348,6 +348,10 @@ static int Comparison_5AFRAME_FirstLevelCode_0x59(char *getdata) @@ -348,6 +348,10 @@ static int Comparison_5AFRAME_FirstLevelCode_0x59(char *getdata)
348 //二级功能位 348 //二级功能位
349 switch (getdata[8]) 349 switch (getdata[8])
350 { 350 {
  351 + case 0x10:
  352 + return JZ_INSCODE_5AFRAME_OPUS_PLAY;
  353 + break;
  354 +
351 //opus录音传输 355 //opus录音传输
352 //opus传输开始 356 //opus传输开始
353 case 0xF1: 357 case 0xF1:
@@ -24,6 +24,8 @@ @@ -24,6 +24,8 @@
24 #include "Megaphone/Megaphone.h" 24 #include "Megaphone/Megaphone.h"
25 #include "Megaphone/Music/AudioFile/Megaphone_AudioFile.h" 25 #include "Megaphone/Music/AudioFile/Megaphone_AudioFile.h"
26 #include "Megaphone/Opus/Megaphone_Opus.h" 26 #include "Megaphone/Opus/Megaphone_Opus.h"
  27 + #include "Megaphone/PcmAudio/PcmAudioFile.h"
  28 +
27 #endif 29 #endif
28 30
29 static int HalRecvMode = JZ_FLAGCODE_OFF; //接收模式,主要是为了限制不同设备同时要求hal层做出 同一个数据接收相关功能 ,目前做法是只限定一个hal设备使用一种数据接收模式 31 static int HalRecvMode = JZ_FLAGCODE_OFF; //接收模式,主要是为了限制不同设备同时要求hal层做出 同一个数据接收相关功能 ,目前做法是只限定一个hal设备使用一种数据接收模式
@@ -705,15 +707,24 @@ static T_JZsdkReturnCode RecvDeal_audio_PlayFile(int Port, char *getbuf) @@ -705,15 +707,24 @@ static T_JZsdkReturnCode RecvDeal_audio_PlayFile(int Port, char *getbuf)
705 **********/ 707 **********/
706 static T_JZsdkReturnCode RecvDeal_audio_PlayContinue(int Port, char *getbuf) 708 static T_JZsdkReturnCode RecvDeal_audio_PlayContinue(int Port, char *getbuf)
707 { 709 {
  710 + T_JZsdkReturnCode ret;
  711 +
708 JZSDK_LOG_INFO("%s,音频继续播放",JZsdk_DefineCode_GetPortName(Port)); 712 JZSDK_LOG_INFO("%s,音频继续播放",JZsdk_DefineCode_GetPortName(Port));
709 713
710 //获取帧的序列号 714 //获取帧的序列号
711 int FrameSequence = JZsdk_Get_FrameSequence(getbuf); 715 int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
712 716
713 - UIcontrol_ContinuePlayAudio(Port);  
714 -  
715 - //回复操作成功  
716 - HalSend_type1Send_Reply_Success(Port, FrameSequence); 717 + ret = UIcontrol_ContinuePlayAudio(Port);
  718 + if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  719 + {
  720 + //回复操作成功
  721 + HalSend_type1Send_Reply_Success(Port, FrameSequence);
  722 + }
  723 + else
  724 + {
  725 + //回复操作失败
  726 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  727 + }
717 728
718 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 729 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
719 } 730 }
@@ -1581,13 +1592,13 @@ static T_JZsdkReturnCode RecvDeal_Delete_Audio(int Port, char *getbuf) @@ -1581,13 +1592,13 @@ static T_JZsdkReturnCode RecvDeal_Delete_Audio(int Port, char *getbuf)
1581 1592
1582 /********* 1593 /*********
1583 * 1594 *
1584 - * 删除录音 1595 + * 删除pcm文件
1585 * 1596 *
1586 * 1597 *
1587 **********/ 1598 **********/
1588 static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf) 1599 static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf)
1589 { 1600 {
1590 - JZSDK_LOG_INFO("%s,删除opus录音操作",JZsdk_DefineCode_GetPortName(Port)); 1601 + JZSDK_LOG_INFO("%s,删除pcm文件操作",JZsdk_DefineCode_GetPortName(Port));
1591 1602
1592 //获取帧的序列号 1603 //获取帧的序列号
1593 int FrameSequence = JZsdk_Get_FrameSequence(getbuf); 1604 int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
@@ -1603,7 +1614,7 @@ static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf) @@ -1603,7 +1614,7 @@ static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf)
1603 1614
1604 //3、拼接指令 1615 //3、拼接指令
1605 char FilePath[512]; 1616 char FilePath[512];
1606 - snprintf(FilePath, 512 ,"/root/sdcard/opus/%s", FileName); 1617 + snprintf(FilePath, 512 ,"/root/sdcard/pcm/%s", FileName);
1607 1618
1608 //4、删除文件 1619 //4、删除文件
1609 JZsdk_Osal_delete(FilePath); 1620 JZsdk_Osal_delete(FilePath);
@@ -1612,7 +1623,7 @@ static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf) @@ -1612,7 +1623,7 @@ static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf)
1612 1623
1613 //4、刷新歌曲列表 1624 //4、刷新歌曲列表
1614 #ifdef MEGAPHONE_CONFIG_STATUS_ON 1625 #ifdef MEGAPHONE_CONFIG_STATUS_ON
1615 - OpusFile_FlushList(); 1626 + PcmFile_FlushList();
1616 #endif 1627 #endif
1617 1628
1618 //回复操作成功 1629 //回复操作成功
@@ -1722,10 +1733,10 @@ static T_JZsdkReturnCode RecvDeal_Rename_VoiceRecord(int Port, char *getbuf) @@ -1722,10 +1733,10 @@ static T_JZsdkReturnCode RecvDeal_Rename_VoiceRecord(int Port, char *getbuf)
1722 1733
1723 //3、拼接出地址 1734 //3、拼接出地址
1724 char OldFilePath[JZSDK_FILE_PATH_SIZE_MAX]; 1735 char OldFilePath[JZSDK_FILE_PATH_SIZE_MAX];
1725 - snprintf(OldFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/opus/%s", OldFileName); 1736 + snprintf(OldFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/pcm/%s", OldFileName);
1726 1737
1727 char NewFilePath[JZSDK_FILE_PATH_SIZE_MAX]; 1738 char NewFilePath[JZSDK_FILE_PATH_SIZE_MAX];
1728 - snprintf(NewFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/opus/%s", NewFileName); 1739 + snprintf(NewFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/pcm/%s", NewFileName);
1729 1740
1730 JZsdk_Osal_Rename(OldFilePath, NewFilePath); 1741 JZsdk_Osal_Rename(OldFilePath, NewFilePath);
1731 1742
@@ -1733,7 +1744,7 @@ static T_JZsdkReturnCode RecvDeal_Rename_VoiceRecord(int Port, char *getbuf) @@ -1733,7 +1744,7 @@ static T_JZsdkReturnCode RecvDeal_Rename_VoiceRecord(int Port, char *getbuf)
1733 1744
1734 //4、刷新歌曲列表 1745 //4、刷新歌曲列表
1735 #ifdef MEGAPHONE_CONFIG_STATUS_ON 1746 #ifdef MEGAPHONE_CONFIG_STATUS_ON
1736 - OpusFile_FlushList(); 1747 + PcmFile_FlushList();
1737 #endif 1748 #endif
1738 1749
1739 //回复操作成功 1750 //回复操作成功
@@ -2371,6 +2382,8 @@ static T_JZsdkReturnCode RecvDeal_OpusTrans_stop_and_check(int Port, char *getbu @@ -2371,6 +2382,8 @@ static T_JZsdkReturnCode RecvDeal_OpusTrans_stop_and_check(int Port, char *getbu
2371 **********/ 2382 **********/
2372 static T_JZsdkReturnCode RecvDeal_OpusPlay(int Port, char *getbuf) 2383 static T_JZsdkReturnCode RecvDeal_OpusPlay(int Port, char *getbuf)
2373 { 2384 {
  2385 + T_JZsdkReturnCode ret;
  2386 +
2374 JZSDK_LOG_INFO("%s,opus播放",JZsdk_DefineCode_GetPortName(Port)); 2387 JZSDK_LOG_INFO("%s,opus播放",JZsdk_DefineCode_GetPortName(Port));
2375 2388
2376 //获取帧的序列号 2389 //获取帧的序列号
@@ -2385,137 +2398,13 @@ static T_JZsdkReturnCode RecvDeal_OpusPlay(int Port, char *getbuf) @@ -2385,137 +2398,13 @@ static T_JZsdkReturnCode RecvDeal_OpusPlay(int Port, char *getbuf)
2385 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 2398 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
2386 } 2399 }
2387 2400
2388 - //获取命令  
2389 - int Mode = getbuf[9];  
2390 - if (Mode == 0)  
2391 - {  
2392 - UIcontrol_Opus_PlayFixedFile(Port);  
2393 -  
2394 - //回复操作成功  
2395 - HalSend_type1Send_Reply_Success(Port, FrameSequence);  
2396 - }  
2397 - else if (Mode == 1)  
2398 - {  
2399 -  
2400 - }  
2401 -  
2402 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
2403 -} 2401 + UIcontrol_Opus_PlayFixedFile(Port);
2404 2402
2405 -/**********************************  
2406 - *  
2407 - * opus列表查询  
2408 - *  
2409 - *  
2410 - * **********************************/  
2411 -static T_JZsdkReturnCode RecvDeal_Get_OpusList(int Port, char *getbuf)  
2412 -{  
2413 - T_JZsdkReturnCode ret;  
2414 -  
2415 - JZSDK_LOG_INFO("%s,opus列表查询",JZsdk_DefineCode_GetPortName(Port));  
2416 -  
2417 - //获取帧的序列号  
2418 - int FrameSequence = JZsdk_Get_FrameSequence(getbuf);  
2419 -  
2420 -#ifdef MEGAPHONE_CONFIG_STATUS_ON  
2421 -  
2422 - //刷新opus列表  
2423 - OpusFile_FlushList();  
2424 -  
2425 - //获取opus总数  
2426 - int OpusFileCount = OpusFile_GetListNum();  
2427 -  
2428 - //注册一个opus数组  
2429 - unsigned char **MusicName = (unsigned char **)malloc(OpusFileCount * sizeof(unsigned char*));  
2430 - if (MusicName == NULL)  
2431 - {  
2432 - //回复操作失败  
2433 - HalSend_type1Send_Reply_Failure(Port, FrameSequence);  
2434 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
2435 - }  
2436 -  
2437 - //注册一个歌曲名字长度的数组  
2438 - int *MusicNameLength = (int *)malloc(OpusFileCount * sizeof(int));  
2439 - if (MusicNameLength == NULL)  
2440 - {  
2441 - free(MusicName);  
2442 - //回复操作失败  
2443 - HalSend_type1Send_Reply_Failure(Port, FrameSequence);  
2444 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
2445 - }  
2446 -  
2447 - //为每一首opus分配内存  
2448 - for (int i = 0; i < OpusFileCount; i++)  
2449 - {  
2450 - MusicName[i] = (unsigned char*)malloc(128 * sizeof(unsigned char));  
2451 - if (MusicName[i] == NULL)  
2452 - {  
2453 - // 内存分配失败,需要释放之前分配的内存  
2454 - for (int j = 0; j < i; j++)  
2455 - {  
2456 - free(MusicName[j]);  
2457 - }  
2458 - free(MusicNameLength);  
2459 - free(MusicName);  
2460 -  
2461 - //回复操作失败  
2462 - HalSend_type1Send_Reply_Failure(Port, FrameSequence);  
2463 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
2464 - }  
2465 -  
2466 - memset(MusicName[i], 0, 128 * sizeof(unsigned char));  
2467 -  
2468 - //如果成功分配内存,则写入名字  
2469 - Megaphone_OpusFile_GetAudioNameByIndex(i, MusicName[i], &MusicNameLength[i]);  
2470 - }  
2471 -  
2472 - JZSDK_LOG_DEBUG("opus列表取出完成");  
2473 -  
2474 - //发送开始帧  
2475 - ret = HalSend_type1Send_Send_OpusList_Start(Port, FrameSequence, OpusFileCount);  
2476 -  
2477 - for (int i = 0; i < OpusFileCount; i++)  
2478 - {  
2479 - //获取歌曲详细信息  
2480 - struct AudioMange_audio_struct AudioDetailMessage;  
2481 - memset(&AudioDetailMessage, 0, sizeof(struct AudioMange_audio_struct));  
2482 - ret = OpusFile_GetAudioInfo(MusicName[i], MusicNameLength[i],&AudioDetailMessage);  
2483 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
2484 - {  
2485 - //回复操作失败  
2486 - HalSend_type1Send_Reply_Failure(Port, FrameSequence);  
2487 -  
2488 - continue;  
2489 - }  
2490 -  
2491 - //发送opus列表  
2492 - ret = HalSend_type1Send_Send_OpusList_Trans(Port, FrameSequence, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen, AudioDetailMessage.FileSize, AudioDetailMessage.Time);  
2493 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
2494 - {  
2495 - //回复操作失败  
2496 - HalSend_type1Send_Reply_Failure(Port, FrameSequence);  
2497 -  
2498 - continue;  
2499 - }  
2500 - }  
2501 -  
2502 - //释放存储的数据  
2503 - for (int i = 0; i < OpusFileCount; i++)  
2504 - {  
2505 - free(MusicName[i]);  
2506 - }  
2507 -  
2508 - free(MusicNameLength);  
2509 - free(MusicName); 2403 + //回复操作成功
  2404 + HalSend_type1Send_Reply_Success(Port, FrameSequence);
2510 2405
2511 - //发送结束帧  
2512 - ret = HalSend_type1Send_Send_OpusList_Stop(Port, FrameSequence);  
2513 2406
2514 -#else  
2515 - JZSDK_LOG_ERROR("非喊话器不支持opus列表");  
2516 - //回复操作失败  
2517 - HalSend_type1Send_Reply_Failure(Port, FrameSequence);  
2518 -#endif 2407 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
2519 } 2408 }
2520 2409
2521 /********* 2410 /*********
@@ -2639,6 +2528,178 @@ static T_JZsdkReturnCode RecvDeal_Opus_RealTimeVoice_stop(int Port, char *getbuf @@ -2639,6 +2528,178 @@ static T_JZsdkReturnCode RecvDeal_Opus_RealTimeVoice_stop(int Port, char *getbuf
2639 2528
2640 /******************************************************************************************************************************* 2529 /*******************************************************************************************************************************
2641 * 2530 *
  2531 + * pcm部分
  2532 + *
  2533 + * *******************************************************************************************************************************/
  2534 +
  2535 +/*********************************
  2536 + *
  2537 + * PCM播放
  2538 + *
  2539 + *
  2540 + * **********************************/
  2541 +static T_JZsdkReturnCode RecvDeal_PCM_Play(int Port, char *getbuf)
  2542 +{
  2543 + T_JZsdkReturnCode ret;
  2544 +
  2545 + JZSDK_LOG_INFO("%s, PCM播放",JZsdk_DefineCode_GetPortName(Port));
  2546 +
  2547 + //获取帧的序列号
  2548 + int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
  2549 +
  2550 + //分析pcm文件名
  2551 + unsigned char PcmName[128];
  2552 + unsigned int PcmNameLen = JZsdk_Get_FrameLength(getbuf) - 9 - 2;
  2553 + if (PcmNameLen > 128)
  2554 + {
  2555 + //回复操作失败
  2556 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2557 +
  2558 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  2559 + }
  2560 +
  2561 + memset(PcmName, 0, sizeof(PcmName));
  2562 + memcpy(PcmName, &getbuf[10], PcmNameLen);
  2563 +
  2564 + ret = UIcontrol_Pcm_PlayListFile(Port, PcmName, PcmNameLen);
  2565 + if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  2566 + {
  2567 + //回复操作成功
  2568 + HalSend_type1Send_Reply_Success(Port, FrameSequence);
  2569 + }
  2570 + else
  2571 + {
  2572 + //回复操作失败
  2573 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2574 +
  2575 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  2576 + }
  2577 +
  2578 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  2579 +}
  2580 +
  2581 +
  2582 +
  2583 +
  2584 +/**********************************
  2585 + *
  2586 + * pcm列表查询
  2587 + *
  2588 + *
  2589 + * **********************************/
  2590 +static T_JZsdkReturnCode RecvDeal_Get_PcmList(int Port, char *getbuf)
  2591 +{
  2592 + T_JZsdkReturnCode ret;
  2593 +
  2594 + JZSDK_LOG_INFO("%s,pcm列表查询",JZsdk_DefineCode_GetPortName(Port));
  2595 +
  2596 + //获取帧的序列号
  2597 + int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
  2598 +
  2599 +#ifdef MEGAPHONE_CONFIG_STATUS_ON
  2600 +
  2601 + //刷新pcm列表
  2602 + PcmFile_FlushList();
  2603 +
  2604 + //获取opus总数
  2605 + int PcmFileCount = PcmFile_GetListNum();
  2606 +
  2607 + //注册一个opus数组
  2608 + unsigned char **MusicName = (unsigned char **)malloc(PcmFileCount * sizeof(unsigned char*));
  2609 + if (MusicName == NULL)
  2610 + {
  2611 + //回复操作失败
  2612 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2613 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  2614 + }
  2615 +
  2616 + //注册一个歌曲名字长度的数组
  2617 + int *MusicNameLength = (int *)malloc(PcmFileCount * sizeof(int));
  2618 + if (MusicNameLength == NULL)
  2619 + {
  2620 + free(MusicName);
  2621 + //回复操作失败
  2622 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2623 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  2624 + }
  2625 +
  2626 + //为每一首opus分配内存
  2627 + for (int i = 0; i < PcmFileCount; i++)
  2628 + {
  2629 + MusicName[i] = (unsigned char*)malloc(128 * sizeof(unsigned char));
  2630 + if (MusicName[i] == NULL)
  2631 + {
  2632 + // 内存分配失败,需要释放之前分配的内存
  2633 + for (int j = 0; j < i; j++)
  2634 + {
  2635 + free(MusicName[j]);
  2636 + }
  2637 + free(MusicNameLength);
  2638 + free(MusicName);
  2639 +
  2640 + //回复操作失败
  2641 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2642 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  2643 + }
  2644 +
  2645 + memset(MusicName[i], 0, 128 * sizeof(unsigned char));
  2646 +
  2647 + //如果成功分配内存,则写入名字
  2648 + Megaphone_PcmFile_GetAudioNameByIndex(i, MusicName[i], &MusicNameLength[i]);
  2649 + }
  2650 +
  2651 + JZSDK_LOG_DEBUG("pcm列表取出完成");
  2652 +
  2653 + //发送开始帧
  2654 + ret = HalSend_type1Send_Send_OpusList_Start(Port, FrameSequence, PcmFileCount);
  2655 +
  2656 + for (int i = 0; i < PcmFileCount; i++)
  2657 + {
  2658 + //获取歌曲详细信息
  2659 + struct AudioMange_audio_struct AudioDetailMessage;
  2660 + memset(&AudioDetailMessage, 0, sizeof(struct AudioMange_audio_struct));
  2661 + ret = PcmFile_GetAudioInfo(MusicName[i], MusicNameLength[i],&AudioDetailMessage);
  2662 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  2663 + {
  2664 + //回复操作失败
  2665 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2666 +
  2667 + continue;
  2668 + }
  2669 +
  2670 + //发送opus列表
  2671 + ret = HalSend_type1Send_Send_OpusList_Trans(Port, FrameSequence, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen, AudioDetailMessage.FileSize, AudioDetailMessage.Time);
  2672 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  2673 + {
  2674 + //回复操作失败
  2675 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2676 +
  2677 + continue;
  2678 + }
  2679 + }
  2680 +
  2681 + //释放存储的数据
  2682 + for (int i = 0; i < PcmFileCount; i++)
  2683 + {
  2684 + free(MusicName[i]);
  2685 + }
  2686 +
  2687 + free(MusicNameLength);
  2688 + free(MusicName);
  2689 +
  2690 + //发送结束帧
  2691 + ret = HalSend_type1Send_Send_OpusList_Stop(Port, FrameSequence);
  2692 +
  2693 +#else
  2694 + JZSDK_LOG_ERROR("非喊话器不支持pcm列表");
  2695 + //回复操作失败
  2696 + HalSend_type1Send_Reply_Failure(Port, FrameSequence);
  2697 +#endif
  2698 +}
  2699 +
  2700 +
  2701 +/*******************************************************************************************************************************
  2702 + *
2642 * 云台部分 2703 * 云台部分
2643 * 2704 *
2644 * *******************************************************************************************************************************/ 2705 * *******************************************************************************************************************************/
@@ -4511,12 +4572,6 @@ static T_JZsdkReturnCode RecvDeal_InstructInput(int Port, int Receive_mode, unsi @@ -4511,12 +4572,6 @@ static T_JZsdkReturnCode RecvDeal_InstructInput(int Port, int Receive_mode, unsi
4511 return 0; 4572 return 0;
4512 break; 4573 break;
4513 4574
4514 - //获取opus列表  
4515 - case JZ_INSCODE_5AFRAME_OPUS_GETOPUSLIST:  
4516 - RecvDeal_Get_OpusList(Port,getbuf);  
4517 - return 0;  
4518 - break;  
4519 -  
4520 //开启opus实时喊话 4575 //开启opus实时喊话
4521 case JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_START: 4576 case JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_START:
4522 RecvDeal_Opus_RealTimeVoice_start(Port,getbuf); 4577 RecvDeal_Opus_RealTimeVoice_start(Port,getbuf);
@@ -4535,6 +4590,18 @@ static T_JZsdkReturnCode RecvDeal_InstructInput(int Port, int Receive_mode, unsi @@ -4535,6 +4590,18 @@ static T_JZsdkReturnCode RecvDeal_InstructInput(int Port, int Receive_mode, unsi
4535 return 0; 4590 return 0;
4536 break; 4591 break;
4537 4592
  4593 + //PCM播放
  4594 + case JZ_INSCODE_5AFRAME_PCM_PLAY:
  4595 + RecvDeal_PCM_Play(Port,getbuf);
  4596 + return 0;
  4597 + break;
  4598 +
  4599 + //获取Pcm列表
  4600 + case JZ_INSCODE_5AFRAME_PCM_GETPCMLIST:
  4601 + RecvDeal_Get_PcmList(Port,getbuf);
  4602 + return 0;
  4603 + break;
  4604 +
4538 //云台控制 4605 //云台控制
4539 case JZ_INSCODE_5AFRAME_GIMBAL_PITCH_CONTROL: 4606 case JZ_INSCODE_5AFRAME_GIMBAL_PITCH_CONTROL:
4540 RecvDeal_Gimbal_PitchControl(Port,getbuf); 4607 RecvDeal_Gimbal_PitchControl(Port,getbuf);
@@ -28,8 +28,6 @@ struct pcm_AlsaInfo @@ -28,8 +28,6 @@ struct pcm_AlsaInfo
28 int dealFlag; //处理标志位,用于避免卡死 28 int dealFlag; //处理标志位,用于避免卡死
29 }pcm_AlsaInfo; 29 }pcm_AlsaInfo;
30 30
31 -extern T_JZsdkReturnCode g_AudioDealPauseFlag;  
32 -  
33 /********** 31 /**********
34 * 32 *
35 * 参数初始化 33 * 参数初始化
@@ -360,7 +358,7 @@ T_JZsdkReturnCode Pcm_AlsaPlay(struct AudioDealInfo *IndexInfo, unsigned char *b @@ -360,7 +358,7 @@ T_JZsdkReturnCode Pcm_AlsaPlay(struct AudioDealInfo *IndexInfo, unsigned char *b
360 AlsaWaitPlayEnd(AlsaInfo); 358 AlsaWaitPlayEnd(AlsaInfo);
361 359
362 //暂停播放 360 //暂停播放
363 - while(g_AudioDealPauseFlag) 361 + while(AudioDeal_GetPauseAndContinuePlayStatus() == JZ_FLAGCODE_ON)
364 { 362 {
365 delayMs(1); 363 delayMs(1);
366 } 364 }
@@ -221,6 +221,18 @@ T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status) @@ -221,6 +221,18 @@ T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status)
221 g_AudioDealPauseFlag = status; 221 g_AudioDealPauseFlag = status;
222 } 222 }
223 223
  224 +/*******************
  225 + *
  226 + * 获取音频暂停状态
  227 + * jzon 为暂停播放
  228 + * jzoff 为继续播放
  229 + *
  230 + * *********************/
  231 +int AudioDeal_GetPauseAndContinuePlayStatus()
  232 +{
  233 + return g_AudioDealPauseFlag;
  234 +}
  235 +
224 /*************************** 236 /***************************
225 * 237 *
226 * 音频文件数据接入接口 238 * 音频文件数据接入接口
@@ -96,7 +96,10 @@ T_JZsdkReturnCode AudioDeal_FilePlayInput(unsigned char *FilePath); @@ -96,7 +96,10 @@ T_JZsdkReturnCode AudioDeal_FilePlayInput(unsigned char *FilePath);
96 T_JZsdkReturnCode AudioDeal_ResampleRest(unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format); 96 T_JZsdkReturnCode AudioDeal_ResampleRest(unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format);
97 T_JZsdkReturnCode AudioFile_Stream_DataInput(AVFrame *frame); 97 T_JZsdkReturnCode AudioFile_Stream_DataInput(AVFrame *frame);
98 T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer, int bytesRead); 98 T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer, int bytesRead);
  99 +
99 T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status); 100 T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status);
  101 +int AudioDeal_GetPauseAndContinuePlayStatus();
  102 +
100 T_JZsdkReturnCode Get_AudioDealStatus(); 103 T_JZsdkReturnCode Get_AudioDealStatus();
101 T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode); 104 T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode);
102 T_JZsdkReturnCode AudioDeal_Mp3DataStop(); 105 T_JZsdkReturnCode AudioDeal_Mp3DataStop();
@@ -24,6 +24,8 @@ @@ -24,6 +24,8 @@
24 #include "Megaphone/Music/AudioFile/Megaphone_AudioFile.h" 24 #include "Megaphone/Music/AudioFile/Megaphone_AudioFile.h"
25 #include "Megaphone/Music/RealTimeMP2/Megaphone_RealTimeMP2.h" 25 #include "Megaphone/Music/RealTimeMP2/Megaphone_RealTimeMP2.h"
26 #include "Megaphone/opus/Megaphone_Opus.h" 26 #include "Megaphone/opus/Megaphone_Opus.h"
  27 +#include "Megaphone/PcmAudio/PcmAudioFile.h"
  28 +
27 29
28 int MegPlayStatusUnChange_flag = JZ_FLAGCODE_OFF; 30 int MegPlayStatusUnChange_flag = JZ_FLAGCODE_OFF;
29 static MegaphonePlayStatus g_Megaphone_Play_Status = AUDIO_PLAY_STATUS_IDLE; 31 static MegaphonePlayStatus g_Megaphone_Play_Status = AUDIO_PLAY_STATUS_IDLE;
@@ -199,6 +201,14 @@ static T_JZsdkReturnCode Megaphone_Play(struct MegaphoneInfo *IndexInfo, enum Me @@ -199,6 +201,14 @@ static T_JZsdkReturnCode Megaphone_Play(struct MegaphoneInfo *IndexInfo, enum Me
199 ret = OpusFile_PlayFixedFile(); 201 ret = OpusFile_PlayFixedFile();
200 } 202 }
201 203
  204 + case AUDIO_PLAY_STATUS_PCM_LIST:
  205 + {
  206 + JZSDK_LOG_INFO("音频播放:pcm列表");
  207 +
  208 + //pcm播放
  209 + ret = PcmAudioPlay_Play(IndexInfo->str, IndexInfo->str_len);
  210 + }
  211 +
202 default: 212 default:
203 break; 213 break;
204 } 214 }
@@ -606,9 +616,27 @@ T_JZsdkReturnCode Megaphone_Broadcast_OpusDecodeStatus(int status) @@ -606,9 +616,27 @@ T_JZsdkReturnCode Megaphone_Broadcast_OpusDecodeStatus(int status)
606 **********/ 616 **********/
607 T_JZsdkReturnCode Megaphone_Opus_PlayFixedFile() 617 T_JZsdkReturnCode Megaphone_Opus_PlayFixedFile()
608 { 618 {
  619 + memset(g_MegaphoneInfo, 0, sizeof(struct MegaphoneInfo));
  620 + g_MegaphoneInfo->str_len = 0;
  621 +
609 return Megaphone_Play(g_MegaphoneInfo, AUDIO_PLAY_STATUS_OPUS_RECORD, JZ_FLAGCODE_ON); 622 return Megaphone_Play(g_MegaphoneInfo, AUDIO_PLAY_STATUS_OPUS_RECORD, JZ_FLAGCODE_ON);
610 } 623 }
611 624
  625 +/*********
  626 + *
  627 + * 1、播放list列表的pcm音频
  628 + *
  629 + *
  630 +**********/
  631 +T_JZsdkReturnCode Megaphone_PlayPcmListFile(unsigned char *Filename,int len)
  632 +{
  633 + memset(g_MegaphoneInfo, 0, sizeof(struct MegaphoneInfo));
  634 + memcpy(g_MegaphoneInfo->str, Filename, len);
  635 + g_MegaphoneInfo->str_len = len;
  636 +
  637 + return Megaphone_Play(g_MegaphoneInfo, AUDIO_PLAY_STATUS_PCM_LIST, JZ_FLAGCODE_ON);
  638 +}
  639 +
612 /* 640 /*
613 * 641 *
614 * 2、存储opus文件开始 642 * 2、存储opus文件开始
@@ -860,8 +888,8 @@ T_JZsdkReturnCode Megaphone_Init() @@ -860,8 +888,8 @@ T_JZsdkReturnCode Megaphone_Init()
860 //音频文件管理功能初始化 888 //音频文件管理功能初始化
861 Megaphone_AudioFile_Init(); 889 Megaphone_AudioFile_Init();
862 890
863 - //opus列表初始化  
864 - Megaphone_OpusFile_Init(); 891 + //pcm列表初始化
  892 + Megaphone_PcmFile_Init();
865 893
866 //设置音量 894 //设置音量
867 Megaphone_SetVolume(30, 0); 895 Megaphone_SetVolume(30, 0);
@@ -1031,9 +1059,28 @@ T_JZsdkReturnCode Megaphone_PlayContinue() @@ -1031,9 +1059,28 @@ T_JZsdkReturnCode Megaphone_PlayContinue()
1031 int ami =JZ_FLAGCODE_ON; 1059 int ami =JZ_FLAGCODE_ON;
1032 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &ami); 1060 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &ami);
1033 1061
1034 - AudioDeal_PauseAndContinuePlay(JZ_FLAGCODE_OFF);  
1035 -  
1036 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1062 + //查看播放状态是否不处于停止
  1063 + if (g_Megaphone_Play_Status == AUDIO_PLAY_STATUS_IDLE)
  1064 + {
  1065 + //播放当前音频
  1066 + unsigned char CurrentName[128];
  1067 + memset(CurrentName,0,sizeof(CurrentName));
  1068 + unsigned int CurrentNameLen = 0;
  1069 + unsigned int CurrentNum = 0;
  1070 + AudioMange_Get_FilePlayName(CurrentName, &CurrentNameLen, &CurrentNum);
  1071 + UIcontrol_PlayAudioFile(NO_SPECIFIED ,CurrentName, CurrentNameLen);
  1072 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1073 +
  1074 + }
  1075 + else if (g_Megaphone_Play_Status == AUDIO_PLAY_STATUS_MUSIC)
  1076 + {
  1077 + AudioDeal_PauseAndContinuePlay(JZ_FLAGCODE_OFF);
  1078 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1079 + }
  1080 + else
  1081 + {
  1082 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1083 + }
1037 } 1084 }
1038 1085
1039 /*************** 1086 /***************
@@ -1053,9 +1100,12 @@ T_JZsdkReturnCode Megaphone_PlayPause() @@ -1053,9 +1100,12 @@ T_JZsdkReturnCode Megaphone_PlayPause()
1053 //关闭功放 1100 //关闭功放
1054 int ami =JZ_FLAGCODE_OFF; 1101 int ami =JZ_FLAGCODE_OFF;
1055 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &ami); 1102 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &ami);
1056 -  
1057 - AudioDeal_PauseAndContinuePlay(JZ_FLAGCODE_ON);  
1058 - 1103 +
  1104 + if (g_Megaphone_Play_Status == AUDIO_PLAY_STATUS_MUSIC)
  1105 + {
  1106 + AudioDeal_PauseAndContinuePlay(JZ_FLAGCODE_ON);
  1107 + }
  1108 +
1059 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1109 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
1060 } 1110 }
1061 1111
@@ -1096,6 +1146,12 @@ static T_JZsdkReturnCode Megaphone_ConvertPlayStatus(int status) @@ -1096,6 +1146,12 @@ static T_JZsdkReturnCode Megaphone_ConvertPlayStatus(int status)
1096 return 0x40; 1146 return 0x40;
1097 } 1147 }
1098 1148
  1149 + if (status == AUDIO_PLAY_STATUS_PCM_LIST)
  1150 + {
  1151 + return 0x50;
  1152 + }
  1153 +
  1154 +
1099 if (status == AUDIO_PLAY_STATUS_IDLE) 1155 if (status == AUDIO_PLAY_STATUS_IDLE)
1100 { 1156 {
1101 return 0x00; 1157 return 0x00;
@@ -44,7 +44,7 @@ typedef enum MegaphonePlayStatus @@ -44,7 +44,7 @@ typedef enum MegaphonePlayStatus
44 AUDIO_PLAY_STATUS_OPUS_RECORD = 0x05, //opus录音 44 AUDIO_PLAY_STATUS_OPUS_RECORD = 0x05, //opus录音
45 AUDIO_PLAY_STATUS_MP3_REAL_TIME = 0x06, //mp3实时语音 45 AUDIO_PLAY_STATUS_MP3_REAL_TIME = 0x06, //mp3实时语音
46 AUDIO_PLAY_STATUS_MP3_RECORD = 0x07, //mp3录音喊话 46 AUDIO_PLAY_STATUS_MP3_RECORD = 0x07, //mp3录音喊话
47 - 47 + AUDIO_PLAY_STATUS_PCM_LIST =0x08, //pcm列表播放
48 }MegaphonePlayStatus; 48 }MegaphonePlayStatus;
49 49
50 typedef enum MegaphoneTTSParam 50 typedef enum MegaphoneTTSParam
@@ -128,6 +128,7 @@ T_JZsdkReturnCode Megaphone_SaveAudioFileTrans(char *SaveData, int size); @@ -128,6 +128,7 @@ T_JZsdkReturnCode Megaphone_SaveAudioFileTrans(char *SaveData, int size);
128 T_JZsdkReturnCode Megaphone_Broadcast_OpusDecodeStatus(int status); 128 T_JZsdkReturnCode Megaphone_Broadcast_OpusDecodeStatus(int status);
129 T_JZsdkReturnCode Megaphone_SaveAudioFileStop(int checkFlag, unsigned char *CheckCode); 129 T_JZsdkReturnCode Megaphone_SaveAudioFileStop(int checkFlag, unsigned char *CheckCode);
130 T_JZsdkReturnCode Megaphone_Opus_PlayFixedFile(); 130 T_JZsdkReturnCode Megaphone_Opus_PlayFixedFile();
  131 +T_JZsdkReturnCode Megaphone_PlayPcmListFile(unsigned char *Filename,int len);
131 132
132 /******** 133 /********
133 * 134 *
@@ -8,81 +8,81 @@ @@ -8,81 +8,81 @@
8 #include "JZsdkLib.h" 8 #include "JZsdkLib.h"
9 #include "Megaphone/AudioMange/AudioMange.h" 9 #include "Megaphone/AudioMange/AudioMange.h"
10 10
11 -#define OPUS_DIR "/root/sdcard/opus" 11 +#define PCM_DIR "/root/sdcard/pcm"
12 12
13 -//创建一个opus节点  
14 -static struct AudioMange_Node *g_OpusList = NULL;  
15 -static struct AudioMange_Node *g_OpusListtail = NULL; // 用于跟踪链表的尾部 13 +//创建一个pcm节点
  14 +static struct AudioMange_Node *g_PcmList = NULL;
  15 +static struct AudioMange_Node *g_PcmListtail = NULL; // 用于跟踪链表的尾部
16 16
17 -static int g_OpusListNum = 0; //用于记录链表中的节点数量  
18 -static int g_OpusList_CurrentNum = 0; //用于记录链表中当前节点位置 17 +static int g_PcmListNum = 0; //用于记录链表中的节点数量
  18 +static int g_PcmList_CurrentNum = 0; //用于记录链表中当前节点位置
19 19
20 /***************** 20 /*****************
21 * 21 *
22 - * 获取opus文件列表的歌曲数 22 + * 获取pcm文件列表的歌曲数
23 * 23 *
24 * ************/ 24 * ************/
25 -int OpusFile_GetListNum() 25 +int PcmFile_GetListNum()
26 { 26 {
27 - return g_OpusListNum; 27 + return g_PcmListNum;
28 } 28 }
29 29
30 /********* 30 /*********
31 * 31 *
32 - * opus文件链表注销 32 + * pcm文件链表注销
33 * 33 *
34 **********/ 34 **********/
35 -static T_JZsdkReturnCode OpusFile_FreeAudioList() 35 +static T_JZsdkReturnCode PcmFile_FreeAudioList()
36 { 36 {
37 //清空尾部指针 37 //清空尾部指针
38 - g_OpusListtail = NULL; 38 + g_PcmListtail = NULL;
39 39
40 //清空歌曲数量 40 //清空歌曲数量
41 - g_OpusListNum = 0; //记录链表中一共有几首歌  
42 - g_OpusList_CurrentNum = 0; //记录播放当前第几首歌 41 + g_PcmListNum = 0; //记录链表中一共有几首歌
  42 + g_PcmList_CurrentNum = 0; //记录播放当前第几首歌
43 43
44 //释放掉整个链表 44 //释放掉整个链表
45 - Jzsdk_Free_AndioMange_Node(&g_OpusList); 45 + Jzsdk_Free_AndioMange_Node(&g_PcmList);
46 46
47 - g_OpusList = NULL; 47 + g_PcmList = NULL;
48 48
49 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 49 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
50 } 50 }
51 51
52 /********* 52 /*********
53 * 53 *
54 - * opus文件链表刷新 54 + * pcm文件链表刷新
55 * 55 *
56 **********/ 56 **********/
57 -T_JZsdkReturnCode OpusFile_FlushList() 57 +T_JZsdkReturnCode PcmFile_FlushList()
58 { 58 {
59 //读取audio文件夹,并将歌曲名放入音频列表 59 //读取audio文件夹,并将歌曲名放入音频列表
60 DIR *dir; 60 DIR *dir;
61 struct dirent *entry; 61 struct dirent *entry;
62 struct stat fileStat; 62 struct stat fileStat;
63 63
64 - //创建一个临时opus节点  
65 - struct AudioMange_audio_struct OpusInfo; 64 + //创建一个临时pcm节点
  65 + struct AudioMange_audio_struct PcmInfo;
66 T_JZsdkReturnCode ret; 66 T_JZsdkReturnCode ret;
67 67
68 - //检查是否存在opus文件夹,没有则创建一个  
69 - if(JZsdk_check_directory_exists_posix(OPUS_DIR) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 68 + //检查是否存在pcm文件夹,没有则创建一个
  69 + if(JZsdk_check_directory_exists_posix(PCM_DIR) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
70 { 70 {
71 - JZSDK_LOG_ERROR("不存在opus文件夹,创建一个");  
72 - JZsdk_Osal_Mkdir(OPUS_DIR); 71 + JZSDK_LOG_ERROR("不存在pcm文件夹,创建一个");
  72 + JZsdk_Osal_Mkdir(PCM_DIR);
73 } 73 }
74 74
75 //确定音频文件夹存在 75 //确定音频文件夹存在
76 - if ((dir = opendir(OPUS_DIR)) == NULL) 76 + if ((dir = opendir(PCM_DIR)) == NULL)
77 { 77 {
78 JZSDK_LOG_ERROR("音频文件夹获取失败"); 78 JZSDK_LOG_ERROR("音频文件夹获取失败");
79 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 79 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
80 } 80 }
81 81
82 //查看歌曲存放链表是否有注册过 82 //查看歌曲存放链表是否有注册过
83 - if (g_OpusList != NULL) 83 + if (g_PcmList != NULL)
84 { 84 {
85 - OpusFile_FreeAudioList(); 85 + PcmFile_FreeAudioList();
86 } 86 }
87 87
88 while ((entry = readdir(dir)) != NULL) 88 while ((entry = readdir(dir)) != NULL)
@@ -109,44 +109,44 @@ T_JZsdkReturnCode OpusFile_FlushList() @@ -109,44 +109,44 @@ T_JZsdkReturnCode OpusFile_FlushList()
109 //printf("获取到%s\n",filename); 109 //printf("获取到%s\n",filename);
110 110
111 // 检查后缀 111 // 检查后缀
112 - if (JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".opus") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS  
113 - || JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".OPUS") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS 112 + if (JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".pcm") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS
  113 + || JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".PCM") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS
114 ) 114 )
115 { 115 {
116 // 处理文件 116 // 处理文件
117 - memset(&OpusInfo, 0, sizeof(OpusInfo)); // 清除audioInfo结构 117 + memset(&PcmInfo, 0, sizeof(PcmInfo)); // 清除audioInfo结构
118 118
119 //写入文件名 119 //写入文件名
120 - strncpy(OpusInfo.FileName, entry->d_name, JZSDK_FILE_NAME_SIZE_MAX); 120 + strncpy(PcmInfo.FileName, entry->d_name, JZSDK_FILE_NAME_SIZE_MAX);
121 121
122 unsigned char fileDir [256]; 122 unsigned char fileDir [256];
123 - snprintf(fileDir, sizeof(fileDir), "/root/sdcard/opus/%s", filename); 123 + snprintf(fileDir, sizeof(fileDir), "%s/%s",PCM_DIR, filename);
124 124
125 //写入文件大小 125 //写入文件大小
126 - JZsdk_Fs_ReadFileSize(fileDir, &(OpusInfo.FileSize)); 126 + JZsdk_Fs_ReadFileSize(fileDir, &(PcmInfo.FileSize));
127 127
128 //根据文件大小写入时长信息 128 //根据文件大小写入时长信息
129 - //int temp_time = (OpusInfo.FileSize * 8) / (16000 * 16 * 1); #这条是pcm算时长,超准确  
130 - int temp_time = (OpusInfo.FileSize * 8) / (16000);  
131 - OpusInfo.Time = temp_time; 129 + int temp_time = (PcmInfo.FileSize * 8) / (16000 * 16 * 1); //这条是pcm算时长,超准确
  130 + //int temp_time = (PcmInfo.FileSize * 8) / (16000); //这条是opus算时长,超准确
  131 + PcmInfo.Time = temp_time;
132 132
133 //写入文件名长度 133 //写入文件名长度
134 - OpusInfo.FileNameLen = len; 134 + PcmInfo.FileNameLen = len;
135 135
136 // 创建新节点 136 // 创建新节点
137 struct AudioMange_Node *newNode = NULL; 137 struct AudioMange_Node *newNode = NULL;
138 - ret = Jzsdk_Create_AndioMange_Node(&newNode, OpusInfo); 138 + ret = Jzsdk_Create_AndioMange_Node(&newNode, PcmInfo) ;
139 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 139 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
140 { 140 {
141 - JZSDK_LOG_ERROR("存放音乐 %s 失败", entry->d_name); 141 + JZSDK_LOG_ERROR("存放pcm节点 %s 失败", entry->d_name);
142 continue; 142 continue;
143 } 143 }
144 144
145 // 将新节点添加到链表末尾 145 // 将新节点添加到链表末尾
146 - Jzsdk_AddAudioNodeToCircularList(&g_OpusList, &g_OpusListtail, &newNode); 146 + Jzsdk_AddAudioNodeToCircularList(&g_PcmList, &g_PcmListtail, &newNode);
147 147
148 // 歌曲计数+1 148 // 歌曲计数+1
149 - g_OpusListNum++; 149 + g_PcmListNum++;
150 } 150 }
151 } 151 }
152 } 152 }
@@ -154,12 +154,12 @@ T_JZsdkReturnCode OpusFile_FlushList() @@ -154,12 +154,12 @@ T_JZsdkReturnCode OpusFile_FlushList()
154 closedir(dir); 154 closedir(dir);
155 155
156 //设置默认播放歌曲 156 //设置默认播放歌曲
157 - g_OpusList_CurrentNum = 0; 157 + g_PcmList_CurrentNum = 0;
158 158
159 //打印一遍已加载的音乐 159 //打印一遍已加载的音乐
160 - JZsdk_PrintfAuidoNode_AudioList(g_OpusList); 160 + JZsdk_PrintfAuidoNode_AudioList(g_PcmList);
161 161
162 - JZSDK_LOG_INFO("刷新opus列表已完成"); 162 + JZSDK_LOG_INFO("刷新pcm列表已完成");
163 163
164 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 164 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
165 } 165 }
@@ -172,27 +172,27 @@ T_JZsdkReturnCode OpusFile_FlushList() @@ -172,27 +172,27 @@ T_JZsdkReturnCode OpusFile_FlushList()
172 * 172 *
173 * 173 *
174 * *********************************/ 174 * *********************************/
175 -T_JZsdkReturnCode Megaphone_OpusFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len) 175 +T_JZsdkReturnCode Megaphone_PcmFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len)
176 { 176 {
177 T_JZsdkReturnCode ret ; 177 T_JZsdkReturnCode ret ;
178 178
179 //判断歌曲列表是否有歌 179 //判断歌曲列表是否有歌
180 - if (g_OpusListNum == 0) 180 + if (g_PcmListNum == 0)
181 { 181 {
182 - JZSDK_LOG_INFO("opus列表中没有歌"); 182 + JZSDK_LOG_INFO("pcm列表中没有歌");
183 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 183 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
184 } 184 }
185 185
186 //判断序号是否在数量内 186 //判断序号是否在数量内
187 - if (index > g_OpusListNum) 187 + if (index > g_PcmListNum)
188 { 188 {
189 - JZSDK_LOG_INFO("opus列表中没有第%d首歌",index); 189 + JZSDK_LOG_INFO("pcm列表中没有第%d首歌",index);
190 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 190 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
191 } 191 }
192 192
193 //根据当前的索引值,获取当前的歌曲节点 193 //根据当前的索引值,获取当前的歌曲节点
194 struct AudioMange_Node *Current = NULL; 194 struct AudioMange_Node *Current = NULL;
195 - ret = getAudioMange_NodeAtIndex(g_OpusList, &Current, index); 195 + ret = getAudioMange_NodeAtIndex(g_PcmList, &Current, index);
196 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 196 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
197 { 197 {
198 return ret; 198 return ret;
@@ -209,15 +209,39 @@ T_JZsdkReturnCode Megaphone_OpusFile_GetAudioNameByIndex(int index, unsigned cha @@ -209,15 +209,39 @@ T_JZsdkReturnCode Megaphone_OpusFile_GetAudioNameByIndex(int index, unsigned cha
209 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 209 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
210 } 210 }
211 211
  212 +/***********
  213 + *
  214 + * 查询pcm是否存在于列表
  215 + *
  216 + * **********/
  217 +T_JZsdkReturnCode Megaphone_PcmFile_IsExistInList(unsigned char *str, unsigned int str_len)
  218 +{
  219 + T_JZsdkReturnCode ret;
  220 +
  221 + //1、查询该名字是否存在于音乐列表中
  222 + struct AudioMange_audio_struct songToFind;
  223 + memset(&songToFind, 0, sizeof(struct AudioMange_audio_struct));
  224 +
  225 + memset(songToFind.FileName, 0 ,sizeof(songToFind.FileName));
  226 + memcpy(songToFind.FileName, str, str_len);
212 227
  228 + ret = JZsdk_isSongInAudioList(g_PcmList, songToFind);
  229 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  230 + {
  231 + JZSDK_LOG_ERROR("播放文件不存在于pcm列表 %s", songToFind.FileName);
  232 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  233 + }
  234 +
  235 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  236 +}
213 237
214 /***************** 238 /*****************
215 * 239 *
216 - * 查询opus信息 240 + * 查询pcm信息
217 * 241 *
218 * 242 *
219 * **************/ 243 * **************/
220 -T_JZsdkReturnCode OpusFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind) 244 +T_JZsdkReturnCode PcmFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind)
221 { 245 {
222 T_JZsdkReturnCode ret; 246 T_JZsdkReturnCode ret;
223 247
@@ -225,29 +249,29 @@ T_JZsdkReturnCode OpusFile_GetAudioInfo(unsigned char *str, unsigned int str_len @@ -225,29 +249,29 @@ T_JZsdkReturnCode OpusFile_GetAudioInfo(unsigned char *str, unsigned int str_len
225 memset(songToFind->FileName, 0 ,sizeof(songToFind->FileName)); 249 memset(songToFind->FileName, 0 ,sizeof(songToFind->FileName));
226 memcpy(songToFind->FileName, str, str_len); 250 memcpy(songToFind->FileName, str, str_len);
227 251
228 - ret = JZsdk_isSongInAudioList(g_OpusList, (*songToFind)); 252 + ret = JZsdk_isSongInAudioList(g_PcmList, (*songToFind));
229 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 253 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
230 { 254 {
231 - JZSDK_LOG_ERROR("播放文件不存在于opus列表 %s", songToFind->FileName); 255 + JZSDK_LOG_ERROR("播放文件不存在于pcm列表 %s", songToFind->FileName);
232 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 256 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
233 } 257 }
234 258
235 //2、获取歌曲信息 259 //2、获取歌曲信息
236 - JZsdk_GetSongInDudioList_AudioInfo(g_OpusList, songToFind); 260 + JZsdk_GetSongInDudioList_AudioInfo(g_PcmList, songToFind);
237 261
238 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 262 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
239 } 263 }
240 264
241 /********* 265 /*********
242 * 266 *
243 - * opus文件初始化 267 + * pcm文件初始化
244 * 268 *
245 **********/ 269 **********/
246 -T_JZsdkReturnCode Megaphone_OpusFile_Init() 270 +T_JZsdkReturnCode Megaphone_PcmFile_Init()
247 { 271 {
248 - //刷新opus列表(用于加载新的opus文件)  
249 - OpusFile_FlushList(); 272 + //刷新pcm列表(用于加载新的pcm文件)
  273 + PcmFile_FlushList();
250 274
251 - JZSDK_LOG_DEBUG("opusFile Init Complete"); 275 + JZSDK_LOG_DEBUG("pcmFile Init Complete");
252 } 276 }
253 277
  1 +/**
  2 + ********************************************************************
  3 + * @file OpusFile.h
  4 + * OpusFile.c OpusFileSave.c 的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef OPUS_FILE_H
  11 +#define OPUS_FILE_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +#include "Megaphone/AudioMange/AudioMange_Param.h"
  16 +
  17 +#ifdef __cplusplus
  18 +extern "C" {
  19 +#endif
  20 +
  21 +/* Exported constants --------------------------------------------------------*/
  22 +/* 常亮定义*/
  23 +
  24 +/* Exported types ------------------------------------------------------------*/
  25 +
  26 +/* Exported functions --------------------------------------------------------*/
  27 +int PcmFile_GetListNum();
  28 +
  29 +T_JZsdkReturnCode PcmFile_FlushList();
  30 +T_JZsdkReturnCode Megaphone_PcmFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len);
  31 +T_JZsdkReturnCode Megaphone_PcmFile_IsExistInList(unsigned char *str, unsigned int str_len);
  32 +T_JZsdkReturnCode PcmFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind);
  33 +T_JZsdkReturnCode Megaphone_PcmFile_Init();
  34 +
  35 +T_JZsdkReturnCode PcmAudioPlay_Play(unsigned char *str, unsigned int str_len);
  36 +
  37 +
  38 +#ifdef __cplusplus
  39 +}
  40 +#endif
  41 +
  42 +#endif
  1 +#include <stdio.h>
  2 +#include <stdlib.h>
  3 +#include <string.h>
  4 +#include <pthread.h>
  5 +#include <dirent.h>
  6 +#include <sys/stat.h>
  7 +
  8 +#include "JZsdkLib.h"
  9 +#include "Megaphone/PcmAudio/PcmAudioFile.h"
  10 +#include "Megaphone/Megaphone.h"
  11 +
  12 +#define PCM_DIR "/root/sdcard/pcm"
  13 +static int g_opus_sampleRate = 16000; //解码采样率
  14 +
  15 +typedef struct t_PcmParam{
  16 + unsigned char *FileName;
  17 + unsigned int FileSize;
  18 +}t_PcmParam;
  19 +
  20 +static T_JZTaskHandle g_pcmplay_task = NULL;
  21 +
  22 +static T_JZsdkReturnCode PcmPlay_Interface(t_PcmParam *PcmParam)
  23 +{
  24 + unsigned int nbBytes;
  25 + uint8_t cbits[3 * 1276];
  26 + int timeNum = 0;
  27 + int loop = JZ_FLAGCODE_OFF;
  28 + int loop_interval;
  29 + double total_duration = 0;
  30 + int last_printed_second = -1; // 上次打印的秒数,初始化为-1表示还没有打印过
  31 +
  32 + FILE *Pcm_fp = fopen("%s/%s", "rb", PCM_DIR, PcmParam->FileName);
  33 + if (Pcm_fp == NULL)
  34 + {
  35 + JZSDK_LOG_ERROR("PcmPlay_Interface: fopen failed, file name = %s", PcmParam->FileName);
  36 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  37 + }
  38 +
  39 + while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON)
  40 + {
  41 + nbBytes = fread(cbits, 1, 3 * 1276, Pcm_fp);
  42 + if(nbBytes > 0)
  43 + {
  44 + AudioDeal_PcmDataInput(g_opus_sampleRate, (unsigned char *)cbits, nbBytes);
  45 + }
  46 +
  47 + int totalSamples = nbBytes / (2);
  48 +
  49 + // 计算当前帧的持续时间(秒)
  50 + double frame_duration = (double)totalSamples / g_opus_sampleRate;
  51 + total_duration += frame_duration;
  52 +
  53 + int current_second = (int)floor(total_duration); // 获取当前总时间的整数秒部分
  54 + if (current_second > last_printed_second)
  55 + {
  56 + printf("nb:%d rate:%d duration:%f total_duration:%f\n", totalSamples, g_opus_sampleRate, frame_duration, current_second);
  57 +
  58 + //回传播放时间
  59 + Megaphone_PlayBackTime(current_second);
  60 +
  61 + last_printed_second = current_second; // 更新上次打印的秒数
  62 + }
  63 +
  64 + if (feof(Pcm_fp))
  65 + {
  66 + total_duration = 0;
  67 + last_printed_second = -1;
  68 +
  69 + //如果循环播放没打开
  70 + Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP, &loop);
  71 + Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP_INTERVAL, &loop_interval);
  72 +
  73 + if (loop == JZ_FLAGCODE_OFF)
  74 + {
  75 + timeNum = 0;
  76 +
  77 + // //播放结束延迟
  78 + // while ((timeNum <=3000) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
  79 + // {
  80 + // delayMs(10);
  81 + // timeNum +=10;
  82 + // }
  83 +
  84 + break;
  85 + }
  86 + //如果循环播放打开
  87 + else if (loop == JZ_FLAGCODE_ON)
  88 + {
  89 + timeNum = 0;
  90 + JZSDK_LOG_INFO("循环播放pcm");
  91 +
  92 + // //播放结束延迟
  93 + // while ((loop == 1) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
  94 + // {
  95 + // delayMs(10);
  96 + // timeNum +=10;
  97 + // }
  98 +
  99 + //重置文件光标 继续播放
  100 + fseek(Pcm_fp, 0, SEEK_SET);
  101 +
  102 + //循环播放延时
  103 + while (loop_interval > 0 && (loop == JZ_FLAGCODE_ON) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
  104 + {
  105 + delayMs(50);
  106 + loop_interval -= 50;
  107 + }
  108 +
  109 + continue;
  110 + }
  111 + }
  112 + }
  113 +
  114 + fclose(Pcm_fp);
  115 +
  116 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  117 +}
  118 +
  119 +/*
  120 +*
  121 +* 播放固定位置pcm线程
  122 +*
  123 +*/
  124 +static void *Pcm_Play_task(void *arg)
  125 +{
  126 + Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
  127 + Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
  128 +
  129 + //广播开始
  130 + Megaphone_status_Broadcast(AUDIO_PLAY_STATUS_PCM_LIST);
  131 +
  132 + int amplifier = JZ_FLAGCODE_ON;
  133 + Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
  134 +
  135 + t_PcmParam *PcmParam = (t_PcmParam *)arg;
  136 + PcmPlay_Interface(PcmParam);
  137 +
  138 + amplifier = JZ_FLAGCODE_OFF;
  139 + Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
  140 +
  141 + Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
  142 + Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
  143 +
  144 + //广播关闭
  145 + Megaphone_status_Broadcast(JZ_FLAGCODE_OFF);
  146 +}
  147 +
  148 +
  149 +T_JZsdkReturnCode PcmAudioPlay_Play(unsigned char *str, unsigned int str_len)
  150 +{
  151 + T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
  152 +
  153 + T_JZsdkReturnCode ret;
  154 +
  155 + ret = Megaphone_PcmFile_IsExistInList(str, str_len);
  156 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  157 + {
  158 + JZSDK_LOG_ERROR("PcmAudioPlay_Play: Megaphone_PcmFile_IsExistInList failed, ret = %d", ret);
  159 + return ret;
  160 + }
  161 +
  162 + t_PcmParam *PcmParam = (t_PcmParam *)malloc(sizeof(t_PcmParam));
  163 + PcmParam->FileName = str;
  164 + PcmParam->FileSize = str_len;
  165 +
  166 + //播放
  167 + OsalHandler->TaskCreate("PiayPcmFile", Pcm_Play_task, 8192, PcmParam, &g_pcmplay_task);
  168 +
  169 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  170 +}
@@ -24,17 +24,10 @@ extern "C" { @@ -24,17 +24,10 @@ extern "C" {
24 /* Exported types ------------------------------------------------------------*/ 24 /* Exported types ------------------------------------------------------------*/
25 25
26 /* Exported functions --------------------------------------------------------*/ 26 /* Exported functions --------------------------------------------------------*/
27 -int OpusFile_GetListNum();  
28 -T_JZsdkReturnCode Megaphone_OpusFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len);  
29 -T_JZsdkReturnCode OpusFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind);  
30 -  
31 -  
32 -  
33 -T_JZsdkReturnCode Megaphone_OpusFile_Init();  
34 -T_JZsdkReturnCode OpusFile_FlushList();  
35 -T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile);  
36 -T_JZsdkReturnCode OpusFile_PlayFixedFile();  
37 int OpusFile_GetSaveFlag(void); 27 int OpusFile_GetSaveFlag(void);
  28 +T_JZsdkReturnCode OpusFile_PlayFixedFile();
  29 +T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile);
  30 +T_JZsdkReturnCode OpusFile_DecodeOpusAndSave(int SaveMode, unsigned char *InFile,unsigned char *OutFile);
38 31
39 T_JZsdkReturnCode OpusFile_SetDecodeBitrate(int bitrate); 32 T_JZsdkReturnCode OpusFile_SetDecodeBitrate(int bitrate);
40 T_JZsdkReturnCode OpusFile_SetDecodeChannels(int channels); 33 T_JZsdkReturnCode OpusFile_SetDecodeChannels(int channels);
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 #include "BaseConfig.h" 6 #include "BaseConfig.h"
7 7
8 #include "AudioDeal/AudioDeal.h" 8 #include "AudioDeal/AudioDeal.h"
  9 +#include "Megaphone/PcmAudio/PcmAudioFile.h"
9 10
10 #include "opus.h" 11 #include "opus.h"
11 12
@@ -13,6 +14,7 @@ @@ -13,6 +14,7 @@
13 #define OPUS_CHANNELS (1) 14 #define OPUS_CHANNELS (1)
14 #define OPUS_MAX_PACKET_SIZE (3 * 1276) 15 #define OPUS_MAX_PACKET_SIZE (3 * 1276)
15 16
  17 +#define PCM_SAVE_FILE_NAME "/root/save.pcm" //用于保存的pcm
16 #define PCM_PLAY_FILE_NAME "/root/test_audio.pcm" //用于播放的pcm 18 #define PCM_PLAY_FILE_NAME "/root/test_audio.pcm" //用于播放的pcm
17 19
18 static int g_opus_decodeBitrate = 16000; //解码码率 20 static int g_opus_decodeBitrate = 16000; //解码码率
@@ -24,6 +26,14 @@ static int g_Opus_decode_Flag = JZ_FLAGCODE_OFF; //opus的解码标志位 @@ -24,6 +26,14 @@ static int g_Opus_decode_Flag = JZ_FLAGCODE_OFF; //opus的解码标志位
24 static T_JZTaskHandle g_DecodeOpus_task = NULL; 26 static T_JZTaskHandle g_DecodeOpus_task = NULL;
25 static T_JZTaskHandle g_OpusPlay_task = NULL; 27 static T_JZTaskHandle g_OpusPlay_task = NULL;
26 28
  29 +typedef struct OpusDecodeFile
  30 +{
  31 + unsigned char inputFilePath[JZSDK_FILE_PATH_SIZE_MAX];
  32 + unsigned char outputFilePath[JZSDK_FILE_PATH_SIZE_MAX];
  33 + int saveMode;
  34 +}OpusDecodeFile;
  35 +
  36 +
27 T_JZsdkReturnCode OpusFile_SetDecodeBitrate(int bitrate) 37 T_JZsdkReturnCode OpusFile_SetDecodeBitrate(int bitrate)
28 { 38 {
29 g_opus_decodeBitrate = bitrate; 39 g_opus_decodeBitrate = bitrate;
@@ -208,27 +218,6 @@ T_JZsdkReturnCode OpusFile_PlayFixedFile() @@ -208,27 +218,6 @@ T_JZsdkReturnCode OpusFile_PlayFixedFile()
208 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 218 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
209 } 219 }
210 220
211 -  
212 -/*******************************  
213 -*  
214 -* 播放opus列表的音乐  
215 -* 旧接口,无需定位传入的位置  
216 -*  
217 -************************************/  
218 -T_JZsdkReturnCode OpusFile_PlayListFile(unsigned char *OpusFile)  
219 -{  
220 - T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();  
221 -  
222 - //检测歌曲是否在列表中  
223 -  
224 -  
225 - //OsalHandler->TaskCreate("PiayFilexdFile", PlayFixedFile_task, 8192, NULL, &g_DecodeOpus_task);  
226 -  
227 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
228 -}  
229 -  
230 -  
231 -  
232 /*************************************************************************************************************/ 221 /*************************************************************************************************************/
233 222
234 /* 223 /*
@@ -237,7 +226,7 @@ T_JZsdkReturnCode OpusFile_PlayListFile(unsigned char *OpusFile) @@ -237,7 +226,7 @@ T_JZsdkReturnCode OpusFile_PlayListFile(unsigned char *OpusFile)
237 226
238 227
239 */ 228 */
240 -static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile) 229 +static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile, unsigned char *SaveFile)
241 { 230 {
242 FILE *fin = NULL; 231 FILE *fin = NULL;
243 FILE *fout = NULL; 232 FILE *fout = NULL;
@@ -273,7 +262,7 @@ static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile) @@ -273,7 +262,7 @@ static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile)
273 } 262 }
274 263
275 //创建一个opus输出文件 264 //创建一个opus输出文件
276 - fout = fopen(PCM_PLAY_FILE_NAME, "w"); 265 + fout = fopen(SaveFile, "w");
277 if (fout == NULL) { 266 if (fout == NULL) {
278 JZSDK_LOG_ERROR("创建opus输出文件失败"); 267 JZSDK_LOG_ERROR("创建opus输出文件失败");
279 goto DecodeFinsh; 268 goto DecodeFinsh;
@@ -372,7 +361,7 @@ static void *DecodeOpus_task(void *arg) @@ -372,7 +361,7 @@ static void *DecodeOpus_task(void *arg)
372 { 361 {
373 unsigned char *opusFile = (unsigned char *)arg; 362 unsigned char *opusFile = (unsigned char *)arg;
374 363
375 - T_JZsdkReturnCode ret = OpusDecodeFun(opusFile); 364 + T_JZsdkReturnCode ret = OpusDecodeFun(opusFile, PCM_PLAY_FILE_NAME);
376 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 365 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
377 { 366 {
378 //广播解码失败 367 //广播解码失败
@@ -431,4 +420,77 @@ T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile) @@ -431,4 +420,77 @@ T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile)
431 OsalHandler->TaskCreate("DecodeOpus", DecodeOpus_task, 8192, (void *)DecodeFile, &g_DecodeOpus_task); 420 OsalHandler->TaskCreate("DecodeOpus", DecodeOpus_task, 8192, (void *)DecodeFile, &g_DecodeOpus_task);
432 421
433 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 422 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  423 +}
  424 +
  425 +
  426 +
  427 +/*******************
  428 +*
  429 +* opus解码线程
  430 +*
  431 +*******************/
  432 +static void *DecodeOpus_task1(void *arg)
  433 +{
  434 +
  435 + OpusDecodeFile *opusDecodeInfo = (OpusDecodeFile *)arg;
  436 +
  437 +
  438 + T_JZsdkReturnCode ret = OpusDecodeFun(opusDecodeInfo->inputFilePath, PCM_SAVE_FILE_NAME);
  439 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  440 + {
  441 + //广播解码失败
  442 + Megaphone_Broadcast_OpusDecodeStatus(1);
  443 + }
  444 + else
  445 + {
  446 + Megaphone_Broadcast_OpusDecodeStatus(0);
  447 + }
  448 +
  449 + //如果存在存储情况
  450 + if (opusDecodeInfo->saveMode == 0x01)
  451 + {
  452 + //将解码得到的pcm文件存到指定路径
  453 + JZsdk_Osal_Rename(PCM_SAVE_FILE_NAME, opusDecodeInfo->outputFilePath);
  454 +
  455 + //刷新pcm文件列表
  456 + PcmFile_FlushList();
  457 + }
  458 +
  459 + free(opusDecodeInfo);
  460 +}
  461 +
  462 +
  463 +T_JZsdkReturnCode OpusFile_DecodeOpusAndSave(int SaveMode, unsigned char *InFile,unsigned char *OutFile)
  464 +{
  465 + T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
  466 +
  467 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  468 +
  469 + int i = 0;
  470 + while (i<=4 && g_Opus_decode_Flag == JZ_FLAGCODE_ON)
  471 + {
  472 + i++;
  473 + delayMs(50);
  474 + }
  475 + if(i == 4)
  476 + {
  477 + JZSDK_LOG_ERROR("超时,上一次opus仍在解码,无法开始新的解码");
  478 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  479 + }
  480 +
  481 + OpusDecodeFile *OpusDecodeFileInfo = (OpusDecodeFile *)OsalHandler->Malloc(sizeof(OpusDecodeFile));
  482 + if(OpusDecodeFileInfo == NULL)
  483 + {
  484 + JZSDK_LOG_ERROR("OpusDecodeFileInfo malloc failed");
  485 + return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
  486 + }
  487 +
  488 + memset(OpusDecodeFileInfo, sizeof(OpusDecodeFile), 0);
  489 + OpusDecodeFileInfo->saveMode = SaveMode;
  490 + memcpy(OpusDecodeFileInfo->inputFilePath, InFile, strlen(InFile));
  491 + memcpy(OpusDecodeFileInfo->outputFilePath, OutFile, strlen(OutFile));
  492 +
  493 + OsalHandler->TaskCreate("DecodeOpus", DecodeOpus_task1, 8192, (void *)OpusDecodeFileInfo, &g_DecodeOpus_task);
  494 +
  495 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
434 } 496 }
@@ -9,7 +9,6 @@ static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; //opus存储标志位 @@ -9,7 +9,6 @@ static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; //opus存储标志位
9 static int g_OpusSaveMode = JZ_FLAGCODE_OFF; //opus存储模式 off:不存储 on:存储 9 static int g_OpusSaveMode = JZ_FLAGCODE_OFF; //opus存储模式 off:不存储 on:存储
10 10
11 11
12 -#define OPUS_FILE_DIR "/root/sdcard/opus"  
13 #define OPUS_TEMP_SAVE_DIR "/root/test_audio.opus" 12 #define OPUS_TEMP_SAVE_DIR "/root/test_audio.opus"
14 static unsigned char opus_SaveFile[128]; 13 static unsigned char opus_SaveFile[128];
15 14
@@ -82,8 +81,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName, int decode @@ -82,8 +81,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName, int decode
82 else 81 else
83 { 82 {
84 g_OpusSaveMode = JZ_FLAGCODE_ON; 83 g_OpusSaveMode = JZ_FLAGCODE_ON;
85 - sprintf(opus_SaveFile, "%s/%s",OPUS_FILE_DIR, FileName);  
86 - JZSDK_LOG_INFO("上传的opus文件存储路径为:%s decode_rate:%d SampleRate:%d Channels:%d", opus_SaveFile, decode_rate, SampleRate, Channels); 84 + JZSDK_LOG_INFO("上传的opus文件名为:%s decode_rate:%d SampleRate:%d Channels:%d", opus_SaveFile, decode_rate, SampleRate, Channels);
87 } 85 }
88 86
89 if (g_OpusFile_SaveFp != NULL) 87 if (g_OpusFile_SaveFp != NULL)
@@ -207,6 +205,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo @@ -207,6 +205,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
207 default: 205 default:
208 { 206 {
209 JZSDK_LOG_ERROR("opus保存校验码类型错误"); 207 JZSDK_LOG_ERROR("opus保存校验码类型错误");
  208 + g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
210 ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 209 ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
211 } 210 }
212 break; 211 break;
@@ -234,37 +233,42 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo @@ -234,37 +233,42 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
234 * *********************************************************/ 233 * *********************************************************/
235 if (g_OpusSaveMode != JZ_FLAGCODE_OFF) 234 if (g_OpusSaveMode != JZ_FLAGCODE_OFF)
236 { 235 {
237 - //将临时的opus文件移动到指定的目录  
238 - ret = JZsdk_Osal_Rename(OPUS_TEMP_SAVE_DIR, opus_SaveFile);  
239 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
240 - {  
241 - JZSDK_LOG_ERROR("opus保存文件移动失败");  
242 - JZsdk_Osal_delete(OPUS_TEMP_SAVE_DIR);  
243 - g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;  
244 -  
245 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
246 - }  
247 -  
248 - //移动成功  
249 - JZsdk_Sync(); //同步文件系统  
250 - JZSDK_LOG_INFO("opus保存成功,刷新列表");  
251 - OpusFile_FlushList(); //刷新opus文件列表 236 + //将opus解码,并存储到指定目录
  237 + ret = OpusFile_DecodeOpusAndSave(g_OpusSaveMode ,g_OpusSaveMode, opus_SaveFile);
252 } 238 }
  239 +
  240 + // if (g_OpusSaveMode != JZ_FLAGCODE_OFF)
  241 + // {
  242 + // //将临时的opus文件移动到指定的目录
  243 + // ret = JZsdk_Osal_Rename(OPUS_TEMP_SAVE_DIR, opus_SaveFile);
  244 + // if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  245 + // {
  246 + // JZSDK_LOG_ERROR("opus保存文件移动失败");
  247 + // JZsdk_Osal_delete(OPUS_TEMP_SAVE_DIR);
  248 + // g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
  249 +
  250 + // return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  251 + // }
  252 +
  253 + // //移动成功
  254 + // JZsdk_Sync(); //同步文件系统
  255 + // JZSDK_LOG_INFO("opus保存成功,刷新列表");
  256 + // OpusFile_FlushList(); //刷新opus文件列表
  257 + // }
253 /******************************************************************** 258 /********************************************************************
254 * 259 *
255 - *  
256 * 如果不进行额存储,则进行一次opus解码 260 * 如果不进行额存储,则进行一次opus解码
257 * 261 *
258 * 262 *
259 /********************************************************************/ 263 /********************************************************************/
260 else 264 else
261 { 265 {
262 - OpusFile_DecodeOpus(OPUS_TEMP_SAVE_DIR); 266 + ret = OpusFile_DecodeOpus(OPUS_TEMP_SAVE_DIR);
263 } 267 }
264 268
265 JZSDK_LOG_INFO("opus_save_end"); 269 JZSDK_LOG_INFO("opus_save_end");
266 270
267 g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; 271 g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
268 272
269 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 273 + return ret;
270 } 274 }
@@ -659,6 +659,53 @@ T_JZsdkReturnCode UIcontrol_Opus_PlayFixedFile(int DeviceName) @@ -659,6 +659,53 @@ T_JZsdkReturnCode UIcontrol_Opus_PlayFixedFile(int DeviceName)
659 #endif 659 #endif
660 } 660 }
661 661
  662 +
  663 +//播放固定位置的录音opus录音喊话
  664 +T_JZsdkReturnCode UIcontrol_Pcm_PlayListFile(int DeviceName, unsigned char *Filename, unsigned int NameLen)
  665 +{
  666 + JZSDK_LOG_INFO("调用了list播放");
  667 +
  668 +#ifdef MEGAPHONE_CONFIG_STATUS_ON
  669 + //调用喊话器的接口
  670 + T_JZsdkReturnCode ret = Megaphone_PlayPcmListFile(Filename, NameLen);
  671 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  672 + {
  673 + printf("%s:%s\n",UI_CONTROL_ERROR,JZsdk_GetReturnCodeMessage(ret));
  674 + return ret;
  675 + }
  676 +
  677 + delayMs(10);
  678 +
  679 + //获取播放状态
  680 + int PlayStatus;
  681 + Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_PLAY_STATUS, &PlayStatus);
  682 +
  683 + //通知其他设备的ui界面变化
  684 + //如果4G模块有启动
  685 + if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
  686 + {
  687 + HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
  688 + }
  689 + //如果设备1有启动
  690 + if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
  691 + {
  692 + HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
  693 + }
  694 + //如果设备2有启动
  695 + if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
  696 + {
  697 + HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
  698 + }
  699 + //如果psdk接口已经使用
  700 + if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
  701 + {
  702 + JZsdk_Psdk_UI_io_Reply_PlayStatus(PlayStatus);
  703 + }
  704 +
  705 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  706 +#endif
  707 +}
  708 +
662 /**************************************************************************************************************************************** 709 /****************************************************************************************************************************************
663 * 710 *
664 * TTS相关 711 * TTS相关
@@ -50,6 +50,7 @@ T_JZsdkReturnCode UIcontrol_OpusRealTimeVoice_Close(int DeviceName); @@ -50,6 +50,7 @@ T_JZsdkReturnCode UIcontrol_OpusRealTimeVoice_Close(int DeviceName);
50 50
51 //opus类 51 //opus类
52 T_JZsdkReturnCode UIcontrol_Opus_PlayFixedFile(int DeviceName); 52 T_JZsdkReturnCode UIcontrol_Opus_PlayFixedFile(int DeviceName);
  53 +T_JZsdkReturnCode UIcontrol_Pcm_PlayListFile(int DeviceName, unsigned char *Filename, unsigned int NameLen);
53 T_JZsdkReturnCode UIcontrol_Broadcast_OpusDecodeStatus(int status); 54 T_JZsdkReturnCode UIcontrol_Broadcast_OpusDecodeStatus(int status);
54 55
55 //TTS类 56 //TTS类
@@ -63,7 +63,6 @@ @@ -63,7 +63,6 @@
63 int Opus_PlayMode=0;//0录音喊话 1实时喊话 63 int Opus_PlayMode=0;//0录音喊话 1实时喊话
64 64
65 int num_flag=0;//版本号信息 65 int num_flag=0;//版本号信息
66 -int Firstsong_flag = 0;//记录第一次播放 0为未曾播放过  
67 extern int height_Volume_lock; 66 extern int height_Volume_lock;
68 67
69 extern int SpeakerWidgetUseLock; 68 extern int SpeakerWidgetUseLock;
@@ -468,52 +467,30 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -468,52 +467,30 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
468 { 467 {
469 //JZsdk_Psdk_UI_io_LastSong(1); 468 //JZsdk_Psdk_UI_io_LastSong(1);
470 JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_LASTSONG, 0); 469 JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_LASTSONG, 0);
471 -  
472 - //记录为播放中  
473 - Firstsong_flag = 1;  
474 } 470 }
475 break; 471 break;
476 case 1://下一曲 472 case 1://下一曲
  473 + {
477 if(value==1) 474 if(value==1)
478 { 475 {
479 476
480 //JZsdk_Psdk_UI_io_NextSong(1); 477 //JZsdk_Psdk_UI_io_NextSong(1);
481 JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_NEXTSONG, 0); 478 JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_NEXTSONG, 0);
482 -  
483 - //记录为播放中  
484 - Firstsong_flag = 1;  
485 } 479 }
486 break; 480 break;
487 - case 2: // 播放\暂停 value为1 是三角控件 暂停 所以要去取反 481 + }
  482 + case 2: // 播放\暂停 value为1 是三角控件 暂停 所以要去取反
  483 + {
488 value = !value; 484 value = !value;
489 //如果为暂停 485 //如果为暂停
490 if (value == 0) 486 if (value == 0)
491 { 487 {
492 JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value); 488 JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);
493 -  
494 - USER_LOG_INFO("暂停播放");  
495 - }  
496 - else if (value == 1)  
497 - {  
498 - if (Firstsong_flag == 1) //如果已经处于音频库播放中  
499 - {  
500 - JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);  
501 -  
502 - USER_LOG_INFO("继续播放");  
503 - }  
504 - //否则为 第一次播放音频  
505 - else  
506 - {  
507 - //播放当前音频  
508 - JZsdk_Psdk_UI_io_PlaySong(1);  
509 -  
510 - //记录为播放中  
511 - Firstsong_flag = 1;  
512 - USER_LOG_INFO("播放当前音频");  
513 - }  
514 } 489 }
515 490
516 - break; 491 + break;
  492 + }
  493 +
517 case 3://内显示音量 scale 494 case 3://内显示音量 scale
518 { 495 {
519 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value); 496 JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value);