正在显示
18 个修改的文件
包含
772 行增加
和
306 行删除
| @@ -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 |
Module/Megaphone/PcmAudio/PcmAudioFile.h
0 → 100644
| 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 |
Module/Megaphone/PcmAudio/PcmAudioPlay.c
0 → 100644
| 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, &lifier); | ||
| 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, &lifier); | ||
| 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); |
-
请 注册 或 登录 后发表评论