⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voice.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************/
/*                                                                          */
/*              Copyright (C) 2002-2003 SHENZHEN MEIJIN CO.LTD              */
/*                                                                          */
/*  FILE NAME   : Voice.C                                                   */
/*  MODULE NAME : Voice模块(Voice.MOD)                                      */
/*  DESCRIPTION : Voice Manager                                             */
/*                                                                          */
/****************************************************************************/
/*  DATE        AUTHOR      VERSION     REMARKS                             */
/*  ==========  ========    =======     ==============================      */
/*  2004-04-07  黄小明       VER1.00     创建                               */
/****************************************************************************/

#define __OS_SOURCE_FILE__

/* 包含所需头文件 */
#include "kernel.h"
//#include "SysWatch.h"

#include "VoiceIn.h"


#define 		VOICE_BKFLAG_UNBACKUP	0	//未备份
#define 		VOICE_BKFLAG_BK_PLAYLIST	1	//备份播放列
#define 		VOICE_BKFLAG_BK_PLAY		2	//备份播放

// 定义内部全局变量

    //Voice任务与队列相关
NU_TASK         g_VoiceTask;
NU_QUEUE        g_VoiceQueue;
UINT32          g_VoiceQueueBuf[VOICE_MAX_EVENT * EVENT_QUEUE_MSG_SIZE];
VOID*			g_pVoiceStack;

    //Voice状态参数等相关
UINT8	g_VoiceStatus;					/*状态*/	
MVoicePlayParam		g_VoicePlayParam;		/*播放参数*/
MVoiceRecordParam	g_VoiceRecordParam;	/*录音参数*/
VoiceHandle	g_VoiceHandle;					/*句柄*/
HTIMER      g_hVoiceTimer;

OPTION      g_VoicePreemptStatus;

WAVEHDR hdrWave1, hdrWave2, hdrWave3;
//
#ifdef				BACKVOICE_FUNC
INT 				g_nVoiceBkFlag;		//=0,未备份,=1,备份播放列表,=2,备份播放
VoiceListPlayParam	*g_pVoiceListPlayParamBk;
VoiceHandle			g_hVoiceHandleBk;
extern VoiceHandle       hVoiceListPlayHandle;
#endif
//
/****************************************************************************/
/* FUNCTION:   VoiceModInitial                                             */
/* DESCRIPTION:Voice模块初始化		                                        */
/* INPUTS:     wInitMode -	初始化模式                                      */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     设置成功则返回TRUE,否则返回FALSE                           */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  HuangXM     2003-06-19     创建                                         */
/****************************************************************************/
//BOOL VoiceModInitial(UINT wInitMode)
BOOL VoiceModInitial()
{
//    if( wInitMode == SYS_INIT_RESET )
    {
		g_VoiceHandle = (VOICE_HANDLE_MASK | VOICE_HANDLE_MIN);
		g_VoiceStatus = VOICE_STATUS_STOP;
		memset(&g_VoicePlayParam, 0, sizeof(MVoicePlayParam));
		memset(&g_VoiceRecordParam, 0, sizeof(MVoiceRecordParam));

        /* 创建Voice消息队列 */
        if( NU_Create_Queue(&g_VoiceQueue, "VoiceQueue", g_VoiceQueueBuf, VOICE_MAX_EVENT * EVENT_QUEUE_MSG_SIZE,
            NU_FIXED_SIZE, EVENT_QUEUE_MSG_SIZE, NU_FIFO) != NU_SUCCESS)
            return FALSE;

        /* 创建Voice任务*/
        if( (g_pVoiceStack = MemAlloc(VOICE_STACK_SIZE)) == NULL )
            return FALSE;

        if( NU_Create_Task(&g_VoiceTask, "VoiceTsk", __VoiceTaskProc, 0, NU_NULL, g_pVoiceStack,
            VOICE_STACK_SIZE, TASK_PRIORITY_HIGHEST,  0, NU_PREEMPT, NU_START) != NU_SUCCESS)
            return FALSE;

        g_hVoiceTimer = TimCreateTimer((VOID *)NULL, 100, 1000, 1000, (FPCALLBACK)__VoiceTimerCallBack);
        if(g_hVoiceTimer == NULL)
            return FALSE;
        
		//初始化媒体文件管理
		MediaFileInit();

		//初始化VoiceList
		__VoiceListInitial();

        //初始化录音模块
        RecordInit();

    }
    return TRUE;
}

/****************************************************************************/
/* FUNCTION:   VoiceModTerminate                                           */
/* DESCRIPTION:Voice模块终止		                                        */
/* INPUTS:     NONE					                                    */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     设置成功则返回TRUE,否则返回FALSE                           */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  HuangXM     2003-06-19     创建                                         */
/****************************************************************************/
BOOL VoiceModTerminate()
{
	NU_Terminate_Task(&g_VoiceTask);
    NU_Delete_Task(&g_VoiceTask);
    NU_Delete_Queue(&g_VoiceQueue);
	return TRUE;
}

