⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waveoutpdd.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}

/*****************************************************************************
*   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 + -