📄 waveoutpdd.c
字号:
private_AudioFillBuffer (pwh); // [v_nNextPage = 0]
private_AudioFillBuffer (pwh); // [v_nNextPage = 1]
private_AudioPlayFirstBuffer(); // start playback
FUNC_WPDD("-PDD_WaveOutStart");
}
/*****************************************************************************
* FUNCTION : private_AudioPlayFirstBuffer
* DESCRIPTION : Starts playback of first buffer
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID
private_AudioPlayFirstBuffer(
VOID
)
{
DWORD value; // value for register setting
if(ENABLE_HAC || (ENABLE_HSSI && RecOpenFlag == 0)){
// DMA Control Register Setting
value = DCR_DPDS_32BIT |
DCR_DDRMD_MODULE |
DCR_DPDAM_FIX |
DCR_DMDL_PERIPHERAL |
DCR_SPDS_32BIT |
DCR_SDRMD_MODULE |
DCR_SPDAM_INCREMENT |
DCR_SMDL_MEMORY |
DCR_DIP_2PAGE |
DCR_ACMD_ENABLE |
DCR_CT_ENABLE |
DCR_PKMD_DISABLE |
DCR_BTMD_DISABLE |
DCR_DTAU_BYTE |
DCR_DTAC_DISABLE |
DCR_DTAMD_PIN ;
dma_SetControl(pDMA_out, value);
// DMA-TransferCompleteInterrupts Enable
dma_InterruptEnable(pDMA_out);
pDriverGlobals->aud[AUDIO_NO].outInt = (USHORT)NULL;
// DMA Enable & Next Request Enable
value = DCMDR_DMEN;
dma_SetCommand(pDMA_out, value);
}
else{
pDriverGlobals->aud[AUDIO_NO].outInt = (USHORT)NULL;
}
// Tx DMA Enable
module_txdmastart();
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[AUDIO_NO].outInt = (USHORT)NULL;
FUNC_VERBOSE("-PDD_WaveOutContinue");
}
//
// -----------------------------------------------------------------------------
//
MMRESULT
private_WaveOutRestart (
PWAVEHDR pwh
)
{
FUNC_VERBOSE("+PDD_WaveOutRestart");
v_fMoreData[WAPI_OUT] = TRUE; // more data expected
module_txstart();
v_nNextPage = 0;
private_AudioPlayFirstBuffer(); // start playback
FUNC_VERBOSE("-PDD_WaveOutRestart");
return(MMSYSERR_NOERROR);
}
//
// -----------------------------------------------------------------------------
//
MMRESULT
private_WaveOutPause (
VOID
)
{
FUNC_VERBOSE("+PDD_WaveOutPause");
DEBUGMSG(ZONE_TEST, (TEXT("WAVEOUTPDD:private_WaveOutPause !\r\n")));
v_fMoreData[WAPI_OUT] = FALSE; // probably done already, just making
pDriverGlobals->aud[AUDIO_NO].play_address = (ULONG)NULL; // sure no more buffers are played
// Stop transfer(Pause)
module_txstop();
if(ENABLE_HAC || (ENABLE_HSSI && RecOpenFlag == 0)){
// DMA Transfer Stop
dma_Stop(pDMA_out);
}
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[AUDIO_NO].play_address = (ULONG)NULL; // sure no more buffers are played
// Stop transfer
module_txstop();
if(ENABLE_HAC || (ENABLE_HSSI && RecOpenFlag == 0)){
// DMA Transfer Stop
dma_Stop(pDMA_out);
}
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[AUDIO_NO].play_address = (ULONG)NULL; // make sure no more buffers are played
v_fMoreData[WAPI_OUT] = FALSE; // record invocation by MDD of StopPlay
// Stop transfer(Pause)
module_txstop();
if(ENABLE_HAC || (ENABLE_HSSI && RecOpenFlag == 0)){
// DMA Transfer Stop
dma_Stop(pDMA_out);
}
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;
FUNC_WPDD("+PDD_WaveOutOpen");
// check simultaneously
mmRet = check_PlayInRec(PlayOpenFlag, RecOpenFlag);
if(mmRet != MMSYSERR_NOERROR){
goto EXIT;
}
// 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) &&
(check_SamplesPerSec(pDriverGlobals->aud[AUDIO_NO].PLAY_CH,lpFormat->nSamplesPerSec) == TRUE));
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.
//
PlayOpenFlag = 1;
// 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;
}
}
}
// Tx Stop
module_txstop();
if(ENABLE_HAC || (ENABLE_HSSI && RecOpenFlag == 0)){
// DMA Transfer Stop
dma_Stop(pDMA_out);
}
EXIT:
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
PlayOpenFlag = 0;
FUNC_WPDD("+PDD_WaveOutClose");
}
/*****************************************************************************
* FUNCTION : private_waveOutGetVolume
* DESCRIPTION : retrieves current volume setting
* INPUTS : None
* OUTPUTS : current volume setting
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
void private_waveOutGetVolume(PULONG pvol)
{
*pvol = g_VolumeSettings.dwMasterVolume;
}
/*****************************************************************************
* FUNCTION : private_waveOutSetVolume
* DESCRIPTION : sets volume
* INPUTS : volume setting
* OUTPUTS : None
* DESIGN NOTES :
* CAUTIONS :
*****************************************************************************/
VOID private_waveOutSetVolume(
ULONG volumeSetting
)
{
FUNC_WPDD("+PDD_AudioSetVolume");
g_VolumeSettings.dwMasterVolume = volumeSetting;
g_VolumeSettings.fMasterMute = (volumeSetting == 0);
set_volume( (ULONG)volumeSetting );
FUNC_WPDD("-PDD_AudioSetVolume");
return;
}
/*****************************************************************************
* FUNCTION : ClearFifoBuffer
* DESCRIPTION : companion chip FIFO buffer clear
* INPUTS : None
* OUTPUTS : None
* DESIGN NOTES : PCML * 4 PCMR * 4
* CAUTIONS :
*****************************************************************************/
void ClearFifoBuffer(void)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -