📄 tg.c
字号:
/*-------------------------------------------------------------------------*
* *
* THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY *
* INFORMATION. IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES: *
* "COPYRIGHT 2001 MICHAEL TSIROULNIKOV, ALL RIGHTS RESERVED" *
* *
*-------------------------------------------------------------------------*/
#if ! defined (_dsp)
void indicate_start(void);
void indicate_end(void);
#include <memory.h>
#else
#include <string.h> /* memcpy () */
#endif
#include "tg.h"
extern void tg_add_sine2(TG_tTone *pTone, S16 *pOut);
/*--------------------- local defs ----------------------------------------*/
/*--------------------- public vars ---------------------------------------*/
/*--------------------- local vars ----------------------------------------*/
/*--------------------- local functions -----------------------------------*/
/*--------------------- public functions ---------------------------------*/
/*-------------------------------------------------------------------------*/
void TG_MIKET_init_db
/*-------------------------------------------------------------------------*/
(
TG_tDb *pDb
)
{
memset(pDb, 0, sizeof(TG_tDb));
}
/*-------------------------------------------------------------------------*/
void TG_MIKET_control
/*-------------------------------------------------------------------------*/
(
TG_tDb *pDb,
S16 sCmd,
ITG_Status *pCfg
)
{
switch (sCmd)
{
case ITG_CMD_NONE:
break;
case ITG_CMD_RESET:
/* reset phase */
pDb->Lo.sPhase = 0;
pDb->Hi.sPhase = 0;
pDb->sState = 0;
break;
case ITG_CMD_TONE:
/* copy cfg */
pDb->Cfg = *pCfg;
/* setup freq */
pDb->Lo.sFreq = pCfg->Lo.sFreq;
pDb->Hi.sFreq = pCfg->Hi.sFreq;
if (pDb->Cfg.sPreSilenceDuration > 0)
{
/* setup for PRE_SILENCE */
pDb->sState = ITG_ST_PRE_SILENCE;
pDb->sCurrFrame = pDb->Cfg.sPreSilenceDuration;
pDb->Lo.sAmp = 0;
pDb->Hi.sAmp = 0;
}
else
{
pDb->sState = ITG_ST_SIGNAL;
pDb->sCurrFrame = pDb->Cfg.sSignalDuration;
pDb->Lo.sAmp = pDb->Cfg.Lo.sAmp;
pDb->Hi.sAmp = pDb->Cfg.Hi.sAmp;
}
break;
}
pCfg->State = pDb->sState;
}
/*-------------------------------------------------------------------------*/
S16 TG_MIKET_process
/*-------------------------------------------------------------------------*/
/* function returns zero when work has been done */
(
TG_tDb *pDb,
TG_tSc *pSc,
S16 *pOut
)
{
/* copy data from Db into Scratch */
memcpy(pSc, pDb, sizeof(TG_tDb));
switch (pSc->sState)
{
case ITG_ST_IDLE:
/* do nothing in idle state */
break;
case ITG_ST_PRE_SILENCE:
--pSc->sCurrFrame;
if (pSc->sCurrFrame <= 0)
{
pSc->sState = ITG_ST_SIGNAL;
pSc->sCurrFrame = pSc->Cfg.sSignalDuration;
pSc->Lo.sAmp = pSc->Cfg.Lo.sAmp;
pSc->Hi.sAmp = pSc->Cfg.Hi.sAmp;
#if ! defined (_dsp)
indicate_start();
#endif
}
break;
case ITG_ST_SIGNAL:
tg_add_sine2(&pSc->Lo, pOut);
tg_add_sine2(&pSc->Hi, pOut);
if (pSc->Cfg.sSignalDuration < 0)
{
/* forever */
}
else
{
--pSc->sCurrFrame;
if (pSc->sCurrFrame <= 0)
{
if (pSc->Cfg.sPostSilenceDuration > 0)
{
pSc->sState = ITG_ST_POST_SILENCE;
pSc->sCurrFrame = pSc->Cfg.sPostSilenceDuration;
}
else
{
pSc->sState = ITG_ST_IDLE;
}
pSc->Lo.sAmp = 0;
pSc->Hi.sAmp = 0;
#if ! defined (_dsp)
indicate_end();
#endif
}
}
break;
case ITG_ST_POST_SILENCE:
--pSc->sCurrFrame;
if (pSc->sCurrFrame <= 0)
{
pSc->sState = ITG_ST_IDLE;
}
break;
default:
/* log err ??? */
break;
} /* end-of-switch */
/* copy data from Db into Scratch */
memcpy(pDb, pSc, sizeof(TG_tDb));
return pSc->sState;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -