waveoutpdd.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 1,218 行 · 第 1/3 页

C
1,218
字号
	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

	// ClearDMA2Interrupt();					// (see macros)

	WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x000effff );


/****************************************************************************
 * Modification done by Naresh Gupta
 *   Change bit names for SH4. Similar changes have been made at other places
 *   also where SH3 was used.
 ****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	WRITE_REGISTER_ULONG((PULONG)pDMAOR, DMAC_DMAOR_DME );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	WRITE_REGISTER_USHORT((PUSHORT)pDMAOR, SH3_DMAC_DMAOR_DME );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
/****************************************************************************
 * End of Modification done by Naresh Gupta
 ****************************************************************************/

	pDriverGlobals->aud.outInt = (USHORT)NULL;

   // Begin Play of First Buffer

	READ_REGISTER_ULONG((PULONG)pCHCR1  );

/****************************************************************************
 * Modification done by Maneesh Gupta
 *
 * Changes bit names for SH4. 
 ****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	WRITE_REGISTER_ULONG((PULONG)pCHCR1, 
		DMAC_CHCR_RL_ACTIVE_HIGH |
		DMAC_CHCR_SM_INCREMENTED |
		DMAC_CHCR_TS_32 |
		DMAC_CHCR_IE_GENERATED |
		DMAC_CHCR_DE_ENABLED );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	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 );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
/****************************************************************************
 * End of Modification done by Maneesh Gupta
 ****************************************************************************/

	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;

	FUNC_VERBOSE("-PDD_WaveOutContinue");
}

//
// -----------------------------------------------------------------------------
//

MMRESULT
private_WaveOutRestart (
	PWAVEHDR pwh
	)
{
	FUNC_VERBOSE("+PDD_WaveOutRestart");
//DMA Restart

/****************************************************************************
 * Modification done by Maneesh Gupta
 *
 * Bit names changed for SH4. 
 ****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	WRITE_REGISTER_ULONG((PULONG)pCHCR1, 
		DMAC_CHCR_RL_ACTIVE_HIGH |
		DMAC_CHCR_SM_INCREMENTED |
		DMAC_CHCR_TS_32 |
		DMAC_CHCR_IE_GENERATED |
		DMAC_CHCR_DE_ENABLED );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	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 );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
/****************************************************************************
 * End of Modification done by Maneesh Gupta
 ****************************************************************************/

	FUNC_VERBOSE("-PDD_WaveOutRestart");
	return(MMSYSERR_NOERROR);
}

//
// -----------------------------------------------------------------------------
//

MMRESULT
private_WaveOutPause (
	VOID
	)
{
	FUNC_VERBOSE("+PDD_WaveOutPause");
//DMA STOP

/****************************************************************************
 * Modification done by Maneesh Gupta
 *
 *   Change bit names for SH4. 
 ****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	WRITE_REGISTER_ULONG((PULONG)pCHCR1, 
		DMAC_CHCR_RL_ACTIVE_HIGH |
		DMAC_CHCR_SM_INCREMENTED |
		DMAC_CHCR_TS_32 |
		DMAC_CHCR_IE_GENERATED |
		DMAC_CHCR_DE_DISABLED );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	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 );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))

/****************************************************************************
 * End of Modification done by Maneesh Gupta
 ****************************************************************************/
//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
//DMA STOP

#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	WRITE_REGISTER_ULONG((PULONG)pCHCR1, 
		DMAC_CHCR_RL_ACTIVE_HIGH |
		DMAC_CHCR_SM_INCREMENTED |
		DMAC_CHCR_TS_32 |
		DMAC_CHCR_IE_GENERATED |
		DMAC_CHCR_DE_DISABLED );
#else // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	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 );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))

//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
	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    = READ_REGISTER_ULONG((PULONG)pSAR1  );
	temp_DMATCR1 = READ_REGISTER_ULONG((PULONG)pDMATCR1  );
	if  ( ( temp_SAR1 == (ULONG)(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)
{
	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 + =
减小字号Ctrl + -
显示快捷键?