|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
#include <string.h>
|
|
|
#include <pthread.h>
|
|
|
#include <dirent.h>
|
|
|
#include <sys/stat.h>
|
|
|
|
|
|
#include "JZsdkLib.h"
|
|
|
#include "Megaphone/AudioMange/AudioMange.h"
|
|
|
|
|
|
#define OPUS_DIR "/root/sdcard/opus"
|
|
|
|
|
|
//创建一个opus节点
|
|
|
static struct AudioMange_Node *g_OpusList = NULL;
|
|
|
static struct AudioMange_Node *g_OpusListtail = NULL; // 用于跟踪链表的尾部
|
|
|
|
|
|
static int g_OpusListNum = 0; //用于记录链表中的节点数量
|
|
|
static int g_OpusList_CurrentNum = 0; //用于记录链表中当前节点位置
|
|
|
|
|
|
/*********
|
|
|
*
|
|
|
* opus文件链表注销
|
|
|
*
|
|
|
**********/
|
|
|
static T_JZsdkReturnCode OpusFile_FreeAudioList()
|
|
|
{
|
|
|
//清空尾部指针
|
|
|
g_OpusListtail = NULL;
|
|
|
|
|
|
//清空歌曲数量
|
|
|
g_OpusListNum = 0; //记录链表中一共有几首歌
|
|
|
g_OpusList_CurrentNum = 0; //记录播放当前第几首歌
|
|
|
|
|
|
//释放掉整个链表
|
|
|
Jzsdk_Free_AndioMange_Node(&g_OpusList);
|
|
|
|
|
|
g_OpusList = NULL;
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
/*********
|
|
|
*
|
|
|
* opus文件链表刷新
|
|
|
*
|
|
|
**********/
|
|
|
T_JZsdkReturnCode OpusFile_FlushList()
|
|
|
{
|
|
|
//读取audio文件夹,并将歌曲名放入音频列表
|
|
|
DIR *dir;
|
|
|
struct dirent *entry;
|
|
|
struct stat fileStat;
|
|
|
|
|
|
//创建一个临时opus节点
|
|
|
struct AudioMange_audio_struct OpusInfo;
|
|
|
T_JZsdkReturnCode ret;
|
|
|
|
|
|
//检查是否存在opus文件夹,没有则创建一个
|
|
|
if(JZsdk_check_directory_exists_posix(OPUS_DIR) != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("不存在opus文件夹,创建一个");
|
|
|
JZsdk_Osal_Mkdir(OPUS_DIR);
|
|
|
}
|
|
|
|
|
|
//确定音频文件夹存在
|
|
|
if ((dir = opendir(OPUS_DIR)) == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("音频文件夹获取失败");
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
|
|
|
}
|
|
|
|
|
|
//查看歌曲存放链表是否有注册过
|
|
|
if (g_OpusList != NULL)
|
|
|
{
|
|
|
OpusFile_FreeAudioList();
|
|
|
}
|
|
|
|
|
|
|
|
|
while ((entry = readdir(dir)) != NULL)
|
|
|
{
|
|
|
const unsigned char *filename = entry->d_name;
|
|
|
unsigned int fileSize;
|
|
|
int len = strlen(filename);
|
|
|
|
|
|
// // 获取文件状态信息,包括大小
|
|
|
// if (stat(filename, &fileStat) == 0)
|
|
|
// {
|
|
|
// fileSize = (unsigned long long)fileStat.st_size;
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// JZSDK_LOG_ERROR("%s文件信息获取错误",filename);
|
|
|
// fileSize = 0;
|
|
|
// continue;
|
|
|
// }
|
|
|
|
|
|
// 跳过目录和隐藏文件,并检查文件扩展名
|
|
|
if (entry->d_type != DT_DIR && strcmp(filename, ".") != 0 && strcmp(filename, "..") != 0)
|
|
|
{
|
|
|
//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)
|
|
|
{
|
|
|
// 处理文件
|
|
|
memset(&OpusInfo, 0, sizeof(OpusInfo)); // 清除audioInfo结构
|
|
|
|
|
|
//写入文件名
|
|
|
strncpy(OpusInfo.FileName, entry->d_name, JZSDK_FILENAME_SIZE);
|
|
|
|
|
|
unsigned char fileDir [256];
|
|
|
snprintf(fileDir, sizeof(fileDir), "/root/sdcard/opus/%s", filename);
|
|
|
|
|
|
//写入文件大小
|
|
|
JZsdk_Fs_ReadFileSize(fileDir, &(OpusInfo.FileSize));
|
|
|
|
|
|
//根据文件大小写入时长信息
|
|
|
//int temp_time = (OpusInfo.FileSize * 8) / (16000 * 16 * 1); #这条是pcm算时长,超准确
|
|
|
int temp_time = (OpusInfo.FileSize * 8) / (16000);
|
|
|
OpusInfo.Time = temp_time;
|
|
|
|
|
|
//写入文件名长度
|
|
|
OpusInfo.FileNameLen = len;
|
|
|
|
|
|
// 创建新节点
|
|
|
struct AudioMange_Node *newNode = NULL;
|
|
|
ret = Jzsdk_Create_AndioMange_Node(&newNode, OpusInfo);
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("存放音乐 %s 失败", entry->d_name);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// 将新节点添加到链表末尾
|
|
|
Jzsdk_AddAudioNodeToCircularList(&g_OpusList, &g_OpusListtail, &newNode);
|
|
|
|
|
|
// 歌曲计数+1
|
|
|
g_OpusListNum++;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
closedir(dir);
|
|
|
|
|
|
//设置默认播放歌曲
|
|
|
g_OpusList_CurrentNum = 0;
|
|
|
|
|
|
//打印一遍已加载的音乐
|
|
|
JZsdk_PrintfAuidoNode_AudioList(g_OpusList);
|
|
|
|
|
|
JZSDK_LOG_INFO("刷新opus列表已完成");
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*********
|
|
|
*
|
|
|
* opus文件初始化
|
|
|
*
|
|
|
**********/
|
|
|
T_JZsdkReturnCode Megaphone_OpusFile_Init()
|
|
|
{
|
|
|
//刷新opus列表
|
|
|
OpusFile_FlushList();
|
|
|
} |
|
|
\ No newline at end of file |
...
|
...
|
|