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

📄 waveinpdd.c

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
 * End of Modification done by Naresh Gupta
 ****************************************************************************/

	WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x000effff );	//adjust L and R data
	WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x007fffff );	//adjust L and R data

	// Rig DMA for Transfer of First Buffer
	
	WRITE_REGISTER_ULONG((PULONG)pDAR1,    (ULONG)(dma_pagePhysicalAddress[0]));
	WRITE_REGISTER_ULONG((PULONG)pSAR1,    (ULONG)CC_CODEC_PCML );
	WRITE_REGISTER_ULONG((PULONG)pDMATCR1, (ULONG)( AUDIO_DMA_PAGE_REC_SIZE / 4 ));	// set data count

	// Debug: DMA, Status Report

	WRITE_REGISTER_ULONG((PULONG)pCODEC_ACR, (ULONG)0x007fffff );
/****************************************************************************
 * Modification done by Maneesh Gupta
 *
 *   Change bit names for SH4. 
 ****************************************************************************/
#if ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))
	WRITE_REGISTER_USHORT((PUSHORT)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 Maneesh Gupta
 ****************************************************************************/
	// Begin Play of First Buffer
	
	READ_REGISTER_ULONG((PULONG)pCHCR1  );
/****************************************************************************
 * 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_DM_INCREMENTED |
		DMAC_CHCR_TS_32 |
		DMAC_CHCR_IE_NOT_GENARATED |
		DMAC_CHCR_DE_ENABLED );

	READ_REGISTER_ULONG((PULONG)pCHCR1  );
	WRITE_REGISTER_ULONG((PULONG)pCHCR1,
		DMAC_CHCR_RL_ACTIVE_HIGH |
		DMAC_CHCR_DM_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_DM_INCREMENTED |
		SH3_DMAC_CHCR_TS_32 |
		SH3_DMAC_CHCR_IE_NOT_GENARATED |
		SH3_DMAC_CHCR_DE_ENABLED );

	READ_REGISTER_ULONG((PULONG)pCHCR1  );
	WRITE_REGISTER_ULONG((PULONG)pCHCR1,
		SH3_DMAC_CHCR_RL_ACTIVE_HIGH |
		SH3_DMAC_CHCR_DM_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)0x007fffff );   // rec start

	v_recPage = 1 - v_recPage;
//	WriteAudioRecAddress(dma_pagePhysicalAddress[v_recPage]);//[macro]
	pDriverGlobals->aud.rec_address = dma_pagePhysicalAddress[v_recPage];
	pDriverGlobals->aud.inInt = (USHORT)NULL;

	FUNC_WPDD("-PDD_WaveInStart");
}

/*****************************************************************************
*   FUNCTION :  	private_AudioInContinue
*   DESCRIPTION :   continuerecording a sound - occurs at audio in interrupt
*   INPUTS :		pwh: wave header to insert sound into
*   OUTPUTS :     	None
*   DESIGN NOTES :  
*   CAUTIONS :		pwh can be null for no buffers available
*****************************************************************************/
VOID
private_WaveInContinue(
   PWAVEHDR pwh
   )
{
	int		i;
	long double	SkipCount;
	int 		mic_data_read_count;
	int		wave_data_write_count;
	char		write_flag = 0;

	LONG samplingRate;
	FUNC_VERBOSE("+PDD_WaveInContinue");

	if (lpFormat2)
	{
		samplingRate = lpFormat2->nSamplesPerSec;
	}
	switch( (ULONG)samplingRate )
	{
	case 11025:
		SkipCount = 8.707482993L;
		break;
	case 22050:
		SkipCount = 4.353741497L;
		break;
	case 44100:
		SkipCount = 2.176870748L;
		break;
	default:
		SkipCount = 8.707482993L;
		break;
	}

	// process raw audio samples 
	// copy processed audio sample into WAVEHDR

	mic_data_read_count = 0;
	wave_data_write_count = 0;
	write_flag = 0;

	for( i=0; i<AUDIO_DMA_PAGE_REC_SIZE; i=i+4)
	{
		PPCM_SAMPLE pSample;	// where to store the audio record data
		INT32 raw_sample;		// 32 bit signed sample from AC97PCML


		try
		{
			raw_sample = READ_REGISTER_ULONG((pAudioBufferBase  + ((1 - v_recPage) * AUDIO_DMA_PAGE_REC_SIZE) + i));
		} 
		except ( 1 ) 
		{
			DUMPEXCEPTION();
		}

		mic_data_read_count = mic_data_read_count + 1;
		if ((( wave_data_write_count + 1 ) * SkipCount ) < mic_data_read_count )
			write_flag = 1;

		if (write_flag == 1 )
		{
			try 
			{
				if( pwh == 0 ) break;

				if( pwh->dwBytesRecorded >= pwh->dwBufferLength )
				{
					DEBUGMSG(ZONE_TEST,(TEXT("WAVE RECORD: NEXT BUFFER\r\n")));
					pwh = pwh->lpNext;
					
					if( pwh == 0 )
					{
						DEBUGMSG(ZONE_TEST,(TEXT("WAVE RECORD: NO BUFFERS\r\n")));
						break;
					}
				}
			}
			except ( 1 )
			{
				DUMPEXCEPTION();
			}
			try 
			{
				// this is safe, since odd alignment should only occur for 8 bit sound
				// however, it is assumed that the WAVEHDR buffer is in multiples
				//  of the sample size (1,2, 2, or 4), otherwise the buffer
				//  could be overrun by a few bytes!
				pSample = (PPCM_SAMPLE) (pwh->lpData + pwh->dwBytesRecorded);
				
				switch( g_pcmtype[WAPI_IN] )
				{
				case PCM_TYPE_M8:	// 8 bit mono
					pSample->m8.sample = raw_sample >> 12;
					pSample->m8.sample = pSample->m8.sample + 128;
					pwh->dwBytesRecorded += 1;
					break;

				case PCM_TYPE_S8:	// 8 bit stereo
					pSample->s8.sample_left =
					pSample->s8.sample_right = fromPCM16toPCM8( raw_sample );
					pwh->dwBytesRecorded += 2;
					break;

				case PCM_TYPE_M16:	// 16 bit mono
					pSample->m16.sample = raw_sample >> 4;
					pwh->dwBytesRecorded += 2;
					break;

				case PCM_TYPE_S16:	// 16 bit stereo
					pSample->s16.sample_left = pSample->s16.sample_right = raw_sample;
					pwh->dwBytesRecorded += 4;
					break;

				default: // really screwed up if we're here!
					DEBUGMSG(ZONE_ERROR,(TEXT("WAVE RECORD: invalid pcm type %d\r\n"),
						g_pcmtype[WAPI_IN] ));
					break;
				} //end switch
				write_flag = 0;
				wave_data_write_count = wave_data_write_count + 1;
			}
			except ( 1 ) 
			{
				DUMPEXCEPTION();
			} // end try
		} // end if
	} // end for

	v_recPage = 1 - v_recPage;
//	WriteAudioRecAddress(dma_pagePhysicalAddress[v_recPage]);//[macro]
	pDriverGlobals->aud.rec_address = dma_pagePhysicalAddress[v_recPage];
	//pDriverGlobals->aud.inInt = (USHORT)NULL;

	FUNC_VERBOSE("-PDD_WaveInContinue");
}

/*****************************************************************************
*   FUNCTION :  	private_AudioInStop
*   DESCRIPTION :   stop recording a sound
*   INPUTS :		
*   OUTPUTS :     	None
*   DESIGN NOTES :  
*   CAUTIONS :		
*****************************************************************************/
VOID 
private_WaveInStop()
{
	FUNC_WPDD("+PDD_WaveInStop");
	FUNC_WPDD("-PDD_WaveInStop");
}

/*****************************************************************************
*   FUNCTION :  	private_AudioInStandby
*   DESCRIPTION :   stop recording a sound
*   INPUTS :		
*   OUTPUTS :     	None
*   DESIGN NOTES :  what is the difference between this and Stop?
*   CAUTIONS :		
*****************************************************************************/
VOID 
private_WaveInStandby()
{
	FUNC_WPDD("+PDD_WaveInStandby");
	FUNC_WPDD("-PDD_WaveInStandby");
}

/*****************************************************************************
*   FUNCTION :  	private_AudioInClose
*   DESCRIPTION :   close recording device, powers off
*   INPUTS :		
*   OUTPUTS :     	None
*   DESIGN NOTES :  
*   CAUTIONS :		
*****************************************************************************/
VOID
private_WaveInClose()
{
	FUNC_WPDD("PDD_WaveInClose");
 	lpFormat2=0;
	pDriverGlobals->aud.rec_address = (ULONG)NULL;
	pDriverGlobals->aud.inInt = (USHORT)NULL;
}

/*****************************************************************************
*   FUNCTION :  	private_AudioInOpen
*   DESCRIPTION :   opens recording sound device, powers on
*   INPUTS :		lpFormat = what recording parameters to use
*   OUTPUTS :     	MMRESULT - ok if params ok, else a error code
*   DESIGN NOTES :  
*   CAUTIONS :		
*****************************************************************************/
MMRESULT
private_WaveInOpen(
	LPWAVEFORMATEX lpFormat,
	BOOL fQueryFormatOnly
	)
{
	MMRESULT mmRet = MMSYSERR_NOERROR;

	FUNC_WPDD("+PDD_WaveInOpen");
	//Stop DMA
	READ_REGISTER_ULONG((PULONG)pCHCR1  );

/****************************************************************************
 * 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_DM_INCREMENTED |
		DMAC_CHCR_TS_32 |
		DMAC_CHCR_IE_NOT_GENARATED |
		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_DM_INCREMENTED |
		SH3_DMAC_CHCR_TS_32 |
		SH3_DMAC_CHCR_IE_NOT_GENARATED |
		SH3_DMAC_CHCR_DE_DISABLED );
#endif // ((SH_PLATFORM == PLATFORM_ASPEN) || (SH_PLATFORM == PLATFORM_BIGSUR))

/****************************************************************************
 * End of Modification done by Maneesh Gupta
 ****************************************************************************/
	lpFormat2=lpFormat;		// for WaveInContinue

	// Allow PCM, mono or stereo, 8 or 16 bit at 11, 22, or 44 KHz

	if ((lpFormat->wFormatTag != WAVE_FORMAT_PCM) || 
		(lpFormat->nChannels != Monaural && lpFormat->nChannels != Stereo) ||
		(lpFormat->nSamplesPerSec != Hz11025 && lpFormat->nSamplesPerSec != Hz22050 && lpFormat->nSamplesPerSec != Hz44100) ||
		(lpFormat->wBitsPerSample != SixteenBits && lpFormat->wBitsPerSample != EightBits))
	{
		mmRet = WAVERR_BADFORMAT;
	}

	if (fQueryFormatOnly || mmRet != MMSYSERR_NOERROR)
	{
		goto EXIT;
	}

	// Open with the given format. Choose a playback rate from this.
	
	g_pwfx[WAPI_IN] = lpFormat;

	if (g_pwfx[WAPI_IN]->wBitsPerSample == EightBits)
	{
		if (g_pwfx[WAPI_IN]->nChannels == Monaural) 
			g_pcmtype[WAPI_IN] = PCM_TYPE_M8;
		else
			g_pcmtype[WAPI_IN] = PCM_TYPE_S8;
	}
	else
	{
		if (g_pwfx[WAPI_IN]->nChannels == Monaural)
			g_pcmtype[WAPI_IN] = PCM_TYPE_M16;
		else
			g_pcmtype[WAPI_IN] = PCM_TYPE_S16;
	}

	// Power on and initialize the AFE
	
	private_AudioInPowerHandler( FALSE, FALSE );

	// clear stats
	
	g_dwOverruns = 0;
	g_dwFrames = 0;

EXIT:
	FUNC_WPDD("-PDD_WaveInOpen");
	return(mmRet);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -