📄 aphearsaysub.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD */
/* */
/* FILE NAME: ApHearSaySub.c */
/* MODULE NAME: AP应用程序 */
/* DESCRIPTION: Hearsay Sub File */
/* */
/* FUNCTIONS: */
/* */
/****************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==============================================*/
/* DennyHan 2006-03-15 V1.00B */
/****************************************************************************/
// 包含必要的头文件
#include "Ap.h"
#include "ApHearSay.h"
extern RrParam g_RrParam;
//==================================================================
//
// Time Stamp
//
//------------
INT ApHsClrPlayTmBar(INT nMode)
{
nMode &= 1;
g_RrParam.aPlay[nMode].wStep = 0;
g_RrParam.aPlay[nMode].wTotalStep=UINT_PLAY_STEP_TOTAL;
return TRUE;
}
//------------------------------------------------------
// Set Time Step of BAR
//----------------
INT ApHsSetPlayTmBar(INT nMode)
{
UINT32 i;
UINT16 j;
if (nMode>0)
return 0;
nMode &= 1;
// total time : to 0.5s
if (!g_RrParam.aPlay[nMode].wTotalStep)
{
ApHsClrPlayTmBar(nMode);
}
j=g_RrParam.aPlay[nMode].wTotalStep;
// One Step Time
i = (g_RrParam.aPlay[nMode].dwTotalTm+(j/2))/j;
if (i==0)
{
i++;
}
// Current Play Time //
i =(g_RrParam.aPlay[nMode].dwPlayTm+(i/2))/i;
if ( (UINT16) i>j)
{
i=(UINT32)j;
}
g_RrParam.aPlay[nMode].wStep=(UINT16)i;
return TRUE;
}
//=======================================================================
// Return 0: Play sound file
// 1: Play Record file
//=======================================================================
INT ApHSGetCurrentPlayMode(VOID)
{
INT nMode;
if (g_RrParam.wSndMode&APHS_SOUND_REC)
{
nMode=3;
}
else if (g_RrParam.wSndMode&APHS_SOUND_PLAY)
{
nMode=0;
}
else if (g_RrParam.wSndMode&APHS_SOUND_PLAYREC)
{
nMode=1;
}
else
{ // one error to default
nMode=0;
}
return nMode;
}
//===================================================================
// Time step of A/B, only used for display
//-------------------------
//------------------
INT ApHSGetStepAB(VOID)
{
UINT32 i;
UINT16 j,k;
// total time : to 0.5s
if (!g_RrParam.aPlay[0].wTotalStep)
{
ApHsClrPlayTmBar(0);
}
j=g_RrParam.aPlay[0].wTotalStep;
// One Step Time
i = (g_RrParam.aPlay[0].dwTotalTm+(j/2))/j;
if (i==0)
{
i++;
}
// Current Play Time // to 0.5S
k =(g_RrParam.dwTmA+(i/2))/i;
if ( k>j)
{
k=j;
}
g_RrParam.wStepA=k;
k =(g_RrParam.dwTmB+(i/2))/i;
if ( k>j)
{
k=j;
}
g_RrParam.wStepB=k;
return TRUE;
}
//------------------------------
// Step is the X positon of A inside of total step
INT ApHSSetTmAStep(UINT16 x)
{
UINT32 i;
UINT16 j;
UINT32 k;
// total time : to 0.5s
if (!g_RrParam.aPlay[0].wTotalStep)
{
ApHsClrPlayTmBar(0);
}
j=g_RrParam.aPlay[0].wTotalStep;
// One Step Time
i = (g_RrParam.aPlay[0].dwTotalTm+(j/2))/j;
// Current Play Time // to 0.5S
k =x*i;
if ( k>g_RrParam.aPlay[0].dwTotalTm)
{
k=g_RrParam.aPlay[0].dwTotalTm;
}
g_RrParam.dwTmA=k;
return TRUE;
}
//-------------------------------
// Step is the X positon of B inside of total step
INT ApHSSetTmBStep(UINT16 x)
{
UINT32 i;
UINT16 j;
UINT32 k;
// total time : to 0.5s
if (!g_RrParam.aPlay[0].wTotalStep)
{
ApHsClrPlayTmBar(0);
}
j=g_RrParam.aPlay[0].wTotalStep;
// One Step Time
i = (g_RrParam.aPlay[0].dwTotalTm+(j/2))/j;
// Current Play Time // to 0.5S
k =x*i;
if ( k>g_RrParam.aPlay[0].dwTotalTm)
{
k=g_RrParam.aPlay[0].dwTotalTm;
}
g_RrParam.dwTmB=k;
return TRUE;
}
//====================================================
// Tm is Time,
// return : XStep of the time
//--------------
UINT16 ApHSGetTmXStep(UINT32 Tm)
{
UINT16 x;
UINT32 i;
UINT16 j;
// total time : to 0.5s
if (!g_RrParam.aPlay[0].wTotalStep)
{
ApHsClrPlayTmBar(0);
}
j=g_RrParam.aPlay[0].wTotalStep;
// One Step Time
i = (g_RrParam.aPlay[0].dwTotalTm+(j/2))/j;
// Current Play Time // to 0.5S
x=Tm/i;
return x;
}
//========================================================================
//
// According to X position to get
////-----------------------
UINT32 ApHSGetTmFromStep(UINT16 x)
{
UINT32 Tm;
UINT16 j;
// total time : to 0.5s
if (!g_RrParam.aPlay[0].wTotalStep)
{
ApHsClrPlayTmBar(0);
}
j=g_RrParam.aPlay[0].wTotalStep;
if ((INT16)x<0)
{
x=0;
}
if (x>j)
{
x=j;
}
// One Step Time
Tm =x*(g_RrParam.aPlay[0].dwTotalTm+j/2)/j;
return Tm;
}
//=======================================================================
//
// Sync Data
//
//=======================================================================
//-------------------------------------------------
//=====================================
// Seek the Time Text Node
// Tm is Ms
INT __ApHsSeekTextTimeNode(UINT32 Tm)
{
SYNCDATAITEM *pSync;
UINT16 wSt;
UINT16 wEnd;
UINT16 j;
INT nFlag;
UINT16 wNode;
wNode = g_RrParam.pMstFileHdr->wNodes;
pSync = (SYNCDATAITEM*) (g_RrParam.pDispBuf+sizeof(MSTFILE_HEADER));
// Seek the time pointer
wSt=0;
wEnd=wNode;
j = (wSt+wEnd)/2;
nFlag=0;
while ( ( j>0) && (j < wNode ) )
{
if ( Tm < (100*((pSync+j)->wTime)) )
{
if (nFlag>0)
{
break;
}
wEnd=j;
j = (wSt+wEnd)/2;
nFlag = -1;
}
else if ( Tm == (100*((pSync+j)->wTime)) )
{
break;
}
else
{
if (nFlag<0)
{
break;
}
wSt=j;
j = (wSt+wEnd)/2;
if (wSt==j)
{
j++;
}
nFlag=1;
}
}
if (j>=wNode)
{
j=wNode-1;
}
// at last fix the 1 different
// tune the Pos node
if (Tm > (100*((pSync+j)->wTime)) )
{
if (j <(wNode-1) )
{
while(1)
{
if ( Tm < (100*((pSync+j+1)->wTime)) )
{
break;
}
j++;
}
}
}
else if (Tm < (100*((pSync+j)->wTime)) )
{
while(j)
{
j--;
if ( Tm >= (100*((pSync+j)->wTime)) )
{
break;
}
}
}
return j;
}
UINT16 ApHsGetTextTimeNode(VOID)
{
return __ApHsSeekTextTimeNode(g_RrParam.aPlay[0].dwPlayTm); // to 1ms
}
UINT16 ApHsGetTextTimeNodeEx(UINT32 Tm)
{
return __ApHsSeekTextTimeNode(Tm); // to 1ms
}
// Note to time to 0.5s
UINT32 ApHsGetTextNodeTime(UINT16 wNode)
{
SYNCDATAITEM *pSync;
if (wNode>= g_RrParam.pMstFileHdr->wNodes)
{
return g_RrParam.aPlay[0].dwTotalTm;
}
pSync = (SYNCDATAITEM*) (g_RrParam.pDispBuf+sizeof(MSTFILE_HEADER));
return ((pSync+wNode)->wTime*100); // 1 ms
}
UINT32 ApHsGetTextNodeTimeLength(UINT16 wNode)
{
SYNCDATAITEM *pSync;
if (wNode>= g_RrParam.pMstFileHdr->wNodes)
{
return g_RrParam.aPlay[0].dwTotalTm;
}
pSync = (SYNCDATAITEM*) (g_RrParam.pDispBuf+sizeof(MSTFILE_HEADER));
return ((pSync+wNode)->wTimeLen*100); // 1 ms
}
//=====================================================================
// Disable
VOID ApHSDisableTimerRefreshMst(VOID)
{
if (!(g_RrParam.wRptMode&RR_MODE_NOMST))
{
g_RrParam.wSkipMstCnt = 2;
}
}
//====================================================================
INT APHsStopMark(VOID)
{
if (g_RrParam.bMarkFlag)
{
g_RrParam.bMarkFlag=FALSE;
HearSayBrowserProc(g_RrParam.pBwrGui,EVENT_COMMAND,CM_BROWSER_CANCELMARK);
}
return TRUE;
}
//==============================================
// check the playing of the text sound file is ending or not??
// it ending, return true
// otherwise, return flase
//===============================================
BOOL APHsChkPlayM0Ending(VOID)
{
if ( (!(g_RrParam.wSndMode&APHS_FOLLOW))
&& (!(g_RrParam.wSndMode&APHS_REPEAT)) )
{
ApHsGetPlayTm(0);
if ( g_RrParam.aPlay[0].dwPlayTm >= g_RrParam.aPlay[0].dwTotalTm )
{
return TRUE;
}
}
return FALSE;
}
//===============================
// CLear Current Repeat Mode
// and the corresponding operation
//--------
VOID ApHsClearRptMode(VOID)
{
g_RrParam.wSndMode &= (~APHS_REPEAT_OCCUR);
}
//================================
// Backup the current AB time
//------------
VOID ApHsSetBakABPlay(VOID)
{
if ( (g_RrParam.wTmABSetFlag&(APHS_TMA_SET|APHS_TMB_SET))
== (APHS_TMA_SET|APHS_TMB_SET) )
{
g_RrParam.dwBakTmA = g_RrParam.dwTmA;
g_RrParam.dwBakTmB = g_RrParam.dwTmB;
g_RrParam.wTmABSetFlag |= APHS_TMAB_BAK_SET;
}
}
VOID ApHsClrBakABPlay(VOID)
{
g_RrParam.wTmABSetFlag &= (~APHS_TMAB_BAK_SET);
}
BOOL ApHsRestoreBakABPlay(VOID)
{
if ( g_RrParam.wTmABSetFlag &APHS_TMAB_BAK_SET)
{
g_RrParam.dwTmA = g_RrParam.dwBakTmA;
g_RrParam.dwTmB = g_RrParam.dwBakTmB;
return TRUE;
}
return FALSE;
}
//=======================================================
// For auto mode, browser browser
VOID ApHsSetTextOffset(VOID)
{
SYNCDATAITEM *pSync;
UINT16 wNode;
UINT8 *pSt;
UINT8 *pEnd;
UINT32 StLine,EndLine,TopLine;
UINT16 Col;
UINT32 PageLine;
if ( ( !(g_RrParam.wRptMode&RR_MODE_NOMST) ) )
// && (g_RrParam.wRptMode & RR_MODE_AUTOMATIC ) )
{ // is have MST File
wNode=__ApHsSeekTextTimeNode(g_RrParam.aPlay[0].dwPlayTm); // to 1ms
#ifndef APHS_AUTO_KEY_VIEW_DIS
// if enable key view
if (g_RrParam.wSavekPevNode == wNode)
{ // if same node
return;
}
g_RrParam.wSavekPevNode = wNode;
#endif
pSync = (SYNCDATAITEM*) (g_RrParam.pDispBuf+sizeof(MSTFILE_HEADER));
pSt=(pSync+wNode)->dwDataOffset - g_RrParam.dwDispHead
+g_RrParam.pTextBuf;
if ( wNode < (g_RrParam.pMstFileHdr->wNodes-1))
{
pEnd=(pSync+wNode+1)->dwDataOffset - g_RrParam.dwDispHead
+g_RrParam.pTextBuf;
}
else
{
pEnd=g_RrParam.dwDispLength - g_RrParam.dwDispHead
+g_RrParam.pTextBuf;
}
PageLine=BrowserPageLineSum((MBrowser *)(g_RrParam.pBwrGui),0);
BrowserPosToLineCol((MBrowser *)(g_RrParam.pBwrGui),pSt,&StLine,&Col);
BrowserPosToLineCol((MBrowser *)(g_RrParam.pBwrGui),pEnd,&EndLine,&Col);
if (StLine == EndLine)
{ // Mend of pSt == Pend
EndLine++;
}
TopLine=BrowserGetTopLine((MBrowser *)(g_RrParam.pBwrGui));
if (StLine<=TopLine)
{// Page up
TopLine=StLine;
}
else
{// Page down
if (StLine >=(PageLine+TopLine))
{ // if txt to next page
TopLine=StLine;
}
else
{ // if part/all of txt inside the page
if ( EndLine > (PageLine+TopLine) )
{// if Part of txt inside the page
TopLine=StLine;
// if ( (EndLine-StLine) < PageLine)
// {
// TopLine =StLine-((PageLine-(EndLine-StLine))/2);
// }
}
}
}
BrowserSetTopLine((MBrowser *)(g_RrParam.pBwrGui), TopLine);
g_RrParam.dwStLine=StLine-TopLine;
g_RrParam.dwEndLine=EndLine-TopLine;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -