📄 audio_class.c
字号:
/*************************************************************************
*
* 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 + -