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

📄 audio_class.c

📁 包含了NXP众多的MCU的例子程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************
 *
 *    Used with ICCARM and AARM.
 *
 *    (c) Copyright IAR Systems 2005
 *
 *    File name   : audio_class.c
 *    Description : AUDIO CLASS module
 *
 *    History :
 *    1. Data        : November 29, 2005
 *       Author      : Stanimir Bonev
 *       Description : Create
 *
 *    $Revision: 1.1.2.2 $
**************************************************************************/
#include "audio_class.h"

volatile Boolean SempEna,MicEna;
Int32U  SempCount,SempPeriod,Delta,MicCurrBuffer;
pInt16S pSpkData,pMicData;
Int32U  SempPerCurrHold,DeltaPer,MicSempCount;

const Int32U VolumeMul [] =
{
  // 256 - 0
  //-48dB- 0x0
  261,
  //-47dB- 0x1
  293,
  //-46dB- 0x2
  328,
  //-45dB- 0x3
  369,
  //-44dB- 0x4
  414,
  //-43dB- 0x5
  464,
  //-42dB- 0x6
  521,
  //-41dB- 0x7
  584,
  //-40dB- 0x8
  655,
  //-39dB- 0x9
  735,
  //-38dB- 0xA
  825,
  //-37dB- 0xB
  926,
  //-36dB- 0xC
  1039,
  //-35dB- 0xD
  1165,
  //-34dB- 0xE
  1308,
  //-33dB- 0xF
  1467,
  //-32dB- 0x10
  1646,
  //-31dB- 0x11
  1847,
  //-30dB- 0x12
  2072,
  //-29dB- 0x13
  2325,
  //-28dB- 0x14
  2609,
  //-27dB- 0x15
  2927,
  //-26dB- 0x16
  3285,
  //-25dB- 0x17
  3685,
  //-24dB- 0x18
  4135,
  //-23dB- 0x19
  4640,
  //-22dB- 0x1A
  5206,
  //-21dB- 0x1B
  5841,
  //-20dB- 0x1C
  6554,
  //-19dB- 0x1D
  7353,
  //-18dB- 0x1E
  8250,
  //-17dB- 0x1F
  9257,
  //-16dB- 0x20
  10387,
  //-15dB- 0x21
  11654,
  //-14dB- 0x22
  13076,
  //-13dB- 0x23
  14672,
  //-12dB- 0x24
  16462,
  //-11dB- 0x25
  18471,
  //-10dB- 0x26
  20724,
  //-9dB - 0x27
  23253,
  //-8dB - 0x28
  26090,
  //-7dB - 0x29
  29274,
  //-6dB - 0x2A
  32846,
  //-5dB - 0x2B
  36854,
  //-4dB - 0x2C
  41350,
  //-3dB - 0x2D
  46396,
  //-2dB - 0x2E
  52057,
  //-1dB - 0x2F
  58409,
  // 0dB - 0x30
  65536,
  // 1dB - 0x31
  73533,
  // 2dB - 0x32
  82505,
  // 3dB - 0x33
  92572,
  // 4dB - 0x34
  103868,
  // 5dB - 0x35
  116541,
  // 6dB - 0x36
  130762,
};

#pragma segment="DMA_RAM"
#pragma location="DMA_RAM"
#pragma data_alignment=4
__no_init Int16S AudioSpkData[SempRerFrame * 3];

#pragma location="DMA_RAM"
#pragma data_alignment=4
__no_init Int16S AudioMicData1[SempRerFrame * 2];

#pragma location="DMA_RAM"
#pragma data_alignment=4
__no_init Int16S AudioMicData2[SempRerFrame * 2];

#pragma location="DMA_RAM"
#pragma data_alignment=4
__no_init DmaIsoPacket_t DmaSpkIsoPacket;

#pragma location="DMA_RAM"
#pragma data_alignment=4
__no_init DmaIsoPacket_t DmaMicIsoPacket;

#pragma data_alignment=4
Int8U AudioBuf[2];

Int8U   AudioRequest,AudioCS,AudioCN,AudioId;
Int16U  AudioDataSize;

Int16S  AudioFeat1Vol;
Int32U  AudioSpkVolMul;
Boolean AudioFeat1Mute;

Int16S  AudioFeat2Vol;
Int32U  AudioMicVolMul;
Boolean AudioFeat2Mute;


/*************************************************************************
 * Function Name: AudioClassInit
 * Parameters: none
 *
 * Return: none
 *
 * Description: USB Class Audio Init
 *
 *************************************************************************/
void AudioClassInit (void)
{
  // Init Audio Class variables
  SempEna         =\
  AudioFeat1Mute  =\
  AudioFeat2Mute  = FALSE;
  SempCount       =\
  AudioFeat1Vol   =\
  AudioFeat2Vol   = 0;
  pSpkData        = AudioSpkData;
  SempPerCurrHold = SempPeriod;

  // Registered The Class Request
  UsbCoreUserFuncRegistered(UsbClassAudioRequest,UsbUserClass);
  // Registered User Ep0 Data receive
  UsbCoreUserFuncRegistered(UsbClassAudioData,UsbClassEp0OutPacket);

  // DAC Init
  PINSEL1_bit.P0_25 = 2;
  DACR_bit.VALUE = 0x200;
  // ADC 0.3 Init
  PINSEL1_bit.P0_30 = 1;
  // ADC clk = 60MHz/14, Ch3
  AD0CR = (1<<21) + (14 << 8) + (1<<3);

  // Init System Timer - Timer0
  TIMER_Init(TIMER0, TIMER_PRECISION);
  SempPeriod = (1 sec_T0)/SampFreq;
  DeltaPer = SempPeriod/(SempRerFrame*2);
  TIMER_SetMatchAction(TIMER0, CH0, TimerAction_Interrupt | TimerAction_ResetTimer,
  SempPeriod, NULL, NULL, DONOTHING);
  VIC_EnaFastInt(1<<VIC_TIMER0);
  VIC_EnableInt (1<<VIC_TIMER0);
}

/*************************************************************************
 * Function Name: UsbClassAudioConfigure
 * Parameters:  void * pArg
 *
 * Return: void *
 *
 * Description: USB Class Audio configure
 *
 *************************************************************************/
void * UsbClassAudioConfigure (void * pArg)
{
UsbDevCtrl_t * pUsbDevCtrl = (UsbDevCtrl_t *)pArg;
  if(pUsbDevCtrl == NULL)
  {
    if(UsbCoreReq(UsbCoreReqConfiquration) != 0)
    {
      MicEna = FALSE;
      // disable all class EPs
      USB_RealizeEndPoint((USB_Endpoint_t)SpkEp,1,0,FALSE);
      USB_UserFuncRegistered(NULL,SpkEp);
      USB_RealizeEndPoint((USB_Endpoint_t)MicEp,1,0,FALSE);
      USB_UserFuncRegistered(NULL,MicEp);
    }
  }
  else
  {
    if((pUsbDevCtrl->Configuration == 1))
    {
      if(pUsbDevCtrl->Interface == 1)
      {
        if(pUsbDevCtrl->AlternateSetting == 0)
        {
          USB_RealizeEndPoint((USB_Endpoint_t)SpkEp,1,0,FALSE);
          USB_UserFuncRegistered(NULL,SpkEp);
        }
        else if (pUsbDevCtrl->AlternateSetting == 1)
        {
          // Realize Class EPs
          USB_RealizeEndPoint((USB_Endpoint_t)SpkEp,1,SpkEpMaxSize, FALSE);
          USB_DmaInitTransfer((USB_Endpoint_t)SpkEp,SpkDDInd,(pInt32U)AudioSpkData,0,1,&DmaSpkIsoPacket,TRUE);
          USB_UserFuncRegistered(AudioInHadler,SpkEp);
        }
      }
      else if (pUsbDevCtrl->Interface == 2)
      {
        if(pUsbDevCtrl->AlternateSetting == 0)
        {
          MicEna = FALSE;
          USB_RealizeEndPoint((USB_Endpoint_t)MicEp,1,0,FALSE);
          USB_UserFuncRegistered(NULL,MicEp);
        }
        else if (pUsbDevCtrl->AlternateSetting == 1)
        {
          // Realize Class EPs
          USB_RealizeEndPoint((USB_Endpoint_t)MicEp ,1,MicEpMaxSize, FALSE);
          USB_UserFuncRegistered(AudioOutHadler,MicEp);
          pMicData = AudioMicData1;
          DmaMicIsoPacket.PacketLength = 0;
          USB_DmaInitTransfer((USB_Endpoint_t)MicEp,
                               MicDDInd,
                              (pInt32U)&AudioMicData1,
                               0,
                               1,
                              &DmaMicIsoPacket,
                               TRUE);
          MicCurrBuffer = 0;
          MicEna = TRUE;
        }
      }
    }
  }
  return(NULL);
}

/*************************************************************************
 * Function Name: AudioInHadler
 * Parameters:  void * pArg
 *
 * Return: none
 *
 * Description: USB Class Audio Out EP handler
 *
 *************************************************************************/
void AudioInHadler (void *Arg)
{
Int32U IntHold;
pUSB_DmaDesc_t pSpkDD = USB_DmaGetDesc(SpkDDInd);
Int32U ReceievedBytes = DmaSpkIsoPacket.PacketLength;

  if(ReceievedBytes)
  {
    pSpkData += ReceievedBytes/sizeof(Int16U);
    if(pSpkData >= AudioSpkData + sizeof(AudioSpkData)/sizeof(Int16U))
    {
      pSpkData = AudioSpkData;
    }

    if(SempEna)
    {
      // Adapt sample rate
      if (Delta > (SempRerFrame * SubFrameSize))
      {
        SempPerCurrHold = SempPeriod - DeltaPer;
      }
      else if (Delta < (SempRerFrame * SubFrameSize))
      {
        SempPerCurrHold = SempPeriod + DeltaPer;
      }
      else
      {
        SempPerCurrHold = SempPeriod;
      }
    }
    else
    {
      if(pSpkData >= (AudioSpkData + (2*sizeof(AudioSpkData))/(3*sizeof(Int16U))))
      {
        // Enable output
        SempCount = 0;
        SempEna   = TRUE;
      }
    }

    IntHold = disable_interrupts();
    Delta  += ReceievedBytes;
    restore_interrupts(IntHold);

  }
  // Load speaker buffer
  pSpkDD->pDmaBuffer    = (pInt32U)pSpkData;
  pSpkDD->pDmaIsoPacket = &DmaSpkIsoPacket;
  USB_DmaRestattTransfer((USB_Endpoint_t)SpkEp,SpkDDInd);
}

/*************************************************************************
 * Function Name: AudioOutHadler
 * Parameters:  void * pArg
 *
 * Return: none
 *
 * Description: USB Class Audio In EP handler
 *
 *************************************************************************/
void AudioOutHadler (void *Arg)
{
Int32U IntHold;
  if(MicEna)
  {
    IntHold = disable_interrupts();
    // Set pointer to free buffer
    if(++MicCurrBuffer & 1)
    {
      DmaMicIsoPacket.PacketLength = (Int32U)pMicData - (Int32U)AudioMicData1;
      pMicData = AudioMicData2;
    }
    else
    {
      DmaMicIsoPacket.PacketLength = (Int32U)pMicData - (Int32U)AudioMicData2;
      pMicData = AudioMicData1;
    }

    // Send microphone output buffer
    restore_interrupts(IntHold);
    USB_DmaInitTransfer((USB_Endpoint_t)MicEp,
                         MicDDInd,
                        (pInt32U)((MicCurrBuffer & 1)?AudioMicData1:AudioMicData2),
                         0,
                         1,
                        &DmaMicIsoPacket,
                         TRUE);
  }
}

/*************************************************************************
 * Function Name: fiq_handler
 * Parameters: none
 *
 * Return: none
 *
 * Description:
 *		
 *************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -