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

📄 audio.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
}

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 + -