📄 waveout.c
字号:
return MMSYSERR_NOERROR;
}
VOID
WaveOutStart(
IN OUT PWAVE_RESOURCE WaveResource,
IN OUT PWAVEHDR WaveHeader
)
/*++
Routine Description:
This routine handles set up of a new wave output stream.
Arguments:
WaveResource - Pointer to the wave resource structure corresponding to the
stream to be started.
WaveHeader - Pointer to the wave header information.
Return Value:
None.
--*/
{
DMA_CHANNEL_REG* DmaRegPtr;
PULONG NextBuffer;
ULONG FillAmount;
ULONG SamplesPerSecond;
ULONG SamplesRateValue;
APB_AAC_REGS* AacRegPtr = WaveResource->AacRegPtr;
SamplesPerSecond = WaveResource->WaveFormat.nSamplesPerSec;
//
// Setup the Sample per second rate
//
switch (SamplesPerSecond) {
case 8000:
SamplesRateValue = 0x1F40;
break;
case 11025:
SamplesRateValue = 0x2B11;
break;
case 22050:
SamplesRateValue = 0x5622;
break;
case 44100:
SamplesRateValue = 0xAC44;
break;
default:
DEBUGMSG(1, (TEXT("WaveOutStart: Unsupported sample rate %u.\r\n"), SamplesPerSecond));
break;
} // end switch (SamplesPerSecond)
DEBUGMSG(1, (
TEXT("WaveOutStart:")
TEXT("Len=%u Recorded=%u bits=%u Stereo=%u Rate=%u RateValue=0x%x\r\n"),
WaveHeader->dwBufferLength,
WaveHeader->dwBytesRecorded,
WaveResource->WaveFormat.wBitsPerSample,
WaveResource->WaveFormat.nChannels,
SamplesPerSecond,
SamplesRateValue));
if (AAC_WriteCODECIndexRegister (AacRegPtr, AC97_PCM_FRONT_DAC_RATE, SamplesRateValue) == FALSE) {
RETAILMSG(1, (TEXT("WaveOutStart: Set sample rate failed-1\r\n")));
}
#if 0
{
ULONG val;
val = AAC_ReadCODECIndexRegister(AacRegPtr, AC97_PCM_FRONT_DAC_RATE);
if (val != SamplesRateValue) {
RETAILMSG(1,(TEXT("WaveOutStart: SamplesRateValue setup failed (0x%x != 0x%x)\r\n"),
SamplesRateValue,val));
}
else {
RETAILMSG(1,(TEXT("WaveOutStart: SamplesRateValue verified (0x%x = 0x%x)\r\n"),
SamplesRateValue,val));
}
}
#endif
DmaRegPtr = WaveResource->DmaRegPtr;
//
// Mark the stream as having more data.
//
WaveResource->MoreData = TRUE;
//
// Ensure the DMA channel is off and any status bits are cleared.
//
ShutdownDma(WaveResource);
ClearDmaStatus(WaveResource);
WaveResource->NextDMABuf = 0;
//
// Initialize the transfer counts to 0.
//
WRITE_REGISTER_ULONG(&DmaRegPtr->MaxCnt0, 0);
WRITE_REGISTER_ULONG(&DmaRegPtr->MaxCnt1, 0);
WaveResource->BufferAPhysAddr.LowPart = 0;
WaveResource->BufferBPhysAddr.LowPart = 0;
//
// Store a copy of the specified wave header pointer into the resource
// structure.
//
WaveResource->WaveHeader = WaveHeader;
#ifdef NOAUDIODMA
DEBUGMSG(1, (TEXT("WaveOutStart: Using Polling\r\n")));
NextBuffer = GetNextDmaBuffer(WaveResource);
while( (FillAmount = FillDmaBuffer(WaveResource, (PUCHAR) NextBuffer)) ) {
DEBUGMSG(1, (TEXT("WaveOutStart: FillAmount-1=%u\r\n"),FillAmount));
SetBufferSize(WaveResource, NextBuffer, FillAmount);
AudioDataSend(WaveResource, NextBuffer, FillAmount);
NextBuffer = GetNextDmaBuffer(WaveResource);
}
#else
// prime the DMA with padded zero data
// FillAmount = WaveResource->DmaBufferSize;
//*TSAT* 18-Apr-2002 SetBufferSize() not called again.
// If we set here to 256, that's where the buffer stays.
// FillAmount = 0x100; // use a smaller one will introduce smaller delay
FillAmount = WaveResource->DmaBufferSize;
NextBuffer = GetNextDmaBuffer(WaveResource);
DEBUGMSG(1,(TEXT("FillDMABuffer=A\r\n")));
memset((void*)NextBuffer, 0, FillAmount);
SetBufferSize(WaveResource, NextBuffer, FillAmount);
MapTransfer(TRUE, WaveResource, NextBuffer);
InitiateDma(WaveResource);
StartDmaOut(WaveResource);
//*TSAT* 18-Apr-2002 Starting buffer B is unnecessary.
//* As soon as we start buffer A, it is interrupted telling us we can load buffer B.
NextDmaBuffer(WaveResource);
NextBuffer = GetNextDmaBuffer(WaveResource);
DEBUGMSG(1,(TEXT("FillDMABuffer=B\r\n")));
memset((void*)NextBuffer, 0, FillAmount);
SetBufferSize(WaveResource, NextBuffer, FillAmount);
MapTransfer(TRUE, WaveResource, NextBuffer);
//*TSAT* 18-Apr-2002. Artificially zero out DmaBufferBBytes to keep buffer b from starting.
// Restore NextBuffer index.
WaveResource->DmaBufferBBytes = FillAmount;
DEBUGMSG(1, (TEXT("WaveOutStart: Starting DMA.\r\n")));
#endif NOAUDIODMA
StartDmaOut(WaveResource);
#if 0
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("*************************************** WaveOutStart()\r\n")));
DEBUGMSG(1, (TEXT("** &WaveResource 0x%8.8X\r\n"), &WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource 0x%8.8X\r\n"), WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource->SysIntr 0x%8.8X\r\n"), WaveResource->SysIntr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferSize 0x%8.8X\r\n"), WaveResource->DmaBufferSize));
DEBUGMSG(1, (TEXT("** WaveResource->AdapterObject 0x%8.8X\r\n"), WaveResource->AdapterObject));
DEBUGMSG(1, (TEXT("** WaveResource->MapRegsBase 0x%8.8X\r\n"), WaveResource->MapRegsBase));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferMdl 0x%8.8X\r\n"), WaveResource->DmaBufferMdl));
DEBUGMSG(1, (TEXT("** WaveResource->StartBuffer 0x%8.8X\r\n"), WaveResource->StartBuffer));
DEBUGMSG(1, (TEXT("** WaveResource->BufferAPhysAddr 0x%8.8X\r\n"), WaveResource->BufferAPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferA 0x%8.8X\r\n"), WaveResource->DmaBufferA));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferABytes 0x%8.8X\r\n"), WaveResource->DmaBufferABytes));
DEBUGMSG(1, (TEXT("** WaveResource->BufferBPhysAddr 0x%8.8X\r\n"), WaveResource->BufferBPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferB 0x%8.8X\r\n"), WaveResource->DmaBufferB));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferBBytes 0x%8.8X\r\n"), WaveResource->DmaBufferBBytes));
DEBUGMSG(1, (TEXT("** WaveResource->NextDMABuf 0x%8.8X\r\n"), WaveResource->NextDMABuf));
DEBUGMSG(1, (TEXT("** WaveResource->ABPClkCtrlRegPrt 0x%8.8X\r\n"), WaveResource->ABPClkCtrlRegPrt));
DEBUGMSG(1, (TEXT("** WaveResource->AacRegPtr 0x%8.8X\r\n"), WaveResource->AacRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->AHBDmaCtrlRegPtr 0x%8.8X\r\n"), WaveResource->AHBDmaCtrlRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr 0x%8.8X\r\n"), WaveResource->DmaRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->InUse 0x%8.8X\r\n"), WaveResource->InUse));
DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader 0x%8.8X\r\n"), WaveResource->WaveHeader));
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("** WaveHeader->lpData 0x%8.8X\r\n"), WaveHeader->lpData));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBufferLength 0x%8.8X\r\n"), WaveHeader->dwBufferLength));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBytesRecorded 0x%8.8X\r\n"), WaveHeader->dwBytesRecorded));
DEBUGMSG(1, (TEXT("** WaveHeader->dwUser 0x%8.8X\r\n"), WaveHeader->dwUser));
DEBUGMSG(1, (TEXT("** WaveHeader->dwFlags 0x%8.8X\r\n"), WaveHeader->dwFlags));
DEBUGMSG(1, (TEXT("** WaveHeader->dwLoops 0x%8.8X\r\n"), WaveHeader->dwLoops));
DEBUGMSG(1, (TEXT("** WaveHeader->lpNext 0x%8.8X\r\n"), WaveHeader->lpNext));
DEBUGMSG(1, (TEXT("*************************************** WaveOutStart()\r\n")));
DEBUGMSG(1, (TEXT("\r\n")));
#endif
return;
}
VOID
WaveOutContinue (
IN OUT PWAVE_RESOURCE WaveResource,
IN OUT PWAVEHDR WaveHeader
)
/*++
Routine Description:
This routine handles continuation of a playing audio output stream.
The operations are similar to starting wave output.
Arguments:
WaveHeader - Pointer to the wave header information.
Return Value:
None.
--*/
{
PULONG NextBuffer;
ULONG FillAmount;
WaveResource->WaveHeader = WaveHeader;
NextBuffer = GetNextDmaBuffer(WaveResource);
FillAmount = FillDmaBuffer(WaveResource, (PUCHAR) NextBuffer);
SetBufferSize(WaveResource, NextBuffer, FillAmount);
// DEBUGMSG(1, (TEXT("WaveOutContinue: FillAmount=%u\r\n"),FillAmount));
DEBUGMSG(1, (TEXT("WaveOutContinue: FillAmount=%u to Buffer Base%u\r\n"),
FillAmount, WaveResource->NextDMABuf));
if (FillAmount != 0) {
#ifdef NOAUDIODMA
DEBUGMSG(1, (TEXT("WaveOutContinue: Using Polling\r\n")));
AudioDataSend(WaveResource, NextBuffer, FillAmount);
#else
DEBUGMSG(1, (TEXT("WaveOutContinue: Using DMA\r\n")));
MapTransfer(FALSE, WaveResource, NextBuffer);
#endif
StartDmaOut(WaveResource);
}
else {
WaveResource->MoreData = FALSE;
#ifdef NOAUDIODMA
DEBUGMSG(1, (TEXT("WaveOutContinue: No more data\r\n")));
#endif
StartDmaOut(WaveResource);
}
#if 0
DEBUGMSG(1, (TEXT("\r\n")));
DEBUGMSG(1, (TEXT("*************************************** WaveOutContinue()\r\n")));
DEBUGMSG(1, (TEXT("** &WaveResource 0x%8.8X\r\n"), &WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource 0x%8.8X\r\n"), WaveResource));
DEBUGMSG(1, (TEXT("** WaveResource->SysIntr 0x%8.8X\r\n"), WaveResource->SysIntr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferSize 0x%8.8X\r\n"), WaveResource->DmaBufferSize));
DEBUGMSG(1, (TEXT("** WaveResource->AdapterObject 0x%8.8X\r\n"), WaveResource->AdapterObject));
DEBUGMSG(1, (TEXT("** WaveResource->MapRegsBase 0x%8.8X\r\n"), WaveResource->MapRegsBase));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferMdl 0x%8.8X\r\n"), WaveResource->DmaBufferMdl));
DEBUGMSG(1, (TEXT("** WaveResource->StartBuffer 0x%8.8X\r\n"), WaveResource->StartBuffer));
DEBUGMSG(1, (TEXT("** WaveResource->BufferAPhysAddr 0x%8.8X\r\n"), WaveResource->BufferAPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferA 0x%8.8X\r\n"), WaveResource->DmaBufferA));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferABytes 0x%8.8X\r\n"), WaveResource->DmaBufferABytes));
DEBUGMSG(1, (TEXT("** WaveResource->BufferBPhysAddr 0x%8.8X\r\n"), WaveResource->BufferBPhysAddr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferB 0x%8.8X\r\n"), WaveResource->DmaBufferB));
DEBUGMSG(1, (TEXT("** WaveResource->DmaBufferBBytes 0x%8.8X\r\n"), WaveResource->DmaBufferBBytes));
DEBUGMSG(1, (TEXT("** WaveResource->NextDMABuf 0x%8.8X\r\n"), WaveResource->NextDMABuf));
DEBUGMSG(1, (TEXT("** WaveResource->ABPClkCtrlRegPrt 0x%8.8X\r\n"), WaveResource->ABPClkCtrlRegPrt));
DEBUGMSG(1, (TEXT("** WaveResource->AacRegPtr 0x%8.8X\r\n"), WaveResource->AacRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->AHBDmaCtrlRegPtr 0x%8.8X\r\n"), WaveResource->AHBDmaCtrlRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->DmaRegPtr 0x%8.8X\r\n"), WaveResource->DmaRegPtr));
DEBUGMSG(1, (TEXT("** WaveResource->InUse 0x%8.8X\r\n"), WaveResource->InUse));
DEBUGMSG(1, (TEXT("** WaveResource->WaveHeader 0x%8.8X\r\n"), WaveResource->WaveHeader));
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("** WaveHeader->lpData 0x%8.8X\r\n"), WaveHeader->lpData));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBufferLength 0x%8.8X\r\n"), WaveHeader->dwBufferLength));
DEBUGMSG(1, (TEXT("** WaveHeader->dwBytesRecorded 0x%8.8X\r\n"), WaveHeader->dwBytesRecorded));
DEBUGMSG(1, (TEXT("** WaveHeader->dwUser 0x%8.8X\r\n"), WaveHeader->dwUser));
DEBUGMSG(1, (TEXT("** WaveHeader->dwFlags 0x%8.8X\r\n"), WaveHeader->dwFlags));
DEBUGMSG(1, (TEXT("** WaveHeader->dwLoops 0x%8.8X\r\n"), WaveHeader->dwLoops));
DEBUGMSG(1, (TEXT("** WaveHeader->lpNext 0x%8.8X\r\n"), WaveHeader->lpNext));
DEBUGMSG(1, (TEXT("*************************************** WaveOutContinue()\r\n")));
DEBUGMSG(1, (TEXT("\r\n")));
#endif
return;
}
VOID
WaveOutEndOfData(
IN OUT PWAVE_RESOURCE WaveResource
)
/*++
Routine Description:
This routine handles clean up of audio output when the wave
output stream has ended. It stops any output DMA transfer
in progress and mutes audio output on the codec.
Arguments:
Return Value:
None.
--*/
{
WaveResource->MoreData = FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -