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

📄 aphearsaysub.c

📁 本电子词典是名人928的学习机代码,主要是电子学习机AP,其他还没有传
💻 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 + -