/****************************************************************************/
/* FUNCTION:   VoiceGetParam                                        */
/* DESCRIPTION:得到一个声音文件状态                                        */
/* INPUTS:     voiceHandle - Voice 句柄                                    */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     VOICE_STATUS_……					                        */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  HuangXM     2003-06-19     创建                                         */
/****************************************************************************/
BOOL VoiceGetParam(VoiceHandle voiceHandle, MVoicePlayParam* pVoicePlayParam)
{
	//参数NULL表示针对当前声音句柄
	if(voiceHandle == NULL)
		voiceHandle = g_VoiceHandle;

	//检查是否当前句柄
	if(voiceHandle != g_VoiceHandle)
		return FALSE;

    __VoiceProtect();

    memcpy((UINT8 *)pVoicePlayParam, (UINT8 *)&g_VoicePlayParam, sizeof(MVoicePlayParam));
    pVoicePlayParam->voiceStatus = g_VoiceStatus;

	pVoicePlayParam->dwRetOffset = pVoicePlayParam->dwPlayOffset;
	if(pVoicePlayParam->pAcmDrv == NULL)
	{
		if(hdrWave1.dwUser == WAVEHDR_IN_USE)
			pVoicePlayParam->dwRetOffset -= pVoicePlayParam->dwDstBufferSize;
		if(hdrWave2.dwUser == WAVEHDR_IN_USE)
			pVoicePlayParam->dwRetOffset -= pVoicePlayParam->dwDstBufferSize;
		if(hdrWave3.dwUser == WAVEHDR_IN_USE)
			pVoicePlayParam->dwRetOffset -= pVoicePlayParam->dwDstBufferSize;
		if(pVoicePlayParam->dwRetOffset > pVoicePlayParam->dwPlayOffset)
			pVoicePlayParam->dwRetOffset = pVoicePlayParam->dwPlayOffset;
		if(pVoicePlayParam->dwRetOffset < pVoicePlayParam->dwPlayStart)
			pVoicePlayParam->dwRetOffset = pVoicePlayParam->dwPlayStart;
	}

    if(g_VoicePlayParam.playType == VOICE_TYPE_WMA)
    {
        pVoicePlayParam->dwPlayOffset = WmaFileGetOffset();
        pVoicePlayParam->dwRetOffset = pVoicePlayParam->dwPlayOffset;
    }

    __VoiceUnprotect();

    return TRUE;
}

BOOL VoiceSetParam(VoiceHandle voiceHandle, MVoicePlayParam* pVoicePlayParam)
{
	//检查是否当前句柄
	if (voiceHandle != g_VoiceHandle)
		return FALSE;

    if (pVoicePlayParam->dwPlayEnd > pVoicePlayParam->dwFileLength)
        pVoicePlayParam->dwPlayEnd = pVoicePlayParam->dwFileLength;
    
    if (pVoicePlayParam->dwPlayStart + pVoicePlayParam->dwFrameLength
        > pVoicePlayParam->dwPlayEnd)
    {
        if (pVoicePlayParam->dwPlayEnd > pVoicePlayParam->dwFrameLength)
        {
            pVoicePlayParam->dwPlayStart
                = pVoicePlayParam->dwPlayEnd - pVoicePlayParam->dwFrameLength;
        }
        else
            pVoicePlayParam->dwPlayStart = 0;
    }

    if (pVoicePlayParam->dwPlayOffset + pVoicePlayParam->dwFrameLength
        > pVoicePlayParam->dwPlayEnd)
    {
        if (pVoicePlayParam->dwPlayEnd > pVoicePlayParam->dwFrameLength)
        {
            pVoicePlayParam->dwPlayOffset
                = pVoicePlayParam->dwPlayEnd - pVoicePlayParam->dwFrameLength;
        }
        else
            pVoicePlayParam->dwPlayOffset = 0;
    }

    __VoiceProtect();

    g_VoicePlayParam.dwPlayEnd = pVoicePlayParam->dwPlayEnd;
    g_VoicePlayParam.dwPlayStart = pVoicePlayParam->dwPlayStart;
    g_VoicePlayParam.dwPlayOffset = pVoicePlayParam->dwPlayOffset;

    if(g_VoicePlayParam.playType == VOICE_TYPE_WMA)
        WmaFileSetOffset(g_VoicePlayParam.dwPlayOffset);

    __VoiceUnprotect();

    return TRUE;
}

/****************************************************************************/
/* FUNCTION:   VoiceOpen		                                            */
/* DESCRIPTION:开始录音			                                        */
/* INPUTS:     pVoicePlayParam - 播放参数指针                              */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     voiceHandle - Voice 句柄 (<0 失败)                          */
/****************************************************************************/
/*  NAME           DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*  HuangXM     2003-06-19     创建                                         */
/****************************************************************************/
VoiceHandle VoiceOpen(MVoicePlayParam *pVoicePlayParam)
{
	//暂停后台播放
	VoiceListPlayParam	mpPlayParam;
	VoiceHandle		hVoice;
	
	if(VoiceListPlayParamGet(&mpPlayParam) == TRUE)
	{
		VoiceListSuspend();
		pVoicePlayParam->bListSuspend = TRUE;
	}


    //停止当前录放操作
	__VoiceSendCommand(g_VoiceHandle, VOICE_COMMAND_STOP, VOICE_NOTIFY_BREAK, 0);

	hVoice = __VoiceOpen(pVoicePlayParam);
	if(hVoice == (VoiceHandle) -1)
	{
		if(pVoicePlayParam->bListSuspend == TRUE)
			VoiceListContinue();
	}

	return hVoice;
}

BOOL VoiceGetFileInfo(MVoicePlayParam *pVoicePlayParam)
{
    if(__VoiceFileOpen(pVoicePlayParam) == FALSE)
        return FALSE;

    if(__VoiceFileInfo(pVoicePlayParam) == FALSE)
	{
		__VoiceFileClose(pVoicePlayParam);
		return FALSE;
	}

    __VoiceFileClose(pVoicePlayParam);

	return TRUE;
}

/****************************************************************************/
/* FUNCTION:   VoicePause                                              */
/* DESCRIPTION:暂停播放			                                        */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -