OpusFileSave.c 7.4 KB
#include <stdio.h>
#include "JZsdkLib.h"

#include "OpusFile.h"

static int g_OpusFile_SaveLen = 0;
static FILE *g_OpusFile_SaveFp = NULL;
static int g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF; //opus存储标志位
static int g_OpusSaveMode = JZ_FLAGCODE_OFF; //opus存储模式 off:不存储  on:存储


#define OPUS_TEMP_SAVE_DIR "/root/test_audio.opus"
static unsigned char opus_SaveFile[128];

static T_JZTaskHandle s_OpusSaveThread = NULL;

/***************
 * 
 *   获取opus是否存取中
 * 
 * 
 * ***********/
int OpusFile_GetSaveFlag(void)
{
    return g_OpusFile_SaveFlag;
}

/******************
 *  
 * 
 *  opus文件 存储显示线程
 * 
 * 
 * **********************/
static void *OpusFile_SaveOpusPrint(void *arg)
{
    while (g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
    {
        int num = 0;

        JZSDK_LOG_INFO("opus存储功能开启中,当前已存入 %d 字节",g_OpusFile_SaveLen);

        //适时延迟
        while (num < 100 && g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
        {
            delayMs(10);
            num++;
        }
    }
}

/******************
 * 
 * 
 *  开始存储opus文件
 *  
 * 
 * **********************/
T_JZsdkReturnCode OpusFile_SaveOpusFileStart(unsigned char *FileName, int decode_rate, int SampleRate, int Channels)
{
    T_JZsdkOsalHandler *OsalHandler = JZsdk_Platform_GetOsalHandler();

    if (g_OpusFile_SaveFlag == JZ_FLAGCODE_ON)
    {
        JZSDK_LOG_ERROR("opus文件保存功能已经开启");
        return JZ_ERROR_SYSTEM_MODULE_CODE_IS_BUSY;
    }

    OpusFile_SetDecodeBitrate(decode_rate);
    
    g_OpusFile_SaveLen = 0;

    memset(opus_SaveFile, 0, sizeof(opus_SaveFile));

    //设置存储的位置
    if (FileName == NULL)
    {
        g_OpusSaveMode = JZ_FLAGCODE_OFF;
        JZSDK_LOG_INFO("上传的opus文件存储路径为:%s decode_rate:%d SampleRate:%d Channels:%d", OPUS_TEMP_SAVE_DIR, decode_rate, SampleRate, Channels);
    }
    else
    {
        g_OpusSaveMode = JZ_FLAGCODE_ON;
        JZSDK_LOG_INFO("上传的opus文件名为:%s decode_rate:%d SampleRate:%d Channels:%d", opus_SaveFile, decode_rate, SampleRate, Channels);
    }

    if (g_OpusFile_SaveFp != NULL)
    {
        JZSDK_LOG_ERROR("要保存的opus文件已经打开,请先关闭保存功能");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    g_OpusFile_SaveFp = fopen(OPUS_TEMP_SAVE_DIR, "wb");
    if (g_OpusFile_SaveFp == NULL)
    {
        JZSDK_LOG_ERROR("打开opus文件失败");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    g_OpusFile_SaveFlag = JZ_FLAGCODE_ON;

    //创建存储显示线程
    OsalHandler->TaskCreate("OpusSavePrint", OpusFile_SaveOpusPrint, 8192,NULL, &s_OpusSaveThread);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/******************
 *      
 *  
 *  存储opus流中
 * 
 * 
 * **********************/
T_JZsdkReturnCode OpusFile_SaveOpusFileStream(unsigned char *Stream, int StreamLen)
{
    if (g_OpusFile_SaveFlag == JZ_FLAGCODE_OFF)
    {
        JZSDK_LOG_ERROR("没有打开opus文件保存功能");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    if (g_OpusFile_SaveFp == NULL)
    {
        JZSDK_LOG_ERROR("要保存的opus文件未打开");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    fseek(g_OpusFile_SaveFp, g_OpusFile_SaveLen, SEEK_SET);
    int writeLen = fwrite(Stream, 1, StreamLen, g_OpusFile_SaveFp);
    if (writeLen != StreamLen)
    {
        JZSDK_LOG_ERROR("opus文件写入失败");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    fflush(g_OpusFile_SaveFp);
    g_OpusFile_SaveLen += StreamLen;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/******************
 *  
 *  
 *  结束存储opus文件
 *  
 *  checkflag是否需要校正 或校正类型
 *  checkcode 校正码
 *  
 * 
 * **********************/
T_JZsdkReturnCode OpusFile_SaveOpusFileEnd(int CheckFlag, unsigned char *CheckCode)
{
    T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;

    //标志位判定
    if (g_OpusFile_SaveFlag == JZ_FLAGCODE_OFF)
    {
        JZSDK_LOG_ERROR("没有打开opus文件保存功能");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    //文件指针判定
    if (g_OpusFile_SaveFp == NULL)
    {
        JZSDK_LOG_ERROR("要保存的opus文件未打开");
        g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    //关闭存储的文件
    fflush(g_OpusFile_SaveFp);
    fclose(g_OpusFile_SaveFp);
    g_OpusFile_SaveFp = NULL;
    
    JZSDK_LOG_INFO("已存储opus文件, 其长度为:%d", g_OpusFile_SaveLen);

/***********************************************************
 * 
 *    校验部分
 *   
 * 
 * *********************************************************/
    if (CheckFlag != JZ_FLAGCODE_OFF)
    {
        switch (CheckFlag)
        {
            case JZSDK_CHECK_SUM_TYPE_MD5:
            {
                JZSDK_LOG_INFO("opus保存使用md5校验码");
                //1、获取文件的md5校验码
                ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_MD5, OPUS_TEMP_SAVE_DIR, CheckCode, 32);
            }
            break;

            case JZSDK_CHECK_SUM_TYPE_SRC32:
            {
                JZSDK_LOG_INFO("opus保存使用src32校验码");
                //1、获取文件的src32校验码
                ret = JZsdk_CheckSum(JZSDK_CHECK_SUM_TYPE_SRC32, OPUS_TEMP_SAVE_DIR, CheckCode, 4);
            }
            break;
            
            default:
            {
                JZSDK_LOG_ERROR("opus保存校验码类型错误");
                g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;
                ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
            }
            break;
        }

        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;
        }
    }
    else
    {
        JZSDK_LOG_INFO("opus保存无需校验码");
    }

/***********************************************************
 * 
 *    额外存储部分
 *   
 * 
 * *********************************************************/
    if (g_OpusSaveMode != JZ_FLAGCODE_OFF)
    {
        //将opus解码,并存储到指定目录
        ret = OpusFile_DecodeOpusAndSave(g_OpusSaveMode ,OPUS_TEMP_SAVE_DIR, opus_SaveFile);
    }

    // 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
    {
        ret = OpusFile_DecodeOpus(OPUS_TEMP_SAVE_DIR);
    }

    JZSDK_LOG_INFO("opus_save_end");

    g_OpusFile_SaveFlag = JZ_FLAGCODE_OFF;

    return ret;
}