OpusFile.c 4.2 KB
#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列表(用于加载新的opus文件)
	OpusFile_FlushList();
}