📄 aaci_audio.c
字号:
if (lpFormat->nChannels == 1)
pfnGetFIFO = GetFIFO_M8;
else
pfnGetFIFO = GetFIFO_S8;
}
else
{
if (lpFormat->nChannels == 1)
pfnGetFIFO = GetFIFO_M16;
else
pfnGetFIFO = GetFIFO_S16;
}
// NOTE: By default only the MIC will be active for recording, you
// need to use the RECORD_SELECT codec register to change this
// Set up input gain to something reasonable (not too high so as to
// reduce signal chopping)
//yz_add
// AACI_CodecWrite16( 0x1c, 0x0000 );
// Set input sample rate
AACI_CodecWrite16( LM4549A_PCM_ADC_RATE,//采样频率
(USHORT)lpFormat->nSamplesPerSec );
AACI_RegWrite32( AACIReg_Channel1RxControl,
AACI_RegRead32(AACIReg_Channel1RxControl) &
(~AACIBit_EnableFIFO) );
// Clear any interrupts
AACI_RegWrite32( AACIReg_IntClear, AACIBit_RxTOFEC1 | AACIBit_RxOEC1 );
// Enable Receive
AACI_RegWrite32( AACIReg_Channel1RxControl,
AACI_RegRead32(AACIReg_Channel1RxControl) |
AACIBit_EnableFIFO );
//if(lpFormat->nChannels == 1)
if(lpFormat->nChannels == 1)
{
/*
RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel v10: %x \r\n") ,
AACI_RegRead32(AACIReg_Channel1RxControl)));
AACI_RegWrite32( AACIReg_Channel1RxControl,
AACI_RegRead32(AACIReg_Channel1RxControl) |AACIBit_EnableFIFO );
//AACIBit_EnableFIFO&(~0x10) );
RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel v10: %x \r\n") ,
AACI_RegRead32(AACIReg_Channel1RxControl)& (~0x10)));
*/
AACI_RegWrite32( AACIReg_Channel1RxControl,
AACI_RegRead32(AACIReg_Channel1RxControl)& (~0x08) );
/*
RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel v11: %x \r\n") ,
AACI_RegRead32(AACIReg_Channel1RxControl)));
*/
}
else
{
/*
RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel 2: %x \r\n") ,
AACI_RegRead32(AACIReg_Channel1RxControl)));
*/
AACI_RegWrite32( AACIReg_Channel1RxControl,
AACI_RegRead32(AACIReg_Channel1RxControl) |
AACIBit_EnableFIFO|0x08 );
/*
RETAILMSG(1,(TEXT("AACIReg_Channel1RxControl channel 2: %x \r\n") ,
AACI_RegRead32(AACIReg_Channel1RxControl)));
*/
}
//#endif
OnRecordOpen();
}
EXIT:
FUNC_WPDD("-AACI_WaveOpen");
// OnOpen();
//memset( MsgRecord , 0 , sizeof( MsgRecord ) );
//KernelIoControl( IOCTL_HAL_FREE_DMA_SYSINTR +1 , 0 , 0 , 0 , 0 , 0 );
return(mmRet);
}
// -----------------------------------------------------------------------------
// VOID AACI_WaveClose(WAPI_INOUT apidir)
//
// Closes the Wave Stream.
// Sets the "In use" flag to FALSE;
// -----------------------------------------------------------------------------
VOID AACI_WaveClose(WAPI_INOUT apidir)
{
FUNC_WPDD("AACI_WaveClose()");
//RETAILMSG(yz_debug,(TEXT("AACI_WaveClose()\r\n")));
if( apidir == WAPI_OUT )
{
OnPlayClose();
}
else
OnRecordClose();
/*
VERBOSEMSG("AACI_WaveClose: WAPI_OUT");
//yz_change
p_n = 0;
// Mute PCM and Line Level
AACI_CodecWrite16( LM4549A_PCM_OUT_VOL, LM4549A_BIT_VOLUME_MUTE );
AACI_CodecWrite16( LM4549A_LINE_LEV_OUT_VOL, LM4549A_BIT_VOLUME_MUTE );
}
else
{
VERBOSEMSG("AACI_WaveClose: WAPI_IN");
// Mute input gain
AACI_CodecWrite16( LM4549A_RECORD_GAIN, LM4549A_BIT_VOLUME_MUTE );
}
*/
g_pwfx[apidir] = NULL;
g_fInUse[apidir] = FALSE;
/*
if( MsgCount )
{
int i;
for( i=0; i<MsgCount; i++ )
RETAILMSG( 1 , (TEXT("physiaddr : %x , %x: \r\n") , MsgRecord[i][0] , MsgRecord[i][1]));
}
*/
//yz_add
//fclose(DebugFile);
//KernelIoControl( IOCTL_HAL_FREE_DMA_SYSINTR +2 , 0 , 0 , 0 , 0 , 0 );
// OnClose();
FUNC_WPDD("-AACI_WaveClose");
}
// -----------------------------------------------------------------------------
// VOID AACI_WaveStart(WAPI_INOUT apidir, PWAVEHDR pwh)
//
// Starts playback or record. Also called when overflow or underflow occurs to
// re-synchoronise.
// -----------------------------------------------------------------------------
VOID AACI_WaveStart(WAPI_INOUT apidir, PWAVEHDR pwh)
{
FUNC_WPDD("+AACI_WaveStart");
// We are now running
g_dwRunMode[apidir] = RUNMODE_RUNNING;
// Start by assuming we have more data to send/get
gv_fMoreData[apidir] = TRUE;
// Make sure the CODEC is on
PowerUp();
#ifdef AACI_STATS
g_dwBytesRecorded[apidir] = 0;
#endif
if( apidir == WAPI_OUT )
{
// We havn't got to the end yet!
g_fTxEndOfData = FALSE;
// Disable Transmit
AACI_RegWrite32( AACIReg_Channel1TxControl,
AACI_RegRead32(AACIReg_Channel1TxControl) &
(~AACIBit_EnableFIFO) );
// Fill up the FIFO
(*pfnFillFIFO)(pwh);
// Clear any interrupts
AACI_RegWrite32( AACIReg_IntClear, AACIBit_TxUEC1 );
// Enable Transmit
AACI_RegWrite32( AACIReg_Channel1TxControl,
AACI_RegRead32(AACIReg_Channel1TxControl) |
AACIBit_EnableFIFO );
OnPlayStart();
}
else // (apidir == WAPI_IN)
{
// Disable Receive
AACI_RegWrite32( AACIReg_Channel1RxControl,
AACI_RegRead32(AACIReg_Channel1RxControl) &
(~AACIBit_EnableFIFO) );
// Clear any interrupts
AACI_RegWrite32( AACIReg_IntClear, AACIBit_RxTOFEC1 | AACIBit_RxOEC1 );
// Enable Receive
AACI_RegWrite32( AACIReg_Channel1RxControl,
AACI_RegRead32(AACIReg_Channel1RxControl) |
AACIBit_EnableFIFO );
OnRecordStart();
}
FUNC_WPDD("-AACI_WaveStart");
}
// -----------------------------------------------------------------------------
// VOID AACI_WaveContinue (WAPI_INOUT apidir, PWAVEHDR pwh)
//
// Continues playback or record, will be called straight after GetInterrupt
// returns PLAYING or RECORDING status.
// -----------------------------------------------------------------------------
VOID AACI_WaveContinue (WAPI_INOUT apidir, PWAVEHDR pwh)
{
#if 0
while( pwh != NULL && pwh->dwBytesRecorded >= pwh->dwBufferLength )
{
pwh = pwh->lpNext;
}
RETAILMSG(DBG_AACI,(TEXT("AACI_WaveContinue()\r\n")));
if( pwh == NULL )
{
gv_fMoreData[apidir] = FALSE;
RETAILMSG(DBG_AACI,(TEXT("AACI_WaveContinue() - NULL\r\n")));
}
else
{
if (apidir == WAPI_OUT)
{
// Output these messages under test as they slow things down if
// on most of the time
TESTMSG("AACI_WaveContinue: WAPI_OUT");
//yz_change for DMA
//(*pfnFillFIFO)(pwh);
//Disable Tx Interrupt
AACI_RegWrite32( AACIReg_Channel1IntEnable,
AACI_RegRead32( AACIReg_Channel1IntEnable ) &
~(AACIBit_TxCIE | AACIBit_TxIE | AACIBit_TxUIE) );
// Clear any transmit underruns now we have filled the FIFO
if( AACI_RegRead32( AACIReg_Channel1Status ) & AACIBit_TXUnderrun )
{
TESTMSG("AACI_WaveContinue: Transmit Underrun - too slow!");
AACI_RegWrite32( AACIReg_IntClear, AACIBit_TxUEC1 );
}
}
else // (apidir == WAPI_IN)
{
TESTMSG("AACI_WaveContinue: WAPI_IN");
(*pfnGetFIFO)(pwh);
// Clear any receive overruns now we have emptied the FIFO
if( AACI_RegRead32( AACIReg_Channel1Status ) & AACIBit_RXOverrun )
{
TESTMSG("AACI_WaveContinue: Receive Overrun - too slow!");
AACI_RegWrite32( AACIReg_IntClear, AACIBit_RxOEC1 );
}
}
}
#endif
}
//-------------------------------------------------------
// VOID AACI_WaveEndOfData(WAPI_INOUT apidir)
//
// Signals we have no more data to play
// (only called for WAPI_OUT).
//-------------------------------------------------------
VOID AACI_WaveEndOfData(WAPI_INOUT apidir)
{
#if 0
FUNC_WPDD("+AACI_WaveEndOfData");
RETAILMSG( yz_debug, (TEXT("AACI_WaveEndOfData()\r\n")));
if( apidir == WAPI_OUT )
{
g_fTxEndOfData = TRUE;
// Once we get this, we won't be given any more data to play
gv_fMoreData[WAPI_OUT] = FALSE;
// Cause one final interrupt to make the driver return a STOPPED status
DmaCmd = DMA_CMD_STOP;
SetEvent( hAudioInterrupt );
}
FUNC_WPDD("-AACI_WaveEndOfData");
#endif
}
//-------------------------------------------------------
// VOID AACI_WaveStop(WAPI_INOUT apidir)
//
// Stops the wave stream.
//-------------------------------------------------------
VOID AACI_WaveStop(WAPI_INOUT apidir)
{
//FILE *f_in;
FUNC_WPDD("+AACI_WaveStop");
//RETAILMSG(yz_debug, (TEXT("AACI_WaveStop()\r\n")));
// No more data to play
gv_fMoreData[apidir] = FALSE;
if( g_dwRunMode[apidir] != RUNMODE_STOPPED )
{
g_dwRunMode[apidir] = RUNMODE_STOPPED;
if( apidir == WAPI_OUT )
{
OnPlayStop();
//yz_change for DMA
/*
// Disable the AACI Transmit interrupts
AACI_RegWrite32( AACIReg_Channel1IntEnable,
AACI_RegRead32( AACIReg_Channel1IntEnable ) &
~(AACIBit_TxCIE | AACIBit_TxIE | AACIBit_TxUIE) );
*/
/*
//yz_add for test
f_in = fopen("\\windows\\hello_world.wav", "rb");
if(f_in == NULL)
RETAILMSG(1, (TEXT("PDD_DMAThread() - file open FAILED!\r\n")));
if((fread(total_buf, sizeof( char ), 200000, f_in)) != 200000)
RETAILMSG(1, (TEXT("PDD_DMAThread() - file read Error! %d\r\n")));
MMC_StartDMA(2, 0x10004090, total_buf, 200000);
fclose(f_in);
RETAILMSG(1, (TEXT("AACI_WaveStop(): File read done!\r\n")));
*/
if( !ClearTransmitFIFO() )
{
ERRMSG("AACI_WaveStop: Failed to clear Transmit FIFO");
}
RETAILMSG( DBG_AACI , (TEXT("aaci : stop\r\n")));
}
else // (apidir == WAPI_IN)
{
BOOL fCleared;
// Disable the AACI Receive interrupts
AACI_RegWrite32( AACIReg_Channel1IntEnable,
AACI_RegRead32( AACIReg_Channel1IntEnable ) &
~(AACIBit_RxIE | AACIBit_RxOIE |
AACIBit_RxTIE | AACIBit_RxTOIE) );
// Clear the receive FIFO
fCleared = ClearReceiveFIFO(NULL);
if( !fCleared )
{
ERRMSG("AACI_WaveStop: Failed to clear Receive FIFO");
}
OnRecordStop();
}
}
FUNC_WPDD("-AACI_WaveStop");
}
// -----------------------------------------------------------------------------
// VOID AACI_Standby (WAPI_INOUT apidir)
//
// Called between playing sounds to save power
// -----------------------------------------------------------------------------
VOID AACI_Standby(WAPI_INOUT apidir)
{
FUNC_WPDD("+AACI_Standby");
// Make sure we have stopped
AACI_WaveStop(apidir);
if( (g_dwRunMode[WAPI_OUT] == RUNMODE_STOPPED) &&
(g_dwRunMode[WAPI_IN] == RUNMODE_STOPPED) )
{
// Power down device
PowerDown();
}
RETAILMSG( DBG_AACI, (TEXT("aaci : standby\r\n")));
FUNC_WPDD("-AACI_Standby");
}
//---------------------------------------------------------
// VOID AACI_Deinitialize(VOID)
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -