作者 ookk303

将opus列表改成了pcm列表

... ... @@ -109,7 +109,9 @@
"jzsdk_errorcodedef.h": "c",
"jzsdk_timer.h": "c",
"jzsdk_framecomparsion_6aframe.h": "c",
"jzsdk_uart.h": "c"
"jzsdk_uart.h": "c",
"audiomange.h": "c",
"pcmaudiofile.h": "c"
},
"Codegeex.GenerationPreference": "automatic",
"C_Cpp.dimInactiveRegions": false
... ...
... ... @@ -122,7 +122,10 @@ typedef enum {
JZ_INSCODE_5AFRAME_OPUS_PLAY = 0x10000910, //opus播放
JZ_INSCODE_5AFRAME_OPUS_GETOPUSLIST = 0x10000911, //获取opus列表
JZ_INSCODE_5AFRAME_PCM_PLAY = 0x10000920, //pcm播放
JZ_INSCODE_5AFRAME_PCM_GETPCMLIST = 0x10000930, //获pcm列表
JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_START = 0x10000A00, //开启opus实时语音
JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_UNLIMIT_TRANSMISSION = 0x10000A01, //无限制传输opus实时语音
... ...
... ... @@ -333,9 +333,9 @@ static int Comparison_5AFRAME_FirstLevelCode_0x58(char *getdata)
return JZ_INSCODE_5AFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE;
break;
//获取opus列表
//获取pcm列表
case 0x10:
return JZ_INSCODE_5AFRAME_OPUS_GETOPUSLIST;
return JZ_INSCODE_5AFRAME_PCM_GETPCMLIST;
break;
default:
... ... @@ -348,6 +348,10 @@ static int Comparison_5AFRAME_FirstLevelCode_0x59(char *getdata)
//二级功能位
switch (getdata[8])
{
case 0x10:
return JZ_INSCODE_5AFRAME_OPUS_PLAY;
break;
//opus录音传输
//opus传输开始
case 0xF1:
... ...
... ... @@ -24,6 +24,8 @@
#include "Megaphone/Megaphone.h"
#include "Megaphone/Music/AudioFile/Megaphone_AudioFile.h"
#include "Megaphone/Opus/Megaphone_Opus.h"
#include "Megaphone/PcmAudio/PcmAudioFile.h"
#endif
static int HalRecvMode = JZ_FLAGCODE_OFF; //接收模式,主要是为了限制不同设备同时要求hal层做出 同一个数据接收相关功能 ,目前做法是只限定一个hal设备使用一种数据接收模式
... ... @@ -705,15 +707,24 @@ static T_JZsdkReturnCode RecvDeal_audio_PlayFile(int Port, char *getbuf)
**********/
static T_JZsdkReturnCode RecvDeal_audio_PlayContinue(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,音频继续播放",JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
UIcontrol_ContinuePlayAudio(Port);
ret = UIcontrol_ContinuePlayAudio(Port);
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作成功
HalSend_type1Send_Reply_Success(Port, FrameSequence);
}
else
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -1581,13 +1592,13 @@ static T_JZsdkReturnCode RecvDeal_Delete_Audio(int Port, char *getbuf)
/*********
*
* 删除录音
* 删除pcm文件
*
*
**********/
static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf)
{
JZSDK_LOG_INFO("%s,删除opus录音操作",JZsdk_DefineCode_GetPortName(Port));
JZSDK_LOG_INFO("%s,删除pcm文件操作",JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
... ... @@ -1603,7 +1614,7 @@ static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf)
//3、拼接指令
char FilePath[512];
snprintf(FilePath, 512 ,"/root/sdcard/opus/%s", FileName);
snprintf(FilePath, 512 ,"/root/sdcard/pcm/%s", FileName);
//4、删除文件
JZsdk_Osal_delete(FilePath);
... ... @@ -1612,7 +1623,7 @@ static T_JZsdkReturnCode RecvDeal_Delete_VoiceRecord(int Port, char *getbuf)
//4、刷新歌曲列表
#ifdef MEGAPHONE_CONFIG_STATUS_ON
OpusFile_FlushList();
PcmFile_FlushList();
#endif
//回复操作成功
... ... @@ -1722,10 +1733,10 @@ static T_JZsdkReturnCode RecvDeal_Rename_VoiceRecord(int Port, char *getbuf)
//3、拼接出地址
char OldFilePath[JZSDK_FILE_PATH_SIZE_MAX];
snprintf(OldFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/opus/%s", OldFileName);
snprintf(OldFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/pcm/%s", OldFileName);
char NewFilePath[JZSDK_FILE_PATH_SIZE_MAX];
snprintf(NewFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/opus/%s", NewFileName);
snprintf(NewFilePath, JZSDK_FILE_PATH_SIZE_MAX ,"/root/sdcard/pcm/%s", NewFileName);
JZsdk_Osal_Rename(OldFilePath, NewFilePath);
... ... @@ -1733,7 +1744,7 @@ static T_JZsdkReturnCode RecvDeal_Rename_VoiceRecord(int Port, char *getbuf)
//4、刷新歌曲列表
#ifdef MEGAPHONE_CONFIG_STATUS_ON
OpusFile_FlushList();
PcmFile_FlushList();
#endif
//回复操作成功
... ... @@ -2371,6 +2382,8 @@ static T_JZsdkReturnCode RecvDeal_OpusTrans_stop_and_check(int Port, char *getbu
**********/
static T_JZsdkReturnCode RecvDeal_OpusPlay(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,opus播放",JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
... ... @@ -2385,139 +2398,15 @@ static T_JZsdkReturnCode RecvDeal_OpusPlay(int Port, char *getbuf)
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//获取命令
int Mode = getbuf[9];
if (Mode == 0)
{
UIcontrol_Opus_PlayFixedFile(Port);
//回复操作成功
HalSend_type1Send_Reply_Success(Port, FrameSequence);
}
else if (Mode == 1)
{
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**********************************
*
* opus列表查询
*
*
* **********************************/
static T_JZsdkReturnCode RecvDeal_Get_OpusList(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,opus列表查询",JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
#ifdef MEGAPHONE_CONFIG_STATUS_ON
//刷新opus列表
OpusFile_FlushList();
//获取opus总数
int OpusFileCount = OpusFile_GetListNum();
//注册一个opus数组
unsigned char **MusicName = (unsigned char **)malloc(OpusFileCount * sizeof(unsigned char*));
if (MusicName == NULL)
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//注册一个歌曲名字长度的数组
int *MusicNameLength = (int *)malloc(OpusFileCount * sizeof(int));
if (MusicNameLength == NULL)
{
free(MusicName);
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//为每一首opus分配内存
for (int i = 0; i < OpusFileCount; i++)
{
MusicName[i] = (unsigned char*)malloc(128 * sizeof(unsigned char));
if (MusicName[i] == NULL)
{
// 内存分配失败,需要释放之前分配的内存
for (int j = 0; j < i; j++)
{
free(MusicName[j]);
}
free(MusicNameLength);
free(MusicName);
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
memset(MusicName[i], 0, 128 * sizeof(unsigned char));
//如果成功分配内存,则写入名字
Megaphone_OpusFile_GetAudioNameByIndex(i, MusicName[i], &MusicNameLength[i]);
}
JZSDK_LOG_DEBUG("opus列表取出完成");
//发送开始帧
ret = HalSend_type1Send_Send_OpusList_Start(Port, FrameSequence, OpusFileCount);
for (int i = 0; i < OpusFileCount; i++)
{
//获取歌曲详细信息
struct AudioMange_audio_struct AudioDetailMessage;
memset(&AudioDetailMessage, 0, sizeof(struct AudioMange_audio_struct));
ret = OpusFile_GetAudioInfo(MusicName[i], MusicNameLength[i],&AudioDetailMessage);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
continue;
}
//发送opus列表
ret = HalSend_type1Send_Send_OpusList_Trans(Port, FrameSequence, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen, AudioDetailMessage.FileSize, AudioDetailMessage.Time);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
continue;
}
}
//释放存储的数据
for (int i = 0; i < OpusFileCount; i++)
{
free(MusicName[i]);
}
free(MusicNameLength);
free(MusicName);
//发送结束帧
ret = HalSend_type1Send_Send_OpusList_Stop(Port, FrameSequence);
#else
JZSDK_LOG_ERROR("非喊话器不支持opus列表");
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
#endif
}
/*********
*
* 开启opus实时喊话 功能
... ... @@ -2639,6 +2528,178 @@ static T_JZsdkReturnCode RecvDeal_Opus_RealTimeVoice_stop(int Port, char *getbuf
/*******************************************************************************************************************************
*
* pcm部分
*
* *******************************************************************************************************************************/
/*********************************
*
* PCM播放
*
*
* **********************************/
static T_JZsdkReturnCode RecvDeal_PCM_Play(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s, PCM播放",JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
//分析pcm文件名
unsigned char PcmName[128];
unsigned int PcmNameLen = JZsdk_Get_FrameLength(getbuf) - 9 - 2;
if (PcmNameLen > 128)
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
memset(PcmName, 0, sizeof(PcmName));
memcpy(PcmName, &getbuf[10], PcmNameLen);
ret = UIcontrol_Pcm_PlayListFile(Port, PcmName, PcmNameLen);
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作成功
HalSend_type1Send_Reply_Success(Port, FrameSequence);
}
else
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/**********************************
*
* pcm列表查询
*
*
* **********************************/
static T_JZsdkReturnCode RecvDeal_Get_PcmList(int Port, char *getbuf)
{
T_JZsdkReturnCode ret;
JZSDK_LOG_INFO("%s,pcm列表查询",JZsdk_DefineCode_GetPortName(Port));
//获取帧的序列号
int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
#ifdef MEGAPHONE_CONFIG_STATUS_ON
//刷新pcm列表
PcmFile_FlushList();
//获取opus总数
int PcmFileCount = PcmFile_GetListNum();
//注册一个opus数组
unsigned char **MusicName = (unsigned char **)malloc(PcmFileCount * sizeof(unsigned char*));
if (MusicName == NULL)
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//注册一个歌曲名字长度的数组
int *MusicNameLength = (int *)malloc(PcmFileCount * sizeof(int));
if (MusicNameLength == NULL)
{
free(MusicName);
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//为每一首opus分配内存
for (int i = 0; i < PcmFileCount; i++)
{
MusicName[i] = (unsigned char*)malloc(128 * sizeof(unsigned char));
if (MusicName[i] == NULL)
{
// 内存分配失败,需要释放之前分配的内存
for (int j = 0; j < i; j++)
{
free(MusicName[j]);
}
free(MusicNameLength);
free(MusicName);
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
memset(MusicName[i], 0, 128 * sizeof(unsigned char));
//如果成功分配内存,则写入名字
Megaphone_PcmFile_GetAudioNameByIndex(i, MusicName[i], &MusicNameLength[i]);
}
JZSDK_LOG_DEBUG("pcm列表取出完成");
//发送开始帧
ret = HalSend_type1Send_Send_OpusList_Start(Port, FrameSequence, PcmFileCount);
for (int i = 0; i < PcmFileCount; i++)
{
//获取歌曲详细信息
struct AudioMange_audio_struct AudioDetailMessage;
memset(&AudioDetailMessage, 0, sizeof(struct AudioMange_audio_struct));
ret = PcmFile_GetAudioInfo(MusicName[i], MusicNameLength[i],&AudioDetailMessage);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
continue;
}
//发送opus列表
ret = HalSend_type1Send_Send_OpusList_Trans(Port, FrameSequence, AudioDetailMessage.FileName, AudioDetailMessage.FileNameLen, AudioDetailMessage.FileSize, AudioDetailMessage.Time);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
continue;
}
}
//释放存储的数据
for (int i = 0; i < PcmFileCount; i++)
{
free(MusicName[i]);
}
free(MusicNameLength);
free(MusicName);
//发送结束帧
ret = HalSend_type1Send_Send_OpusList_Stop(Port, FrameSequence);
#else
JZSDK_LOG_ERROR("非喊话器不支持pcm列表");
//回复操作失败
HalSend_type1Send_Reply_Failure(Port, FrameSequence);
#endif
}
/*******************************************************************************************************************************
*
* 云台部分
*
* *******************************************************************************************************************************/
... ... @@ -4511,12 +4572,6 @@ static T_JZsdkReturnCode RecvDeal_InstructInput(int Port, int Receive_mode, unsi
return 0;
break;
//获取opus列表
case JZ_INSCODE_5AFRAME_OPUS_GETOPUSLIST:
RecvDeal_Get_OpusList(Port,getbuf);
return 0;
break;
//开启opus实时喊话
case JZ_INSCODE_5AFRAME_OPUS_REALTIMEVOICE_START:
RecvDeal_Opus_RealTimeVoice_start(Port,getbuf);
... ... @@ -4535,6 +4590,18 @@ static T_JZsdkReturnCode RecvDeal_InstructInput(int Port, int Receive_mode, unsi
return 0;
break;
//PCM播放
case JZ_INSCODE_5AFRAME_PCM_PLAY:
RecvDeal_PCM_Play(Port,getbuf);
return 0;
break;
//获取Pcm列表
case JZ_INSCODE_5AFRAME_PCM_GETPCMLIST:
RecvDeal_Get_PcmList(Port,getbuf);
return 0;
break;
//云台控制
case JZ_INSCODE_5AFRAME_GIMBAL_PITCH_CONTROL:
RecvDeal_Gimbal_PitchControl(Port,getbuf);
... ...
... ... @@ -28,8 +28,6 @@ struct pcm_AlsaInfo
int dealFlag; //处理标志位,用于避免卡死
}pcm_AlsaInfo;
extern T_JZsdkReturnCode g_AudioDealPauseFlag;
/**********
*
* 参数初始化
... ... @@ -360,7 +358,7 @@ T_JZsdkReturnCode Pcm_AlsaPlay(struct AudioDealInfo *IndexInfo, unsigned char *b
AlsaWaitPlayEnd(AlsaInfo);
//暂停播放
while(g_AudioDealPauseFlag)
while(AudioDeal_GetPauseAndContinuePlayStatus() == JZ_FLAGCODE_ON)
{
delayMs(1);
}
... ...
... ... @@ -221,6 +221,18 @@ T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status)
g_AudioDealPauseFlag = status;
}
/*******************
*
* 获取音频暂停状态
* jzon 为暂停播放
* jzoff 为继续播放
*
* *********************/
int AudioDeal_GetPauseAndContinuePlayStatus()
{
return g_AudioDealPauseFlag;
}
/***************************
*
* 音频文件数据接入接口
... ...
... ... @@ -96,7 +96,10 @@ T_JZsdkReturnCode AudioDeal_FilePlayInput(unsigned char *FilePath);
T_JZsdkReturnCode AudioDeal_ResampleRest(unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format);
T_JZsdkReturnCode AudioFile_Stream_DataInput(AVFrame *frame);
T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer, int bytesRead);
T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status);
int AudioDeal_GetPauseAndContinuePlayStatus();
T_JZsdkReturnCode Get_AudioDealStatus();
T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode);
T_JZsdkReturnCode AudioDeal_Mp3DataStop();
... ...
... ... @@ -24,6 +24,8 @@
#include "Megaphone/Music/AudioFile/Megaphone_AudioFile.h"
#include "Megaphone/Music/RealTimeMP2/Megaphone_RealTimeMP2.h"
#include "Megaphone/opus/Megaphone_Opus.h"
#include "Megaphone/PcmAudio/PcmAudioFile.h"
int MegPlayStatusUnChange_flag = JZ_FLAGCODE_OFF;
static MegaphonePlayStatus g_Megaphone_Play_Status = AUDIO_PLAY_STATUS_IDLE;
... ... @@ -199,6 +201,14 @@ static T_JZsdkReturnCode Megaphone_Play(struct MegaphoneInfo *IndexInfo, enum Me
ret = OpusFile_PlayFixedFile();
}
case AUDIO_PLAY_STATUS_PCM_LIST:
{
JZSDK_LOG_INFO("音频播放:pcm列表");
//pcm播放
ret = PcmAudioPlay_Play(IndexInfo->str, IndexInfo->str_len);
}
default:
break;
}
... ... @@ -606,9 +616,27 @@ T_JZsdkReturnCode Megaphone_Broadcast_OpusDecodeStatus(int status)
**********/
T_JZsdkReturnCode Megaphone_Opus_PlayFixedFile()
{
memset(g_MegaphoneInfo, 0, sizeof(struct MegaphoneInfo));
g_MegaphoneInfo->str_len = 0;
return Megaphone_Play(g_MegaphoneInfo, AUDIO_PLAY_STATUS_OPUS_RECORD, JZ_FLAGCODE_ON);
}
/*********
*
* 1、播放list列表的pcm音频
*
*
**********/
T_JZsdkReturnCode Megaphone_PlayPcmListFile(unsigned char *Filename,int len)
{
memset(g_MegaphoneInfo, 0, sizeof(struct MegaphoneInfo));
memcpy(g_MegaphoneInfo->str, Filename, len);
g_MegaphoneInfo->str_len = len;
return Megaphone_Play(g_MegaphoneInfo, AUDIO_PLAY_STATUS_PCM_LIST, JZ_FLAGCODE_ON);
}
/*
*
* 2、存储opus文件开始
... ... @@ -860,8 +888,8 @@ T_JZsdkReturnCode Megaphone_Init()
//音频文件管理功能初始化
Megaphone_AudioFile_Init();
//opus列表初始化
Megaphone_OpusFile_Init();
//pcm列表初始化
Megaphone_PcmFile_Init();
//设置音量
Megaphone_SetVolume(30, 0);
... ... @@ -1031,9 +1059,28 @@ T_JZsdkReturnCode Megaphone_PlayContinue()
int ami =JZ_FLAGCODE_ON;
Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &ami);
AudioDeal_PauseAndContinuePlay(JZ_FLAGCODE_OFF);
//查看播放状态是否不处于停止
if (g_Megaphone_Play_Status == AUDIO_PLAY_STATUS_IDLE)
{
//播放当前音频
unsigned char CurrentName[128];
memset(CurrentName,0,sizeof(CurrentName));
unsigned int CurrentNameLen = 0;
unsigned int CurrentNum = 0;
AudioMange_Get_FilePlayName(CurrentName, &CurrentNameLen, &CurrentNum);
UIcontrol_PlayAudioFile(NO_SPECIFIED ,CurrentName, CurrentNameLen);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
else if (g_Megaphone_Play_Status == AUDIO_PLAY_STATUS_MUSIC)
{
AudioDeal_PauseAndContinuePlay(JZ_FLAGCODE_OFF);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
else
{
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
}
/***************
... ... @@ -1054,7 +1101,10 @@ T_JZsdkReturnCode Megaphone_PlayPause()
int ami =JZ_FLAGCODE_OFF;
Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &ami);
if (g_Megaphone_Play_Status == AUDIO_PLAY_STATUS_MUSIC)
{
AudioDeal_PauseAndContinuePlay(JZ_FLAGCODE_ON);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -1096,6 +1146,12 @@ static T_JZsdkReturnCode Megaphone_ConvertPlayStatus(int status)
return 0x40;
}
if (status == AUDIO_PLAY_STATUS_PCM_LIST)
{
return 0x50;
}
if (status == AUDIO_PLAY_STATUS_IDLE)
{
return 0x00;
... ...
... ... @@ -44,7 +44,7 @@ typedef enum MegaphonePlayStatus
AUDIO_PLAY_STATUS_OPUS_RECORD = 0x05, //opus录音
AUDIO_PLAY_STATUS_MP3_REAL_TIME = 0x06, //mp3实时语音
AUDIO_PLAY_STATUS_MP3_RECORD = 0x07, //mp3录音喊话
AUDIO_PLAY_STATUS_PCM_LIST =0x08, //pcm列表播放
}MegaphonePlayStatus;
typedef enum MegaphoneTTSParam
... ... @@ -128,6 +128,7 @@ T_JZsdkReturnCode Megaphone_SaveAudioFileTrans(char *SaveData, int size);
T_JZsdkReturnCode Megaphone_Broadcast_OpusDecodeStatus(int status);
T_JZsdkReturnCode Megaphone_SaveAudioFileStop(int checkFlag, unsigned char *CheckCode);
T_JZsdkReturnCode Megaphone_Opus_PlayFixedFile();
T_JZsdkReturnCode Megaphone_PlayPcmListFile(unsigned char *Filename,int len);
/********
*
... ...
... ... @@ -8,81 +8,81 @@
#include "JZsdkLib.h"
#include "Megaphone/AudioMange/AudioMange.h"
#define OPUS_DIR "/root/sdcard/opus"
#define PCM_DIR "/root/sdcard/pcm"
//创建一个opus节点
static struct AudioMange_Node *g_OpusList = NULL;
static struct AudioMange_Node *g_OpusListtail = NULL; // 用于跟踪链表的尾部
//创建一个pcm节点
static struct AudioMange_Node *g_PcmList = NULL;
static struct AudioMange_Node *g_PcmListtail = NULL; // 用于跟踪链表的尾部
static int g_OpusListNum = 0; //用于记录链表中的节点数量
static int g_OpusList_CurrentNum = 0; //用于记录链表中当前节点位置
static int g_PcmListNum = 0; //用于记录链表中的节点数量
static int g_PcmList_CurrentNum = 0; //用于记录链表中当前节点位置
/*****************
*
* 获取opus文件列表的歌曲数
* 获取pcm文件列表的歌曲数
*
* ************/
int OpusFile_GetListNum()
int PcmFile_GetListNum()
{
return g_OpusListNum;
return g_PcmListNum;
}
/*********
*
* opus文件链表注销
* pcm文件链表注销
*
**********/
static T_JZsdkReturnCode OpusFile_FreeAudioList()
static T_JZsdkReturnCode PcmFile_FreeAudioList()
{
//清空尾部指针
g_OpusListtail = NULL;
g_PcmListtail = NULL;
//清空歌曲数量
g_OpusListNum = 0; //记录链表中一共有几首歌
g_OpusList_CurrentNum = 0; //记录播放当前第几首歌
g_PcmListNum = 0; //记录链表中一共有几首歌
g_PcmList_CurrentNum = 0; //记录播放当前第几首歌
//释放掉整个链表
Jzsdk_Free_AndioMange_Node(&g_OpusList);
Jzsdk_Free_AndioMange_Node(&g_PcmList);
g_OpusList = NULL;
g_PcmList = NULL;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
*
* opus文件链表刷新
* pcm文件链表刷新
*
**********/
T_JZsdkReturnCode OpusFile_FlushList()
T_JZsdkReturnCode PcmFile_FlushList()
{
//读取audio文件夹,并将歌曲名放入音频列表
DIR *dir;
struct dirent *entry;
struct stat fileStat;
//创建一个临时opus节点
struct AudioMange_audio_struct OpusInfo;
//创建一个临时pcm节点
struct AudioMange_audio_struct PcmInfo;
T_JZsdkReturnCode ret;
//检查是否存在opus文件夹,没有则创建一个
if(JZsdk_check_directory_exists_posix(OPUS_DIR) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
//检查是否存在pcm文件夹,没有则创建一个
if(JZsdk_check_directory_exists_posix(PCM_DIR) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("不存在opus文件夹,创建一个");
JZsdk_Osal_Mkdir(OPUS_DIR);
JZSDK_LOG_ERROR("不存在pcm文件夹,创建一个");
JZsdk_Osal_Mkdir(PCM_DIR);
}
//确定音频文件夹存在
if ((dir = opendir(OPUS_DIR)) == NULL)
if ((dir = opendir(PCM_DIR)) == NULL)
{
JZSDK_LOG_ERROR("音频文件夹获取失败");
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
//查看歌曲存放链表是否有注册过
if (g_OpusList != NULL)
if (g_PcmList != NULL)
{
OpusFile_FreeAudioList();
PcmFile_FreeAudioList();
}
while ((entry = readdir(dir)) != NULL)
... ... @@ -109,44 +109,44 @@ T_JZsdkReturnCode OpusFile_FlushList()
//printf("获取到%s\n",filename);
// 检查后缀
if (JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".opus") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS
|| JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".OPUS") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS
if (JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".pcm") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS
|| JZsdk_strings_suffix_comparison_withLen((const unsigned char *)filename, len, (const unsigned char *)".PCM") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS
)
{
// 处理文件
memset(&OpusInfo, 0, sizeof(OpusInfo)); // 清除audioInfo结构
memset(&PcmInfo, 0, sizeof(PcmInfo)); // 清除audioInfo结构
//写入文件名
strncpy(OpusInfo.FileName, entry->d_name, JZSDK_FILE_NAME_SIZE_MAX);
strncpy(PcmInfo.FileName, entry->d_name, JZSDK_FILE_NAME_SIZE_MAX);
unsigned char fileDir [256];
snprintf(fileDir, sizeof(fileDir), "/root/sdcard/opus/%s", filename);
snprintf(fileDir, sizeof(fileDir), "%s/%s",PCM_DIR, filename);
//写入文件大小
JZsdk_Fs_ReadFileSize(fileDir, &(OpusInfo.FileSize));
JZsdk_Fs_ReadFileSize(fileDir, &(PcmInfo.FileSize));
//根据文件大小写入时长信息
//int temp_time = (OpusInfo.FileSize * 8) / (16000 * 16 * 1); #这条是pcm算时长,超准确
int temp_time = (OpusInfo.FileSize * 8) / (16000);
OpusInfo.Time = temp_time;
int temp_time = (PcmInfo.FileSize * 8) / (16000 * 16 * 1); //这条是pcm算时长,超准确
//int temp_time = (PcmInfo.FileSize * 8) / (16000); //这条是opus算时长,超准确
PcmInfo.Time = temp_time;
//写入文件名长度
OpusInfo.FileNameLen = len;
PcmInfo.FileNameLen = len;
// 创建新节点
struct AudioMange_Node *newNode = NULL;
ret = Jzsdk_Create_AndioMange_Node(&newNode, OpusInfo);
ret = Jzsdk_Create_AndioMange_Node(&newNode, PcmInfo) ;
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("存放音乐 %s 失败", entry->d_name);
JZSDK_LOG_ERROR("存放pcm节点 %s 失败", entry->d_name);
continue;
}
// 将新节点添加到链表末尾
Jzsdk_AddAudioNodeToCircularList(&g_OpusList, &g_OpusListtail, &newNode);
Jzsdk_AddAudioNodeToCircularList(&g_PcmList, &g_PcmListtail, &newNode);
// 歌曲计数+1
g_OpusListNum++;
g_PcmListNum++;
}
}
}
... ... @@ -154,12 +154,12 @@ T_JZsdkReturnCode OpusFile_FlushList()
closedir(dir);
//设置默认播放歌曲
g_OpusList_CurrentNum = 0;
g_PcmList_CurrentNum = 0;
//打印一遍已加载的音乐
JZsdk_PrintfAuidoNode_AudioList(g_OpusList);
JZsdk_PrintfAuidoNode_AudioList(g_PcmList);
JZSDK_LOG_INFO("刷新opus列表已完成");
JZSDK_LOG_INFO("刷新pcm列表已完成");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -172,27 +172,27 @@ T_JZsdkReturnCode OpusFile_FlushList()
*
*
* *********************************/
T_JZsdkReturnCode Megaphone_OpusFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len)
T_JZsdkReturnCode Megaphone_PcmFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len)
{
T_JZsdkReturnCode ret ;
//判断歌曲列表是否有歌
if (g_OpusListNum == 0)
if (g_PcmListNum == 0)
{
JZSDK_LOG_INFO("opus列表中没有歌");
JZSDK_LOG_INFO("pcm列表中没有歌");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//判断序号是否在数量内
if (index > g_OpusListNum)
if (index > g_PcmListNum)
{
JZSDK_LOG_INFO("opus列表中没有第%d首歌",index);
JZSDK_LOG_INFO("pcm列表中没有第%d首歌",index);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//根据当前的索引值,获取当前的歌曲节点
struct AudioMange_Node *Current = NULL;
ret = getAudioMange_NodeAtIndex(g_OpusList, &Current, index);
ret = getAudioMange_NodeAtIndex(g_PcmList, &Current, index);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
return ret;
... ... @@ -209,15 +209,39 @@ T_JZsdkReturnCode Megaphone_OpusFile_GetAudioNameByIndex(int index, unsigned cha
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/***********
*
* 查询pcm是否存在于列表
*
* **********/
T_JZsdkReturnCode Megaphone_PcmFile_IsExistInList(unsigned char *str, unsigned int str_len)
{
T_JZsdkReturnCode ret;
//1、查询该名字是否存在于音乐列表中
struct AudioMange_audio_struct songToFind;
memset(&songToFind, 0, sizeof(struct AudioMange_audio_struct));
memset(songToFind.FileName, 0 ,sizeof(songToFind.FileName));
memcpy(songToFind.FileName, str, str_len);
ret = JZsdk_isSongInAudioList(g_PcmList, songToFind);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("播放文件不存在于pcm列表 %s", songToFind.FileName);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*****************
*
* 查询opus信息
* 查询pcm信息
*
*
* **************/
T_JZsdkReturnCode OpusFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind)
T_JZsdkReturnCode PcmFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind)
{
T_JZsdkReturnCode ret;
... ... @@ -225,29 +249,29 @@ T_JZsdkReturnCode OpusFile_GetAudioInfo(unsigned char *str, unsigned int str_len
memset(songToFind->FileName, 0 ,sizeof(songToFind->FileName));
memcpy(songToFind->FileName, str, str_len);
ret = JZsdk_isSongInAudioList(g_OpusList, (*songToFind));
ret = JZsdk_isSongInAudioList(g_PcmList, (*songToFind));
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("播放文件不存在于opus列表 %s", songToFind->FileName);
JZSDK_LOG_ERROR("播放文件不存在于pcm列表 %s", songToFind->FileName);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
//2、获取歌曲信息
JZsdk_GetSongInDudioList_AudioInfo(g_OpusList, songToFind);
JZsdk_GetSongInDudioList_AudioInfo(g_PcmList, songToFind);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*********
*
* opus文件初始化
* pcm文件初始化
*
**********/
T_JZsdkReturnCode Megaphone_OpusFile_Init()
T_JZsdkReturnCode Megaphone_PcmFile_Init()
{
//刷新opus列表(用于加载新的opus文件)
OpusFile_FlushList();
//刷新pcm列表(用于加载新的pcm文件)
PcmFile_FlushList();
JZSDK_LOG_DEBUG("opusFile Init Complete");
JZSDK_LOG_DEBUG("pcmFile Init Complete");
}
... ...
/**
********************************************************************
* @file OpusFile.h
* OpusFile.c OpusFileSave.c 的头文件
*
*********************************************************************
*/
/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
#ifndef OPUS_FILE_H
#define OPUS_FILE_H
/* Includes ------------------------------------------------------------------*/
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include "Megaphone/AudioMange/AudioMange_Param.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
/* 常亮定义*/
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
int PcmFile_GetListNum();
T_JZsdkReturnCode PcmFile_FlushList();
T_JZsdkReturnCode Megaphone_PcmFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len);
T_JZsdkReturnCode Megaphone_PcmFile_IsExistInList(unsigned char *str, unsigned int str_len);
T_JZsdkReturnCode PcmFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind);
T_JZsdkReturnCode Megaphone_PcmFile_Init();
T_JZsdkReturnCode PcmAudioPlay_Play(unsigned char *str, unsigned int str_len);
#ifdef __cplusplus
}
#endif
#endif
... ...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <dirent.h>
#include <sys/stat.h>
#include "JZsdkLib.h"
#include "Megaphone/PcmAudio/PcmAudioFile.h"
#include "Megaphone/Megaphone.h"
#define PCM_DIR "/root/sdcard/pcm"
static int g_opus_sampleRate = 16000; //解码采样率
typedef struct t_PcmParam{
unsigned char *FileName;
unsigned int FileSize;
}t_PcmParam;
static T_JZTaskHandle g_pcmplay_task = NULL;
static T_JZsdkReturnCode PcmPlay_Interface(t_PcmParam *PcmParam)
{
unsigned int nbBytes;
uint8_t cbits[3 * 1276];
int timeNum = 0;
int loop = JZ_FLAGCODE_OFF;
int loop_interval;
double total_duration = 0;
int last_printed_second = -1; // 上次打印的秒数,初始化为-1表示还没有打印过
FILE *Pcm_fp = fopen("%s/%s", "rb", PCM_DIR, PcmParam->FileName);
if (Pcm_fp == NULL)
{
JZSDK_LOG_ERROR("PcmPlay_Interface: fopen failed, file name = %s", PcmParam->FileName);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON)
{
nbBytes = fread(cbits, 1, 3 * 1276, Pcm_fp);
if(nbBytes > 0)
{
AudioDeal_PcmDataInput(g_opus_sampleRate, (unsigned char *)cbits, nbBytes);
}
int totalSamples = nbBytes / (2);
// 计算当前帧的持续时间(秒)
double frame_duration = (double)totalSamples / g_opus_sampleRate;
total_duration += frame_duration;
int current_second = (int)floor(total_duration); // 获取当前总时间的整数秒部分
if (current_second > last_printed_second)
{
printf("nb:%d rate:%d duration:%f total_duration:%f\n", totalSamples, g_opus_sampleRate, frame_duration, current_second);
//回传播放时间
Megaphone_PlayBackTime(current_second);
last_printed_second = current_second; // 更新上次打印的秒数
}
if (feof(Pcm_fp))
{
total_duration = 0;
last_printed_second = -1;
//如果循环播放没打开
Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP, &loop);
Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_LOOP_INTERVAL, &loop_interval);
if (loop == JZ_FLAGCODE_OFF)
{
timeNum = 0;
// //播放结束延迟
// while ((timeNum <=3000) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
// {
// delayMs(10);
// timeNum +=10;
// }
break;
}
//如果循环播放打开
else if (loop == JZ_FLAGCODE_ON)
{
timeNum = 0;
JZSDK_LOG_INFO("循环播放pcm");
// //播放结束延迟
// while ((loop == 1) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
// {
// delayMs(10);
// timeNum +=10;
// }
//重置文件光标 继续播放
fseek(Pcm_fp, 0, SEEK_SET);
//循环播放延时
while (loop_interval > 0 && (loop == JZ_FLAGCODE_ON) && (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON))
{
delayMs(50);
loop_interval -= 50;
}
continue;
}
}
}
fclose(Pcm_fp);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
*
* 播放固定位置pcm线程
*
*/
static void *Pcm_Play_task(void *arg)
{
Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_ON);
//广播开始
Megaphone_status_Broadcast(AUDIO_PLAY_STATUS_PCM_LIST);
int amplifier = JZ_FLAGCODE_ON;
Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
t_PcmParam *PcmParam = (t_PcmParam *)arg;
PcmPlay_Interface(PcmParam);
amplifier = JZ_FLAGCODE_OFF;
Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
//广播关闭
Megaphone_status_Broadcast(JZ_FLAGCODE_OFF);
}
T_JZsdkReturnCode PcmAudioPlay_Play(unsigned char *str, unsigned int str_len)
{
T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
T_JZsdkReturnCode ret;
ret = Megaphone_PcmFile_IsExistInList(str, str_len);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("PcmAudioPlay_Play: Megaphone_PcmFile_IsExistInList failed, ret = %d", ret);
return ret;
}
t_PcmParam *PcmParam = (t_PcmParam *)malloc(sizeof(t_PcmParam));
PcmParam->FileName = str;
PcmParam->FileSize = str_len;
//播放
OsalHandler->TaskCreate("PiayPcmFile", Pcm_Play_task, 8192, PcmParam, &g_pcmplay_task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -24,17 +24,10 @@ extern "C" {
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
int OpusFile_GetListNum();
T_JZsdkReturnCode Megaphone_OpusFile_GetAudioNameByIndex(int index, unsigned char *name, int *name_len);
T_JZsdkReturnCode OpusFile_GetAudioInfo(unsigned char *str, unsigned int str_len, struct AudioMange_audio_struct *songToFind);
T_JZsdkReturnCode Megaphone_OpusFile_Init();
T_JZsdkReturnCode OpusFile_FlushList();
T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile);
T_JZsdkReturnCode OpusFile_PlayFixedFile();
int OpusFile_GetSaveFlag(void);
T_JZsdkReturnCode OpusFile_PlayFixedFile();
T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile);
T_JZsdkReturnCode OpusFile_DecodeOpusAndSave(int SaveMode, unsigned char *InFile,unsigned char *OutFile);
T_JZsdkReturnCode OpusFile_SetDecodeBitrate(int bitrate);
T_JZsdkReturnCode OpusFile_SetDecodeChannels(int channels);
... ...
... ... @@ -6,6 +6,7 @@
#include "BaseConfig.h"
#include "AudioDeal/AudioDeal.h"
#include "Megaphone/PcmAudio/PcmAudioFile.h"
#include "opus.h"
... ... @@ -13,6 +14,7 @@
#define OPUS_CHANNELS (1)
#define OPUS_MAX_PACKET_SIZE (3 * 1276)
#define PCM_SAVE_FILE_NAME "/root/save.pcm" //用于保存的pcm
#define PCM_PLAY_FILE_NAME "/root/test_audio.pcm" //用于播放的pcm
static int g_opus_decodeBitrate = 16000; //解码码率
... ... @@ -24,6 +26,14 @@ static int g_Opus_decode_Flag = JZ_FLAGCODE_OFF; //opus的解码标志位
static T_JZTaskHandle g_DecodeOpus_task = NULL;
static T_JZTaskHandle g_OpusPlay_task = NULL;
typedef struct OpusDecodeFile
{
unsigned char inputFilePath[JZSDK_FILE_PATH_SIZE_MAX];
unsigned char outputFilePath[JZSDK_FILE_PATH_SIZE_MAX];
int saveMode;
}OpusDecodeFile;
T_JZsdkReturnCode OpusFile_SetDecodeBitrate(int bitrate)
{
g_opus_decodeBitrate = bitrate;
... ... @@ -208,27 +218,6 @@ T_JZsdkReturnCode OpusFile_PlayFixedFile()
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*******************************
*
* 播放opus列表的音乐
* 旧接口,无需定位传入的位置
*
************************************/
T_JZsdkReturnCode OpusFile_PlayListFile(unsigned char *OpusFile)
{
T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
//检测歌曲是否在列表中
//OsalHandler->TaskCreate("PiayFilexdFile", PlayFixedFile_task, 8192, NULL, &g_DecodeOpus_task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*************************************************************************************************************/
/*
... ... @@ -237,7 +226,7 @@ T_JZsdkReturnCode OpusFile_PlayListFile(unsigned char *OpusFile)
*/
static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile)
static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile, unsigned char *SaveFile)
{
FILE *fin = NULL;
FILE *fout = NULL;
... ... @@ -273,7 +262,7 @@ static T_JZsdkReturnCode OpusDecodeFun(unsigned char *OpusFile)
}
//创建一个opus输出文件
fout = fopen(PCM_PLAY_FILE_NAME, "w");
fout = fopen(SaveFile, "w");
if (fout == NULL) {
JZSDK_LOG_ERROR("创建opus输出文件失败");
goto DecodeFinsh;
... ... @@ -372,7 +361,7 @@ static void *DecodeOpus_task(void *arg)
{
unsigned char *opusFile = (unsigned char *)arg;
T_JZsdkReturnCode ret = OpusDecodeFun(opusFile);
T_JZsdkReturnCode ret = OpusDecodeFun(opusFile, PCM_PLAY_FILE_NAME);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//广播解码失败
... ... @@ -432,3 +421,76 @@ T_JZsdkReturnCode OpusFile_DecodeOpus(unsigned char *opusFile)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*******************
*
* opus解码线程
*
*******************/
static void *DecodeOpus_task1(void *arg)
{
OpusDecodeFile *opusDecodeInfo = (OpusDecodeFile *)arg;
T_JZsdkReturnCode ret = OpusDecodeFun(opusDecodeInfo->inputFilePath, PCM_SAVE_FILE_NAME);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
//广播解码失败
Megaphone_Broadcast_OpusDecodeStatus(1);
}
else
{
Megaphone_Broadcast_OpusDecodeStatus(0);
}
//如果存在存储情况
if (opusDecodeInfo->saveMode == 0x01)
{
//将解码得到的pcm文件存到指定路径
JZsdk_Osal_Rename(PCM_SAVE_FILE_NAME, opusDecodeInfo->outputFilePath);
//刷新pcm文件列表
PcmFile_FlushList();
}
free(opusDecodeInfo);
}
T_JZsdkReturnCode OpusFile_DecodeOpusAndSave(int SaveMode, unsigned char *InFile,unsigned char *OutFile)
{
T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
int i = 0;
while (i<=4 && g_Opus_decode_Flag == JZ_FLAGCODE_ON)
{
i++;
delayMs(50);
}
if(i == 4)
{
JZSDK_LOG_ERROR("超时,上一次opus仍在解码,无法开始新的解码");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
OpusDecodeFile *OpusDecodeFileInfo = (OpusDecodeFile *)OsalHandler->Malloc(sizeof(OpusDecodeFile));
if(OpusDecodeFileInfo == NULL)
{
JZSDK_LOG_ERROR("OpusDecodeFileInfo malloc failed");
return JZ_ERROR_SYSTEM_MODULE_CODE_MEMORY_ALLOC_FAILED;
}
memset(OpusDecodeFileInfo, sizeof(OpusDecodeFile), 0);
OpusDecodeFileInfo->saveMode = SaveMode;
memcpy(OpusDecodeFileInfo->inputFilePath, InFile, strlen(InFile));
memcpy(OpusDecodeFileInfo->outputFilePath, OutFile, strlen(OutFile));
OsalHandler->TaskCreate("DecodeOpus", DecodeOpus_task1, 8192, (void *)OpusDecodeFileInfo, &g_DecodeOpus_task);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
\ No newline at end of file
... ...
... ... @@ -9,7 +9,6 @@ static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; //opus存储标志位
static int g_OpusSaveMode = JZ_FLAGCODE_OFF; //opus存储模式 off:不存储 on:存储
#define OPUS_FILE_DIR "/root/sdcard/opus"
#define OPUS_TEMP_SAVE_DIR "/root/test_audio.opus"
static unsigned char opus_SaveFile[128];
... ... @@ -82,8 +81,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName, int decode
else
{
g_OpusSaveMode = JZ_FLAGCODE_ON;
sprintf(opus_SaveFile, "%s/%s",OPUS_FILE_DIR, FileName);
JZSDK_LOG_INFO("上传的opus文件存储路径为:%s decode_rate:%d SampleRate:%d Channels:%d", opus_SaveFile, decode_rate, SampleRate, Channels);
JZSDK_LOG_INFO("上传的opus文件名为:%s decode_rate:%d SampleRate:%d Channels:%d", opus_SaveFile, decode_rate, SampleRate, Channels);
}
if (g_OpusFile_SaveFp != NULL)
... ... @@ -207,6 +205,7 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
default:
{
JZSDK_LOG_ERROR("opus保存校验码类型错误");
g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
break;
... ... @@ -234,37 +233,42 @@ T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCo
* *********************************************************/
if (g_OpusSaveMode != JZ_FLAGCODE_OFF)
{
//将临时的opus文件移动到指定的目录
ret = JZsdk_Osal_Rename(OPUS_TEMP_SAVE_DIR, opus_SaveFile);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("opus保存文件移动失败");
JZsdk_Osal_delete(OPUS_TEMP_SAVE_DIR);
g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
//将opus解码,并存储到指定目录
ret = OpusFile_DecodeOpusAndSave(g_OpusSaveMode ,g_OpusSaveMode, opus_SaveFile);
}
//移动成功
JZsdk_Sync(); //同步文件系统
JZSDK_LOG_INFO("opus保存成功,刷新列表");
OpusFile_FlushList(); //刷新opus文件列表
}
// if (g_OpusSaveMode != JZ_FLAGCODE_OFF)
// {
// //将临时的opus文件移动到指定的目录
// ret = JZsdk_Osal_Rename(OPUS_TEMP_SAVE_DIR, opus_SaveFile);
// if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
// {
// JZSDK_LOG_ERROR("opus保存文件移动失败");
// JZsdk_Osal_delete(OPUS_TEMP_SAVE_DIR);
// g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
// }
// //移动成功
// JZsdk_Sync(); //同步文件系统
// JZSDK_LOG_INFO("opus保存成功,刷新列表");
// OpusFile_FlushList(); //刷新opus文件列表
// }
/********************************************************************
*
*
* 如果不进行额存储,则进行一次opus解码
*
*
/********************************************************************/
else
{
OpusFile_DecodeOpus(OPUS_TEMP_SAVE_DIR);
ret = OpusFile_DecodeOpus(OPUS_TEMP_SAVE_DIR);
}
JZSDK_LOG_INFO("opus_save_end");
g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
return ret;
}
\ No newline at end of file
... ...
... ... @@ -659,6 +659,53 @@ T_JZsdkReturnCode UIcontrol_Opus_PlayFixedFile(int DeviceName)
#endif
}
//播放固定位置的录音opus录音喊话
T_JZsdkReturnCode UIcontrol_Pcm_PlayListFile(int DeviceName, unsigned char *Filename, unsigned int NameLen)
{
JZSDK_LOG_INFO("调用了list播放");
#ifdef MEGAPHONE_CONFIG_STATUS_ON
//调用喊话器的接口
T_JZsdkReturnCode ret = Megaphone_PlayPcmListFile(Filename, NameLen);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
printf("%s:%s\n",UI_CONTROL_ERROR,JZsdk_GetReturnCodeMessage(ret));
return ret;
}
delayMs(10);
//获取播放状态
int PlayStatus;
Megaphone_param(JZ_FLAGCODE_GET, MEGAPHONE_PLAY_STATUS, &PlayStatus);
//通知其他设备的ui界面变化
//如果4G模块有启动
if ((JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON) && (DeviceName != UART_4G) )
{
HalSend_type1Send_Send_PlayStatus(UART_4G, PlayStatus);
}
//如果设备1有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_1) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_1, PlayStatus);
}
//如果设备2有启动
if ( (JZsdk_HalPort_UseFlag(UART_DEV_2) == JZ_FLAGCODE_ON) && (DeviceName != UART_DEV_2) )
{
HalSend_type1Send_Send_PlayStatus(UART_DEV_2, PlayStatus);
}
//如果psdk接口已经使用
if ( (JZsdk_HalPort_UseFlag(DEVICE_PSDK) == JZ_FLAGCODE_ON) && DeviceName != DEVICE_PSDK )
{
JZsdk_Psdk_UI_io_Reply_PlayStatus(PlayStatus);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
#endif
}
/****************************************************************************************************************************************
*
* TTS相关
... ...
... ... @@ -50,6 +50,7 @@ T_JZsdkReturnCode UIcontrol_OpusRealTimeVoice_Close(int DeviceName);
//opus类
T_JZsdkReturnCode UIcontrol_Opus_PlayFixedFile(int DeviceName);
T_JZsdkReturnCode UIcontrol_Pcm_PlayListFile(int DeviceName, unsigned char *Filename, unsigned int NameLen);
T_JZsdkReturnCode UIcontrol_Broadcast_OpusDecodeStatus(int status);
//TTS类
... ...
... ... @@ -63,7 +63,6 @@
int Opus_PlayMode=0;//0录音喊话 1实时喊话
int num_flag=0;//版本号信息
int Firstsong_flag = 0;//记录第一次播放 0为未曾播放过
extern int height_Volume_lock;
extern int SpeakerWidgetUseLock;
... ... @@ -468,52 +467,30 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
{
//JZsdk_Psdk_UI_io_LastSong(1);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_LASTSONG, 0);
//记录为播放中
Firstsong_flag = 1;
}
break;
case 1://下一曲
{
if(value==1)
{
//JZsdk_Psdk_UI_io_NextSong(1);
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_NEXTSONG, 0);
//记录为播放中
Firstsong_flag = 1;
}
break;
}
case 2: // 播放\暂停 value为1 是三角控件 暂停 所以要去取反
{
value = !value;
//如果为暂停
if (value == 0)
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);
USER_LOG_INFO("暂停播放");
}
else if (value == 1)
{
if (Firstsong_flag == 1) //如果已经处于音频库播放中
{
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_PLAYANDSTOP, value);
USER_LOG_INFO("继续播放");
}
//否则为 第一次播放音频
else
{
//播放当前音频
JZsdk_Psdk_UI_io_PlaySong(1);
//记录为播放中
Firstsong_flag = 1;
USER_LOG_INFO("播放当前音频");
}
break;
}
break;
case 3://内显示音量 scale
{
JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(1, value);
... ...