📄 audio.c
字号:
DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader 0x%8.8X\r\n"), WaveResource->WaveHeader));
if (WaveResource->WaveHeader) DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader->lpData 0x%8.8X\r\n"), WaveResource->WaveHeader->lpData));
DEBUGMSG(1, (TEXT("** WaveResource->WaveFormat 0x%8.8X\r\n"), WaveResource->WaveFormat));
DEBUGMSG(1, (TEXT("** WaveResource->WaveDirection 0x%8.8X\r\n"), WaveResource->WaveDirection));
DEBUGMSG(1, (TEXT("** WaveResource->MoreData 0x%8.8X\r\n"), WaveResource->MoreData));
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Control 0x%8.8X\r\n"), WaveResource->DmaRegPtr->Control));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Status 0x%8.8X\r\n"), WaveResource->DmaRegPtr->Status));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Remain 0x%8.8X\r\n"), WaveResource->DmaRegPtr->Remain));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->MaxCnt0 0x%8.8X\r\n"), WaveResource->DmaRegPtr->MaxCnt0));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Base0 0x%8.8X\r\n"), WaveResource->DmaRegPtr->Base0));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Current0 0x%8.8X\r\n"), WaveResource->DmaRegPtr->Current0));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->MaxCnt1 0x%8.8X\r\n"), WaveResource->DmaRegPtr->MaxCnt1));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Base1 0x%8.8X\r\n"), WaveResource->DmaRegPtr->Base1));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr->Current1 0x%8.8X\r\n"), WaveResource->DmaRegPtr->Current1));
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved1 0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved1));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved2 0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved2));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved3 0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved3));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACDR4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACDR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRXCR4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRXCR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACTXCR4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACTXCR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSR4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRISR4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRISR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACISR4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACISR4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIE4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIE4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->Reserved4 0x%8.8X\r\n"), WaveDevice->AacRegPtr->Reserved4));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACS1DATA 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACS1DATA));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACS2DATA 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACS2DATA));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACS12DATA 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACS12DATA));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRGIS 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRGIS));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACGIS 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACGIS));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACIM 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACIM));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACEOI 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACEOI));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACGCR 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACGCR));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACRESET 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACRESET));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACSYNC 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACSYNC));
DEBUGMSG(1, (TEXT("** WaveDevice->AacRegPtr->AACGCIS 0x%8.8X\r\n"), WaveDevice->AacRegPtr->AACGCIS));
DEBUGMSG(1, (TEXT("*************************************** WaveOpen()\r\n")));
DEBUGMSG(1, (TEXT("\r\n")));
ErrorReturn:
return ReturnValue;
}
static
MMRESULT
WaveClose(
IN OUT PWAVE_RESOURCE WaveResource
)
/*++
Routine Description:
Closes a wave stream. This routine is dispatched by PDD_WaveProc. It is
expected that for every call to WaveOpen that succeeds, there will be one
and only one call to this routine.
Arguments:
WaveResource - Pointer to the wave resources structure corresponding to
the stream to be closed.
Return Value:
Returns an MMRESULT. MMSYSERR_NOERROR is returned on success.
--*/
{
MMRESULT ReturnValue;
DEBUGMSG(1, (TEXT("WaveClose:\r\n")));
ReturnValue = MMSYSERR_ERROR;
//
// Verify that the resource was allocated and deallocate it by marking it
// as unused.
//
if (WaveResource->InUse == TRUE) {
if( WaveResource->WaveDirection == WAPI_OUT)
WaitForDmaComplete(WaveResource);
WaveResource->InUse = FALSE;
}
else {
DEBUGMSG(1, (TEXT("WaveClose: Tried to close unallocated stream.\r\n")));
goto ErrorReturn;
}
ReturnValue = MMSYSERR_NOERROR;
ErrorReturn:
return ReturnValue;
}
static
VOID
WaveStandby(
IN OUT PWAVE_RESOURCE WaveResource
)
/*++
Routine Description:
Powers down the devices associated with the specified direction. This is
dispatched by PDD_WaveProc. The MDD will call into PDD_WaveProc to have
this routine run when either of the AUDIO_STATE_OUT_STOPPED or
AUDIO_STATE_IN_STOPPED flags are returned.
Arguments:
WaveResource - Pointer to the wave resouces structure corresponding to the
wave stream that is to be placed in standby.
Return Value:
None.
--*/
{
ShutdownDma(WaveResource);
ClearDmaStatus(WaveResource);
}
//
// Exported Routines (PDD Interface).
//
AUDIO_STATE
PDD_AudioGetInterruptType(
VOID
)
{
AUDIO_STATE PendingInterrupts = 0;
ULONG Interrupt;
ULONG CurState = 0;
ULONG NextBuf = 0;
ULONG Status;
BOOLEAN DmaInterrupt;
DMA_CHANNEL_REG* OutputDmaRegPtr;
DMA_CHANNEL_REG* InputDmaRegPtr;
OutputDmaRegPtr = WaveDevice->DmaCtrlOutput;
InputDmaRegPtr = WaveDevice->DmaCtrlInput;
//
// For each of input and output, read the DMA status registers to see if
// there is a pending interrupt. Depending on whether or not there is a
// pending interrupt and if there is more data to play/record, various
// flags are ORed into the audio state to be returned to the MDD.
//
//
// Wave Input
//
Interrupt = READ_REGISTER_ULONG(&InputDmaRegPtr->Status);
CurState = (Interrupt >> 4) & 0x3;
NextBuf = (Interrupt >> 6) & 0x1;
Interrupt = Interrupt & (DMA_INT_STALLINT | DMA_INT_NFBINT | DMA_INT_CHERRINT);
DmaInterrupt = (Interrupt) ? TRUE : FALSE;
Status = READ_REGISTER_ULONG(&InputDmaRegPtr->Status);
#if 1
if ( DmaInterrupt ) {
DEBUGMSG(1, (TEXT("GetIntType:In: Interrupt=%X Status=%X CurState=0x%x NextBuf=0x%x\r\n"),Interrupt,Status,CurState,NextBuf));
WaveInResource->NextDMABuf = NextBuf;
// Clear the interrupt register
WRITE_REGISTER_ULONG(&InputDmaRegPtr->Interrupt, Interrupt);
Drv_AHBBus_ExtraWrite();
// Wave input interrupt has occurred
if (Interrupt & DMA_STATUS_STALL) {
if( WaveInResource->MoreData ) {
DEBUGMSG(1, (TEXT("GetIntType: WaveIn DMA OVERFLOW\r\n")));
PendingInterrupts |= AUDIO_STATE_IN_OVERFLOW;
}
else {
//
// Higher layer has stopped recording, switch off DMAs
// indicate new audio state as stopped
//
DEBUGMSG(1, (TEXT("GetIntType: WavIn stopped\r\n")));
PendingInterrupts |= AUDIO_STATE_IN_STOPPED;
WRITE_REGISTER_ULONG(&InputDmaRegPtr->Control, 0 );
Drv_AHBBus_ExtraWrite();
} // endif( WaveInResource->MoreData )
}
else {
if( WaveInResource->MoreData )
{
//
// More data wanted, so keep recording
//
DEBUGMSG(1, (TEXT("GetIntType: WavIn more data.\r\n")));
PendingInterrupts |= AUDIO_STATE_IN_RECORDING;
} // endif( WaveInResource->MoreData )
else
{
//
// Higher layer has stopped recording, switch off DMAs
// indicate new audio state as stopped
//
DEBUGMSG(1, (TEXT("GetIntType: WavIn stopped\r\n")));
PendingInterrupts |= AUDIO_STATE_IN_STOPPED;
WRITE_REGISTER_ULONG(&InputDmaRegPtr->Control, 0 );
Drv_AHBBus_ExtraWrite();
} // endif( WaveInResource->MoreData )
} // endif (Interrupt & DMA_STATUS_STALL)
goto ReturnWaveStatus;
} // endif( DmaInterrupt ) Wave Input
#endif
//
// Wave output.
//
Interrupt = READ_REGISTER_ULONG(&OutputDmaRegPtr->Status);
CurState = (Interrupt >> 4) & 0x3;
NextBuf = (Interrupt >> 6) & 0x1;
DmaInterrupt = (Interrupt & (DMA_INT_STALLINT | DMA_INT_NFBINT | DMA_INT_CHERRINT)) ? TRUE : FALSE;
Status = READ_REGISTER_ULONG(&OutputDmaRegPtr->Status);
#ifdef NOAUDIODMA
if (WaveOutResource->MoreData == TRUE) {
DEBUGMSG(1, (TEXT("GetIntType: playing (PIO)\r\n")));
PendingInterrupts |= AUDIO_STATE_OUT_PLAYING;
}
else {
DEBUGMSG(1, (TEXT("GetIntType: stopped (PIO)\r\n")));
PendingInterrupts |= AUDIO_STATE_OUT_STOPPED;
}
// WaveOutResource->NextDMABuf ^= 1;
#else
if (DmaInterrupt) {
#if 0
if (NextBuf == 0) {
DEBUGMSG(1, (TEXT("GIT:0:0x%x\r\n"),Cur State));
}
else {
DEBUGMSG(1, (TEXT("GIT:1:0x%x\r\n"),CurState));
}
#endif
DEBUGMSG(1, (TEXT("GetIntType:Out: CurState=0x%x NextBuf=0x%x\r\n"),CurState,NextBuf));
WaveOutResource->NextDMABuf = NextBuf;
// Clear the interrupt register
WRITE_REGISTER_ULONG(&OutputDmaRegPtr->Interrupt, Interrupt);
Drv_AHBBus_ExtraWrite();
//
// This is a wave output interrupt.
//
if (Interrupt & DMA_STATUS_CHERR) {
//
// If the error bit is set, something really bad happened. There
// isn't much we can do here, so just clear the error and hope
// things work from here out.
//
DEBUGMSG(1, (TEXT("GetIntType: WavOut DMA ERROR\r\n")));
} // endif (Interrupt & DMA_STATUS_CHERR)
if (Interrupt & DMA_STATUS_STALL) {
//
// The DMA registers have been dealt with. Now figure out what flags
// to return to the MDD's IST so it can dispatch routines to handle
// the interrupt.
//
if (WaveOutResource->MoreData == TRUE) {
//
// Both DMA channels emptied and we didn't keep up, causing an
// underflow condition. Both done bits are cleared and the
// AUDIO_STATE_OUT_UNDERFLOW flag is returned to the MDD. The
// MDD will call into WaveProc with WPDM_START. This will restart
// the wave stream and perform all necessary resynchronization.
//
DEBUGMSG(1, (TEXT("GetIntType:WavOut playing\r\n")));
PendingInterrupts |= AUDIO_STATE_OUT_PLAYING;
}
else {
// The DMA counters are zero, so they're not playing anymore.
//
DEBUGMSG(1, (TEXT("GetIntType:WavOut stopped\r\n")));
PendingInterrupts |= AUDIO_STATE_OUT_STOPPED;
} // endif (WaveOutResource->MoreData == TRUE)
}
else {
//
// There is still more data, so we need to keep playing.
//
DEBUGMSG(1, (TEXT("GetIntType:WavOut more data\r\n")));
PendingInterrupts |= AUDIO_STATE_OUT_PLAYING;
} //endif (Interrupt & DMA_STATUS_STALL)
goto ReturnWaveStatus;
} // endif( DmaInterrupt ) Wave Output
ReturnWaveStatus:
#endif
Drv_AHBBus_ExtraWrite();
return PendingInterrupts;
}
DWORD
PDD_AudioMessage(
UINT Message,
ULONG Param1,
ULONG Param2
)
{
return MMSYSERR_NOTSUPPORTED;
}
BOOL
PDD_AudioInitialize (
ULONG Index
)
{
BOOL RoutineSuccess;
BOOLEAN Success;
PHYSICAL_ADDRESS PhysAddr;
ULONG BufferOffset;
RoutineSuccess = FALSE;
DEBUGMSG(1, (TEXT("PDD_AudioInitialize. \r\n")));
//
// Allocate a configuration structure to hold our configuration
// information for this wave device instance.
//
WaveDevice = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
sizeof(*WaveDevice));
if (WaveDevice == NULL) {
DEBUGMSG(1, (TEXT("PDD_AudioInitialize: Failed to allocate configuration structure\r\n")));
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto ErrorReturn;
}
//
// Initialize the critical section object.
//
InitializeCriticalSection(&WaveDevice->Cs);
//
// Read in the configuration values.
//
WaveDevice->DmaChannelInput = DMA_CHANNEL_AAC0_RX; // Use AAC-0
WaveDevice->DmaChannelOutput = DMA_CHANNEL_AAC0_TX;
WaveDevice->DmaBufferSize = DMA_BUFFER_SIZE;
//
// Map in the APB Clock Control Registers
//
PhysAddr.QuadPart = APB_CLK_STATE_CTL_REGS_BASE;
WaveDevice->ABPClkCtrlRegPrt = MmMapIoSpace(PhysAddr,
sizeof(*WaveDevice->ABPClkCtrlRegPrt),
FALSE);
if (WaveDevice->ABPClkCtrlRegPrt == NULL) {
DEBUGMSG(1, (TEXT("PDD_AudioInitialize: Unable to map APB Clock Control Registers\r\n")));
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto ErrorReturn;
}
//
// Map in the AAC registers.
//
PhysAddr.QuadPart = APB_AAC_REGS_BASE;
WaveDevice->AacRegPtr = MmMapIoSpace(PhysAddr,
sizeof(*WaveDevice->AacRegPtr),
FALSE);
if (WaveDevice->AacRegPtr == NULL) {
DEBUGMSG(1, (TEXT("PDD_AudioInitialize: Unable to map AAC\r\n")));
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
goto ErrorReturn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -