📄 voice.c
字号:
/****************************************************************************/
/* */
/* 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 + -