AudioDealThread.c 4.2 KB
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


#include "JZsdkLib.h"
#include "../AudioDeal.h"
#include "Megaphone/Megaphone.h"
#include "version_choose.h"

static pthread_mutex_t LibStatusPthread_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t LibStatusPthread_cond = PTHREAD_COND_INITIALIZER;

static pthread_mutex_t PlayStatus_mutex = PTHREAD_MUTEX_INITIALIZER;

static int AudioDealThreadStatus = JZ_FLAGCODE_OFF;

/**************
 * 
 *  设置音频库的处理状态
 * 
 * ***********/
static T_JZsdkReturnCode Set_AudioThreadStatus(int status)
{
    AudioDealThreadStatus = status;
}

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


/**************
 * 
 *  音频库重采样与滤波标志位
 * 
 * ***********/
T_JZsdkReturnCode Set_AudioDeal_ResampleAndFilterAndPlay_Flag(struct AudioDealInfo *IndexInfo ,int value)
{
    pthread_mutex_lock(&LibStatusPthread_mutex);

    //状态无变化
    if (IndexInfo->AudioDeal_ResampleAndFilterAndPlay_Finish_Flag == value)
    {
        //直接退出
        pthread_mutex_unlock(&LibStatusPthread_mutex);
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    //1、修改结构体的值
    IndexInfo->AudioDeal_ResampleAndFilterAndPlay_Finish_Flag = value;

    //2、通知播放状态管理线程
    pthread_cond_signal(&LibStatusPthread_cond);

    pthread_mutex_unlock(&LibStatusPthread_mutex);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/**************
 * 
 *  音频库alsa标志位
 * 
 * ***********/
T_JZsdkReturnCode Set_AudioDeal_Alsa_Flag(struct AudioDealInfo *IndexInfo ,int value)
{
    pthread_mutex_lock(&LibStatusPthread_mutex);

    //状态无变化
    if (IndexInfo->AudioDeal_Alsa_Finish_Flag == value)
    {
        //直接退出
        pthread_mutex_unlock(&LibStatusPthread_mutex);
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    //1、修改结构体的值
    IndexInfo->AudioDeal_Alsa_Finish_Flag = value;

    //2、通知播放状态管理线程
    pthread_cond_signal(&LibStatusPthread_cond);

    pthread_mutex_unlock(&LibStatusPthread_mutex);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/************************
 * 
 *  播放状态线程初始化
 * 
 * *******************/
static void *AudioDeal_LibStatusThread(void *arg)
{
    struct AudioDealInfo *IndexInfo = (struct AudioDealInfo *) arg;

    while (1)
    {
        pthread_mutex_lock(&LibStatusPthread_mutex);

        //等候解锁线程
        pthread_cond_wait(&LibStatusPthread_cond, &LibStatusPthread_mutex);

        if (IndexInfo->AudioDeal_Alsa_Finish_Flag == JZ_FLAGCODE_OFF
            && IndexInfo->AudioDeal_ResampleAndFilterAndPlay_Finish_Flag == JZ_FLAGCODE_OFF)
        {
            //广播音频库的处理部分处于空闲状态
            Set_AudioThreadStatus(JZ_FLAGCODE_OFF);           
            //printf("音频库状态变化off");
        }
        else
        {
            Set_AudioThreadStatus(JZ_FLAGCODE_ON);
            //printf("音频库状态变化on");
        }

        pthread_mutex_unlock(&LibStatusPthread_mutex);
    }
}

static T_JZsdkReturnCode AudioDeal_LibStatus_Init(struct AudioDealInfo *IndexInfo)
{
    pthread_t alsa_play_task;
	pthread_attr_t task_attribute; //线程属性
	pthread_attr_init(&task_attribute);  //初始化线程属性
	pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED);      //设置线程属性

    int tts_ret = pthread_create(&alsa_play_task,&task_attribute,AudioDeal_LibStatusThread,(void *)IndexInfo);		//TTS线程
	if(tts_ret != 0)
	{
		JZSDK_LOG_ERROR("创建播放线程失败!\n");
		return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
	}
}

/************************
 * 
 *  三大线程的管理文件
 *  分别是 数据生成线程 播放线程 播放状态线程
 * 
 * *******************/
T_JZsdkReturnCode AudioDealThread_Init(struct AudioDealInfo *IndexInfo)
{
    pthread_cond_init(&LibStatusPthread_cond, NULL);
    pthread_mutex_init(&LibStatusPthread_mutex, NULL);
    pthread_mutex_init(&PlayStatus_mutex, NULL);

    AudioDeal_LibStatus_Init(IndexInfo);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}