AudioDeal.c 8.9 KB
#include <stdio.h>
#include <pthread.h>
#include <alsa/asoundlib.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "FF_Statement.h"
#include "./AudioDeal.h"
#include "JZsdkLib.h"



#include "./AudioDealThread/AudioDealThread.h"
#include "./Alsa/pcm_AlsaPlay.h"

#include "Resample/pcm_Resample.h"
#include "AudioStreamDeal/AudioStreamDeal.h"
#include "Filter/FF_Filter.h"

#define MP3_DIR "/root/sdcard/1.mp3"
#define PCM_16000_DIR "/root/sdcard/16000_test.pcm"
#define READ_SIZE (2000)

//音频库索引值,用于管理所有的音频库信息
struct AudioDealInfo *AudioDeakInfo_index = NULL; 
T_JZsdkReturnCode g_AudioDealPauseFlag = JZ_FLAGCODE_OFF;
static int Audiodeal_status = JZ_FLAGCODE_OFF;

T_JZsdkReturnCode AudioDeal_Init()
{
    T_JZsdkReturnCode ret;

    ret = JZsdk_Malloc((void **)&AudioDeakInfo_index, sizeof(struct AudioDealInfo));

    //初始化参数
    AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_OFF;
    AudioDeakInfo_index->AudioDeal_ResampleAndFilterAndPlay_Finish_Flag = JZ_FLAGCODE_OFF;

    AudioDeakInfo_index->Target_SampleRate = 44100;                  //cd采样率
    AudioDeakInfo_index->Target_SampleFormat = AV_SAMPLE_FMT_S16;    //16位深

    av_channel_layout_copy(&(AudioDeakInfo_index->Target_ChannelLayout), &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO);
    //AudioDeakInfo_index->Target_ChannelLayout = AV_CH_LAYOUT_STEREO; //立体声道
    //AudioDeakInfo_index->Target_ChannelLayout = AV_CH_LAYOUT_MONO; //dan声道

    AudioDeakInfo_index->Raw_SampleRate = 0;

    AudioDeakInfo_index->FilterMode = JZ_FLAGCODE_ON;  //滤波模式

    //JZSDK_LOG_DEBUG("thread_init开始");

    //初始化thread线程管理
    AudioDealThread_Init(AudioDeakInfo_index);

    AudioDeakInfo_index->AlsaInfo = NULL;
    AlsaPlay_Init(AudioDeakInfo_index);

    JZSDK_LOG_DEBUG("初始化重采样器开始");

    //初始化重采样器, 以下为默认文本的参数
    AudioDeakInfo_index->ResampleInfo = NULL;

    FF_Resample_Init(AudioDeakInfo_index, 16000, (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, AV_SAMPLE_FMT_S16);

    JZSDK_LOG_DEBUG("初始化滤波器开始");

    //初始化滤波器
    AudioDeakInfo_index->FilterInfo = NULL;
    FF_Filter_Init(AudioDeakInfo_index, 0x00);

    //初始化实时流
    File_Stream_deal_Init(AV_CODEC_ID_MP2);

    Audiodeal_status = JZ_FLAGCODE_ON;

    JZSDK_LOG_INFO("MODULE_AUDIODEL_INIT_COMPLETE");
}

/*

    设置滤波模式
    0x00 默认滤波 0x01 M30滤波


*/
T_JZsdkReturnCode AudioDeal_SetFilterMode(int mode)
{
    FF_Filter_Set_FilterMode(mode);
}

/*
    获取音频库的滤波模式
    0x00 默认滤波 0x01 M30滤波
*/
T_JZsdkReturnCode AudioDeal_GetFilterMode()
{
    return FF_Filter_Get_FilterMode();
}


/******************************
 * 
 *  采样器重初始化
 * 
 * 
 * *********************************************/
T_JZsdkReturnCode AudioDeal_ResampleRest(unsigned int in_sampleRate, AVChannelLayout in_ch_layout, enum AVSampleFormat in_format)
{

    FF_Resample_Reset(AudioDeakInfo_index ,in_sampleRate, in_ch_layout, in_format);

}

/***************************************************************************************************************************************************
 * 
 *  各音频播放接口
 *  
 * 
 * ***************************************************************************************************************************************************/

/***************************
 * 
 *  pcm数据接入接口
 * 
 *  Data Type = 0 为文本pcm
 *  Date Type = 1 为语音流pcm
 * 
 * ************/
T_JZsdkReturnCode AudioDeal_PcmDataInput(int In_Bitrate, unsigned char *buffer, int bytesRead, int DataType)
{
    if (AudioDeakInfo_index == NULL)
    {
        JZSDK_LOG_ERROR("音频处理器未注册");
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    while (Audiodeal_status != JZ_FLAGCODE_ON)
    {
        delayMs(1);
    }
    

    //1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
    AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;

    //Set_AudioDeal_ResampleAndFilterAndPlay_Flag(AudioDeakInfo_index, JZ_FLAGCODE_ON);

    //默认数据pcm接入口都是 单声道,16位
    PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, buffer, bytesRead, DataType);
    //printf("Read %zu bytes from the PCM file.\n", bytesRead);  

    //标志音频库已经结束,不过alsa库内有10组缓存,该标志位结束,只能认为重采样和滤波结束
    //Set_AudioDeal_ResampleAndFilterAndPlay_Flag(AudioDeakInfo_index, JZ_FLAGCODE_OFF);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

// /***************************
//  * 
//  *  无回复接口
//  * 
//  * ************/
// T_JZsdkReturnCode AudioDeal_PcmDataInput_WithoutReply(int In_Bitrate, unsigned char *buffer, int bytesRead)
// {
//     if (AudioDeakInfo_index == NULL)
//     {
//         JZSDK_LOG_ERROR("音频处理器未注册");
//         return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
//     }

//     while (Audiodeal_status != JZ_FLAGCODE_ON)
//     {
//         delayMs(1);
//     }

//     //1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
//     AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;
    
//     //默认数据pcm接入口都是 单声道,16位
//     PCM_PooL_Interface_PcmData(AudioDeakInfo_index, In_Bitrate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16, buffer, bytesRead);

//     return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
// }



/***************************
 * 
 *  mp3数据接入接口
 * 
 * ************/
T_JZsdkReturnCode AudioDeal_Mp3DataInput(int In_Bitrate, unsigned char *buffer, int bytesRead)
{
    if (AudioDeakInfo_index == NULL)
    {
        JZSDK_LOG_ERROR("音频处理器未注册");
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }
    
    while (Audiodeal_status != JZ_FLAGCODE_ON)
    {
        delayMs(1);
    }

    //1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
    AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;

    T_JZsdkReturnCode ret =  mp3_Stream_Interface_Mp3Data(AudioDeakInfo_index, In_Bitrate, buffer, bytesRead);
    if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE)
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_HARDLY_FAILURE;
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode AudioDeal_Mp3DataStop()
{
    mp3_Stream_Interface_Mp3Data_Stop(AudioDeakInfo_index);
}

/*******************
 * 
 *  暂停播放
 *  jzon 为暂停播放
 *  jzoff 为继续播放
 * *********************/
T_JZsdkReturnCode AudioDeal_PauseAndContinuePlay(int status)
{
    //如果处于实时喊话,禁止使用该功能
    g_AudioDealPauseFlag = status;
}

/*******************
 * 
 *  获取音频暂停状态
 *  jzon 为暂停播放
 *  jzoff 为继续播放
 * 
 * *********************/
int AudioDeal_GetPauseAndContinuePlayStatus()
{
    return g_AudioDealPauseFlag;
}

/***************************
 * 
 *  音频文件数据接入接口
 * 
 * ************/
T_JZsdkReturnCode AudioFile_Stream_DataInput(AVFrame *frame)
{
    if (AudioDeakInfo_index == NULL)
    {
        JZSDK_LOG_ERROR("音频处理器未注册");
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    while (Audiodeal_status != JZ_FLAGCODE_ON)
    {
        delayMs(1);
    }
    
    //1、打开音频库的处理标志位,该标志可以重复打开,只有强制关闭音频时,需要关闭该标志
    AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_ON;

    AudioFile_Stream_Interface_PcmData(AudioDeakInfo_index, frame);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/*********************
 * 
 *  音频库停止处理函数
 *  
 * *********************/
T_JZsdkReturnCode AudioDeal_StopDeal()
{
    if (AudioDeakInfo_index == NULL)
    {
        JZSDK_LOG_ERROR("音频处理器未注册");
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    //1、关闭数据处理和alsa部分
    AudioDeakInfo_index->AudioDeal_ResampleAndFilter_Execute_Flag = JZ_FLAGCODE_OFF;
    AudioDeakInfo_index->AudioDeal_Alsa_Execute_Flag = JZ_FLAGCODE_OFF;

    //2、等候完成
    while (AudioDeakInfo_index->AudioDeal_ResampleAndFilterAndPlay_Finish_Flag != JZ_FLAGCODE_OFF)
    {
        delayMs(1);
    }

    //清空alsa里的缓冲区
    Alsa_DropPcm(AudioDeakInfo_index);

    while (AudioDeakInfo_index->AudioDeal_Alsa_Finish_Flag != JZ_FLAGCODE_OFF)
    {
        delayMs(1);
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/**************
 * 
 *  获取音频库的处理状态
 * 
 * ***********/
T_JZsdkReturnCode Get_AudioDealStatus()
{
    return Get_AudioDealThreadStatus();
}