📄 waveoutpdd.cpp
字号:
}
/*****************************************************************************
* FUNCTION : private_AudioPlayFirstBuffer
* DESCRIPTION : Starts playback of first buffer
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_AudioPlayFirstBuffer(
VOID
)
{
FUNC_WPDD("+PDD_AudioPlayFirstBuffer");
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x000effff ); //adjust L and R data
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x002fffff ); //adjust L and R data
/*
WRITE_REGISTER_ULONG((PULONG)pSAR1, (ULONG)(dma_pagePhysicalAddress[0])); // Setting DMA controler
WRITE_REGISTER_ULONG((PULONG)pDAR1, (ULONG)CC_CODEC_PCML ); // Prepare DMA Channel 2 for audio playback
WRITE_REGISTER_ULONG((PULONG)pDMATCR1, (ULONG)( AUDIO_DMA_PAGE_SIZE / 4 ));// Rig DMA for Transfer of First Buffer
*/ pDmaOutObject->ArmDma(TRUE,(ULONG)(dwCCCodecRegBase+CC_CODEC_PCML_OFFSET)/*CC_CODEC_PCML*/);
// ClearDMA2Interrupt(); // (see macros)
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x000effff );
// WRITE_REGISTER_ULONG((PUSHORT)pDMAOR, SH3_DMAC_DMAOR_DME );
pDmaOutObject->EnableDma();
// pDriverGlobals->aud.outInt = (USHORT)NULL;
pDmaOutObject->ResetGlobalOutInt(NULL);
// Begin Play of First Buffer
/* READ_REGISTER_ULONG((PULONG)pCHCR1 );
WRITE_REGISTER_ULONG((PULONG)pCHCR1,
SH3_DMAC_CHCR_RL_ACTIVE_HIGH |
SH3_DMAC_CHCR_SM_INCREMENTED |
SH3_DMAC_CHCR_TS_32 |
SH3_DMAC_CHCR_IE_GENERATED |
SH3_DMAC_CHCR_DE_ENABLED );
*/ pDmaOutObject->StartDma();
WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x002fffff ); // play start
FUNC_WPDD("-PDD_AudioPlayFirstBuffer");
}
/*****************************************************************************
* FUNCTION : private_WaveOutContinue
* DESCRIPTION : Fill next buffer from wave
* INPUTS : wave
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveOutContinue (
PWAVEHDR pwh
)
{
FUNC_VERBOSE("+PDD_WaveOutContinue");
v_fMoreData[WAPI_OUT] = TRUE; // more data expected
private_AudioFillBuffer (pwh);
// pDriverGlobals->aud.outInt = (USHORT)NULL;
// *(pDmaOutObject->GetGlobalOutIntPointer())=NULL;
FUNC_VERBOSE("-PDD_WaveOutContinue");
}
//
// -----------------------------------------------------------------------------
//
MMRESULT
private_WaveOutRestart (
PWAVEHDR pwh
)
{
FUNC_VERBOSE("+PDD_WaveOutRestart");
//DMA Restart
/* WRITE_REGISTER_ULONG((PULONG)pCHCR1,
SH3_DMAC_CHCR_RL_ACTIVE_HIGH |
SH3_DMAC_CHCR_SM_INCREMENTED |
SH3_DMAC_CHCR_TS_32 |
SH3_DMAC_CHCR_IE_GENERATED |
SH3_DMAC_CHCR_DE_ENABLED );
*/ pDmaOutObject->ReStartDma();
FUNC_VERBOSE("-PDD_WaveOutRestart");
return(MMSYSERR_NOERROR);
}
//
// -----------------------------------------------------------------------------
//
MMRESULT
private_WaveOutPause (
VOID
)
{
FUNC_VERBOSE("+PDD_WaveOutPause");
//DMA STOP
/* WRITE_REGISTER_ULONG((PULONG)pCHCR1,
SH3_DMAC_CHCR_RL_ACTIVE_HIGH |
SH3_DMAC_CHCR_SM_INCREMENTED |
SH3_DMAC_CHCR_TS_32 |
SH3_DMAC_CHCR_IE_GENERATED |
SH3_DMAC_CHCR_DE_DISABLED );
*/ pDmaOutObject->StopDma();
//FIFO buffer clear
ClearFifoBuffer();
FUNC_VERBOSE("-PDD_WaveOutPause");
return(MMSYSERR_NOERROR);
}
/*****************************************************************************
* FUNCTION : private_WaveOutStop
* DESCRIPTION : Shut down audio playback
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveOutStop()
{
FUNC_WPDD("+private_WaveOutStop");
v_fMoreData[WAPI_OUT] = FALSE; // probably done already, just making
//pDriverGlobals->aud.play_address = (ULONG)NULL; // sure no more buffers are played
pDmaOutObject->SetGlobalPlayAddress(NULL);
//DMA STOP
/* WRITE_REGISTER_ULONG((PULONG)pCHCR1,
SH3_DMAC_CHCR_RL_ACTIVE_HIGH |
SH3_DMAC_CHCR_SM_INCREMENTED |
SH3_DMAC_CHCR_TS_32 |
SH3_DMAC_CHCR_IE_GENERATED |
SH3_DMAC_CHCR_DE_DISABLED );
*/ pDmaOutObject->StopDma();
//FIFO buffer clear
ClearFifoBuffer();
FUNC_WPDD("-private_WaveOutStop");
}
/*****************************************************************************
* FUNCTION : private_WaveOutEndOfData
* DESCRIPTION : Rig to play no more buffers
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveOutEndOfData()
{
FUNC_WPDD("+PDD_WaveOutEndOfData");
// pDriverGlobals->aud.play_address = (ULONG)NULL; // make sure no more buffers are played
pDmaOutObject->SetGlobalPlayAddress(NULL);
v_fMoreData[WAPI_OUT] = FALSE; // record invocation by MDD of StopPlay
//FIFO buffer clear
ClearFifoBuffer();
FUNC_WPDD("-PDD_WaveOutEndOfData");
}
/*****************************************************************************
* FUNCTION : private_WaveOutStandby
* DESCRIPTION :
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveOutStandby()
{
FUNC_WPDD("+PDD_WaveOutStandby");
FUNC_WPDD("-PDD_WaveOutStandby");
}
/*****************************************************************************
* FUNCTION : private_WaveOutOpen
* DESCRIPTION : Extract and Decipher Wave Format Parameters
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
MMRESULT
private_WaveOutOpen(
LPWAVEFORMATEX lpFormat,
BOOL fQueryFormatOnly
)
{
MMRESULT mmRet;
BOOL formatOK;
ULONG temp_SAR1;
ULONG temp_DMATCR1;
FUNC_WPDD("+PDD_WaveOutOpen");
// Allow PCM, mono, 8 or 16 bit within allow playback speed range
formatOK = (
(lpFormat->wFormatTag == WAVE_FORMAT_PCM) &&
(lpFormat->nChannels == Monaural || lpFormat->nChannels == Stereo) &&
(lpFormat->wBitsPerSample == SixteenBits || lpFormat->wBitsPerSample == EightBits) &&
(lpFormat->nSamplesPerSec >= MinPlaybackSpeed) &&
(lpFormat->nSamplesPerSec <= MaxPlaybackSpeed));
if ( !formatOK )
{
DEBUGMSG(ZONE_TEST, (TEXT("PDD_AudioQueryFormat:\n %d; %d; %d; %d,\r\n"),
lpFormat->wFormatTag,
lpFormat->nChannels,
lpFormat->wBitsPerSample,
lpFormat->nSamplesPerSec));
mmRet = WAVERR_BADFORMAT;
}
else
{
mmRet = MMSYSERR_NOERROR;
if (!fQueryFormatOnly)
{
//
// NOTE : If the hardware supports input/output one at a time,
// the driver should return MMSYSERR_ALLOCATED here.
//
// Open with the given format.
g_pwfx[WAPI_OUT] = lpFormat;
if (g_pwfx[WAPI_OUT]->wBitsPerSample == EightBits)
{
if (g_pwfx[WAPI_OUT]->nChannels == Monaural)
g_pcmtype[WAPI_OUT] = PCM_TYPE_M8;
else
g_pcmtype[WAPI_OUT] = PCM_TYPE_S8;
}
else
{
if (g_pwfx[WAPI_OUT]->nChannels == Monaural)
g_pcmtype[WAPI_OUT] = PCM_TYPE_M16;
else
g_pcmtype[WAPI_OUT] = PCM_TYPE_S16;
}
}
}
//if Recording not Play
temp_SAR1 = pDmaOutObject->GetDmaSourceReg();//READ_REGISTER_ULONG((PULONG)pSAR1 );
temp_DMATCR1 = pDmaOutObject->GetDmaCountReg();//READ_REGISTER_ULONG((PULONG)pDMATCR1 );
if ( ( temp_SAR1 == (ULONG)(dwCCCodecRegBase/*CC_CODEC_REGBASE*/ + CC_CODEC_PCML_OFFSET) ) &&
( temp_DMATCR1 != 0x00000000 ) )
{
mmRet = MMSYSERR_NOMEM;
}
FUNC_WPDD("-PDD_WaveOutOpen");
return(mmRet);
}
/*****************************************************************************
* FUNCTION : private_WaveOutClose
* DESCRIPTION :
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_WaveOutClose()
{
FUNC_WPDD("+PDD_WaveOutClose");
// No Actions Needed
// unless D/A enable/disable strategy changes to on/off for each wave
FUNC_WPDD("+PDD_WaveOutClose");
}
/*****************************************************************************
* FUNCTION : private_AudioGetVolume
* DESCRIPTION : retrieves current volume setting
* INPUTS : None
* OUTPUTS : current volume setting
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
ULONG private_AudioGetVolume(
VOID
)
{
FUNC_WPDD("+PDD_AudioGetVolume");
return v_nVolume;
FUNC_WPDD("-PDD_AudioGetVolume");
}
/*****************************************************************************
* FUNCTION : private_AudioSetVolume
* DESCRIPTION : sets volume
* INPUTS : volume setting
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID private_AudioSetVolume(
ULONG volumeSetting
)
{
FUNC_WPDD("+PDD_AudioSetVolume");
v_nVolume = volumeSetting;
FUNC_WPDD("-PDD_AudioSetVolume");
return;
}
/*****************************************************************************
* FUNCTION : Delay_AC
* DESCRIPTION : wait
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
void Delay_AC(void)
{
volatile unsigned int i;
for(i=0;i<0x100000;i++);
return;
}
/*****************************************************************************
* FUNCTION : ClearFifoBuffer
* DESCRIPTION : companion chip FIFO buffer clear
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES : PCML * 4 PCMR * 4
* CAUTIONS :
*****************************************************************************/
void ClearFifoBuffer(void)
{
int BufferCount;
for( BufferCount = 0 ; BufferCount < 8 ; BufferCount++ ){
WRITE_REGISTER_ULONG((PULONG)pCODEC_PCML, (ULONG)0x00000000 );
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -