📄 audio.c
字号:
}
}
static void WatchTmrProc(void)
{
StopTmr(WatchTmrID);
if (WaitSignal) {
PowerDownAudio();
}
}
static void WaitScanEndTmrProc(void)
{
if(ScanFinished)
{
StopTmr(WaitScanEndTmr);
RemoveTmr(WaitScanEndTmr);
PlaySingleAudio(FALSE,TRUE,AD_huanyingshiyong); // 欢迎使用
PlaySingleAudio(FALSE,TRUE,AD_qidong);
}
}
void InitAudio(void)
{
#if DEBUG_UARTNo_AUDIO <=1
PrintFromUART(DEBUG_UARTNo_AUDIO, "InitAudio开始执行!\n");
#endif
InitRoundBuf(&PlayRound, PlayBuf, sizeof(PlayBuf),0);
InitRoundBuf(&PriorRound, PriorBuf, sizeof(PriorBuf),0);
WaitTmrID = CreateTimer(WaitTmrProc,0);
MonitorTmrID = CreateTimer(MonitorTmrProc,0);
WatchTmrID = CreateTimer(WatchTmrProc,0);
WaitScanEndTmr = CreateTimer(WaitScanEndTmrProc,0);
StartTmr(WaitScanEndTmr,Period_WaitScan);
#if NOUSEASM >0
InitISD();
#else
_InitISD();
#endif
Status = _READY;
WaitSignal = FALSE;
ScanFinished = FALSE;
AD_MAX = GetADNums(AD_MAX1);
AD_ADVOICE1 = GetADVoice1(AD_MAX1);
AD_ADVOICE2 = GetADVoice2(AD_MAX1);
InstallPermnentPort(LEDPARA_SCANAUDIO);
PowerDownAudio();
StartScanAudio();
}
void PowerDownAudio(void)
{
if ((Status & _MASK) != _POWERDOWN)
{
WriteRoundBuf(&PriorRound, OP_WAIT);
WriteRoundBuf(&PriorRound, OP_STOPPWRDN);
WriteRoundBuf(&PriorRound, OP_WAIT);
ResetRoundBuf(&PlayRound); /* 清除播放队列 */
Status &= ~_MASK;
Status |= _POWERDOWN;
WaitSignal = FALSE;
StopTmr(MonitorTmrID);
ClosePowerAmp_Speaker(); /* 强制关闭功放的语音输出通道 */
ClosePowerAmp_VoiceChip(); /* 强制关闭mic通道输出 */
StartPriorOP();
}
}
void PowerUpAudio(void)
{
if ((Status & _MASK) == _POWERDOWN)
{
WriteRoundBuf(&PriorRound, OP_POWERUP);
WriteRoundBuf(&PriorRound, OP_WAIT);
Status &= ~_MASK;
Status |= _READY;
WaitSignal = FALSE;
StopTmr(MonitorTmrID);
StartPriorOP();
}
}
void ClearAudioRound(void)
{
ResetRoundBuf(&PlayRound);
}
BOOLEAN APlaySingleAudio(BOOLEAN clear, INT8U channel, INT8U seg)
{
INT8U attr;
if (seg >= AD_MAX) return FALSE;
if (clear)
{
ResetRoundBuf(&PlayRound);
}
if (channel == 0) /* 同时选择功放和MIC输出 */
{
attr = 0x60;
}
else if (channel == 1) /* 选择功放输出 */
{
attr = 0x40;
}
else /* 选择mic输出 */
{
attr = 0x20;
}
switch (Status & _MASK)
{
case _POWERDOWN:
WriteRoundBuf(&PriorRound, OP_POWERUP);
WriteRoundBuf(&PriorRound, OP_WAIT);
WriteRoundBuf(&PriorRound, OP_POWERUP);
WriteRoundBuf(&PriorRound, OP_WAIT);
case _READY:
if ((Status & _SCANSUCCESS) == 0) {
StartScanAudio();
return FALSE;
}
else
{
WriteRoundBuf(&PlayRound, attr);
WriteRoundBuf(&PlayRound, seg);
Status &= ~_MASK;
Status |= _PLAY;
StartPriorOP();
return TRUE;
}
case _PLAY:
WriteRoundBuf(&PlayRound, attr);
WriteRoundBuf(&PlayRound, seg);
return TRUE;
default:
return FALSE;
}
}
BOOLEAN PlaySingleAudio(BOOLEAN clear, BOOLEAN fromamp, INT8U seg)
{
if (fromamp)
{
return APlaySingleAudio(clear, 1, seg);
}
else
{
return APlaySingleAudio(clear, 2, seg);
}
}
void PlayAudio(BOOLEAN clear, BOOLEAN fromamp, INT8U *ptr, INT8U len)
{
for (; len > 0; len--)
{
PlaySingleAudio(clear, fromamp, *ptr++);
if (clear) clear = FALSE;
}
}
BOOLEAN SetPlayAudioInformer(void ( *informer)(void))
{
if ((Status & _MASK) == _PLAY)
{
WriteRoundBuf(&PlayRound, 0x80);
WriteRoundBuf(&PlayRound, ((INT32U)informer) >> 24);
WriteRoundBuf(&PlayRound, ((INT32U)informer)>>16);
WriteRoundBuf(&PlayRound, ((INT32U)informer)>>8);
WriteRoundBuf(&PlayRound, ((INT32U)informer));
return TRUE;
}
else
{
return false;
}
}
BOOLEAN StartScanAudio(void)
{
switch (Status & _MASK)
{
case _POWERDOWN:
WriteRoundBuf(&PriorRound, OP_POWERUP);
WriteRoundBuf(&PriorRound, OP_WAIT);
WriteRoundBuf(&PriorRound, OP_POWERUP);
WriteRoundBuf(&PriorRound, OP_WAIT);
case _READY:
ScanSeg = 0;
ct_scan = 0;
Status &= ~_MASK;
Status |= _SCAN;
Status &= ~_SCANSUCCESS;
StartPriorOP();
return TRUE;
default:
return FALSE;
}
}
BOOLEAN RecordAudio(INT8U seg, INT8U rectime, void ( *informer)(void))
{
switch (Status & _MASK)
{
case _POWERDOWN:
WriteRoundBuf(&PriorRound, OP_POWERUP);
WriteRoundBuf(&PriorRound, OP_WAIT);
WriteRoundBuf(&PriorRound, OP_POWERUP);
WriteRoundBuf(&PriorRound, OP_WAIT);
case _READY:
CueSeg = 0x00;
RecSeg = seg;
RecTime = rectime;
Informer = informer;
Status &= ~_MASK;
Status |= _RECORD;
Status &= ~_SCANSUCCESS;
StopTmr(MonitorTmrID);
StartPriorOP();
return TRUE;
default:
return FALSE;
}
}
BOOLEAN RecordNextAudio(void)
{
return RecordAudio(RecPos, 0, 0);
}
void PrepareRecordAudio(void)
{
switch (Status & _MASK)
{
case _POWERDOWN:
PowerUpAudio();
break;
case _READY:
break;
default:
StopAudioOP();
break;
}
RecPos = 0;
}
void StopAudioOP(void)
{
switch (Status & _MASK)
{
case _PLAY:
ClosePowerAmp_Speaker();
ClosePowerAmp_VoiceChip();
ResetRoundBuf(&PlayRound);
case _RECORD:
case _SCAN:
WriteRoundBuf(&PriorRound, OP_STOP);
WriteRoundBuf(&PriorRound, OP_WAIT);
Turninto_READY();
StartPriorOP();
break;
case _READY:
Turninto_READY();
break;
case _POWERDOWN:
break;
default:
break;
}
}
void ActivateAudio(void)
{
StartPriorOP();
}
void Player_A_Number(INT8U num)
{
switch(num)
{
case 0:
PlaySingleAudio(FALSE,TRUE,AD_0);
break;
case 1:
PlaySingleAudio(FALSE,TRUE,AD_1);
break;
case 2:
PlaySingleAudio(FALSE,TRUE,AD_2);
break;
case 3:
PlaySingleAudio(FALSE,TRUE,AD_3);
break;
case 4:
PlaySingleAudio(FALSE,TRUE,AD_4);
break;
case 5:
PlaySingleAudio(FALSE,TRUE,AD_5);
break;
case 6:
PlaySingleAudio(FALSE,TRUE,AD_6);
break;
case 7:
PlaySingleAudio(FALSE,TRUE,AD_7);
break;
case 8:
PlaySingleAudio(FALSE,TRUE,AD_8);
break;
case 9:
PlaySingleAudio(FALSE,TRUE,AD_9);
break;
default:
break;
}
}
void PlayerNumbers(INT16U nums)
{
INT8U i;
INT8U temp[4];
INT16U mod;
mod = nums;
i = 4;
for(; i>0;i--)
{
temp[i-1] = GetRs(mod,i-1);
mod = GetMod(mod,i-1);
}
if(temp[3] == 0)
{
if(temp[2] == 0)
{
if(temp[1] == 0)
{
Player_A_Number(temp[0]);
}
else
{
Player_A_Number(temp[1]);
PlaySingleAudio(FALSE,TRUE,AD_ten);
Player_A_Number(temp[0]);
}
}
else
{
Player_A_Number(temp[2]);
Player_A_Number(temp[1]);
Player_A_Number(temp[0]);
}
}
else
{
Player_A_Number(temp[3]);
Player_A_Number(temp[2]);
Player_A_Number(temp[1]);
Player_A_Number(temp[0]);
}
}
#if DEBUG_UARTNo_AUDIO >1
INT16U DebugSendop(INT8U op, INT16U addr)
{
#if NOUSEASM >0
return SendISDOP(op, addr);
#else
return _SendISDOP(op, addr);
#endif
}
void DebugSendPlayer(INT8U type)
{
Send_SETPLAY(type);
}
void HdlPlayerAscend(void)
{
INT8U i;
for(i =0;i<AD_MAX;i++)
{
PlaySingleAudio(FALSE, TRUE, i);
}
}
void HdlPlayerDescend(void)
{
INT8U i;
i = AD_MAX -1;
for(;i>0;i--)
{
PlaySingleAudio(FALSE, TRUE, i);
}
PlaySingleAudio(FALSE, TRUE, 0);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -