OpusFile.c
4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#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();
}