亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hwctxt.cpp

?? s3c2440 WINCE 5.00 官方bsp
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
void HardwareContext::StopInputDMA()
{

	//------ On platforms with the revsion of the Samsung SC2440 CPU with the IIS SLAVE bug fix, this -----
	//		 code can be used to configure DMA channel 1 for input.

	//----- 1. If the output DMA is running, stop it -----
    if (m_InputDMARunning)
	{
		m_InputDMAStatus = DMA_CLEAR;				
		
		g_pIISregs->IISCON &= ~RECEIVE_DMA_REQUEST_ENABLE;
		g_pIISregs->IISFCON &= ~(RECEIVE_FIFO_ACCESS_DMA  | RECEIVE_FIFO_ENABLE);
		g_pDMAregs->DMASKTRIG1 |= STOP_DMA_TRANSFER;
		g_pDMAregs->DMASKTRIG1 &= ~ENABLE_DMA_CHANNEL;
		g_pIISregs->IISMOD  &= ~IIS_RECEIVE_MODE;
		AUDIO_IN_CLEAR_INTERRUPTS();
		AudioMute(DMA_CH_MIC, TRUE);		
    }

	m_InputDMARunning = FALSE;
	Codec_channel();
}


DWORD HardwareContext::GetInterruptThreadPriority()
{
    HKEY hDevKey;
    DWORD dwValType;
    DWORD dwValLen;
    DWORD dwPrio = 249; // Default priority

    hDevKey = OpenDeviceKey((LPWSTR)m_DriverIndex);
    if (hDevKey)
    {
        dwValLen = sizeof(DWORD);
        RegQueryValueEx(
            hDevKey,
            TEXT("Priority256"),
            NULL,
            &dwValType,
            (PUCHAR)&dwPrio,
            &dwValLen);
        RegCloseKey(hDevKey);
    }

    return dwPrio;
}



/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		InitInterruptThread()

Description:	Initializes the IST for handling DMA interrupts.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
BOOL HardwareContext::InitInterruptThread()
{
    m_hAudioInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (!m_hAudioInterrupt)
    {
        ERRMSG("Unable to create interrupt event");
        return(FALSE);
    }

    if (! InterruptInitialize(m_dwSysintrOutput, m_hAudioInterrupt, NULL, 0)) {
        ERRMSG("Unable to initialize output interrupt");
        return FALSE;
    }
    if (! InterruptInitialize(m_dwSysintrInput, m_hAudioInterrupt, NULL, 0)) {
        ERRMSG("Unable to initialize input interrupt");
        return FALSE;
    }

    m_hAudioInterruptThread  = CreateThread((LPSECURITY_ATTRIBUTES)NULL,
                                            0,
                                            (LPTHREAD_START_ROUTINE)CallInterruptThread,
                                            this,
                                            0,
                                            NULL);
    if (!m_hAudioInterruptThread)
    {
        ERRMSG("Unable to create interrupt thread");
        return FALSE;
    }

    // Bump up the priority since the interrupt must be serviced immediately.
	CeSetThreadPriority(m_hAudioInterruptThread, GetInterruptThreadPriority());

    return(TRUE);
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		PowerUp()

Description:	Powers up the audio codec chip.

Notes:			Currently, this function is unimplemented because
				the audio codec chip is ONLY powered up when the 
				user wishes to play or record.  The AudioMute() function
				handles the powerup sequence.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
void HardwareContext::PowerUp()
{
//    SPI_Init();
    I2S_Init();
}

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		PowerDown()

Description:	Powers down the audio codec chip.

Notes:			Even if the input/output channels are muted, this
				function powers down the audio codec chip in order
				to conserve battery power.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
void HardwareContext::PowerDown()
{
    StopOutputDMA();
	AudioMute((DMA_CH_OUT | DMA_CH_MIC), TRUE);
}


//############################################ Helper Functions #############################################

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		TransferOutputBuffer()

Description:	Retrieves the next "mixed" audio buffer of data to
				DMA into the output channel.

Returns:		Number of bytes needing to be transferred.
-------------------------------------------------------------------*/
ULONG HardwareContext::TransferOutputBuffer(ULONG NumBuf)
{
    ULONG BytesTransferred = 0;

    PBYTE pBufferStart = m_Output_pbDMA_PAGES[NumBuf];
    PBYTE pBufferEnd = pBufferStart + AUDIO_DMA_PAGE_SIZE;
    PBYTE pBufferLast;

	__try
	{
		pBufferLast = m_OutputDeviceContext.TransferBuffer(pBufferStart, pBufferEnd,NULL);
		BytesTransferred = m_OutBytes[NumBuf] = pBufferLast-pBufferStart;

		// Enable if you need to clear the rest of the DMA buffer
		StreamContext::ClearBuffer(pBufferLast,pBufferEnd);
		if(NumBuf == OUT_BUFFER_A)			// Output Buffer A
		{
			m_OutputDMAStatus &= ~DMA_DONEA;
			m_OutputDMAStatus |= DMA_STRTA;
		}
		else								// Output Buffer B
		{
			m_OutputDMAStatus &= ~DMA_DONEB;
			m_OutputDMAStatus |= DMA_STRTB;
		}
	}
	__except(EXCEPTION_EXECUTE_HANDLER) 
	{
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVDEV2.DLL:TransferOutputBuffer() - EXCEPTION: %d"), GetExceptionCode()));
	}

    return BytesTransferred;
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		TransferOutputBuffers()

Description:	Determines which output buffer (A or B) needs to 
				be filled with sound data.  The correct buffer is
				then populated with data and ready to DMA to the 
				output channel.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
ULONG HardwareContext::TransferOutputBuffers(DWORD dwDCSR)
{
    ULONG BytesTransferred = 0;

    ULONG BytesTotal;
    DWORD Bits = dwDCSR & (DMA_DONEA|DMA_DONEB|DMA_BIU);

//	RETAILMSG(1,(TEXT("%x\n"),Bits));
	switch (Bits)
    {
    case 0:
    case DMA_BIU:
        // No done bits set- must not be my interrupt
        return 0;
    case DMA_DONEA|DMA_DONEB|DMA_BIU:
        // Load B, then A
        BytesTransferred = TransferOutputBuffer(OUT_BUFFER_B);
        // fall through
    case DMA_DONEA: // This should never happen!
    case DMA_DONEA|DMA_BIU:
		BytesTransferred += TransferOutputBuffer(OUT_BUFFER_A);		// charlie, A => B
        break;
    case DMA_DONEA|DMA_DONEB:
        // Load A, then B
        BytesTransferred = TransferOutputBuffer(OUT_BUFFER_A);
        // charlie
        BytesTransferred += TransferOutputBuffer(OUT_BUFFER_B);
        break;		// charlie
        // fall through
    case DMA_DONEB|DMA_BIU: // This should never happen!
    case DMA_DONEB:
        // Load B
        BytesTransferred += TransferOutputBuffer(OUT_BUFFER_B);		// charlie, B => A
        break;
    }

    // If it was our interrupt, but we weren't able to transfer any bytes
    // (e.g. no full buffers ready to be emptied)
    // and all the output DMA buffers are now empty, then stop the output DMA
    BytesTotal = m_OutBytes[OUT_BUFFER_A]+m_OutBytes[OUT_BUFFER_B];

	if (BytesTotal==0)
    {
		StopOutputDMA();
    }
    return BytesTransferred;
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		TransferInputBuffer()

Description:	Retrieves the chunk of recorded sound data and inputs
				it into an audio buffer for potential "mixing".

Returns:		Number of bytes needing to be transferred.
-------------------------------------------------------------------*/
ULONG HardwareContext::TransferInputBuffer(ULONG NumBuf)
{
    ULONG BytesTransferred = 0;

    PBYTE pBufferStart = m_Input_pbDMA_PAGES[NumBuf];
    PBYTE pBufferEnd = pBufferStart + AUDIO_DMA_PAGE_SIZE;
    PBYTE pBufferLast;

	__try
	{
		pBufferLast = m_InputDeviceContext.TransferBuffer(pBufferStart, pBufferEnd,NULL);
		BytesTransferred = m_InBytes[NumBuf] = pBufferLast-pBufferStart;

		if(NumBuf == IN_BUFFER_A)			// Input Buffer A
		{
			m_InputDMAStatus &= ~DMA_DONEA;
			m_InputDMAStatus |= DMA_STRTA;
		}
		else								// Input Buffer B
		{
			m_InputDMAStatus &= ~DMA_DONEB;
			m_InputDMAStatus |= DMA_STRTB;
		}

	}
	__except(EXCEPTION_EXECUTE_HANDLER) 
	{
		DEBUGMSG(ZONE_ERROR, (TEXT("WAVDEV2.DLL:TransferInputBuffer() - EXCEPTION: %d"), GetExceptionCode()));
	}

    return BytesTransferred;
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		TransferInputBuffers()

Description:	Determines which input buffer (A or B) needs to 
				be filled with recorded sound data.  The correct 
				buffer is then populated with recorded sound data
				from the input channel.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
ULONG HardwareContext::TransferInputBuffers(DWORD dwDCSR)
{
    ULONG BytesTransferred=0;
    DWORD Bits = dwDCSR & (DMA_DONEA|DMA_DONEB|DMA_BIU);

    switch (Bits)
    {
    case 0:
    case DMA_BIU:
        // No done bits set- must not be my interrupt
        return 0;
    case DMA_DONEA|DMA_DONEB|DMA_BIU:
        // Load B, then A
        BytesTransferred = TransferInputBuffer(IN_BUFFER_B);
        // fall through
    case DMA_DONEA: // This should never happen!
    case DMA_DONEA|DMA_BIU:
        // Load A
        BytesTransferred += TransferInputBuffer(IN_BUFFER_A);
        break;
    case DMA_DONEA|DMA_DONEB:
        // Load A, then B
        BytesTransferred = TransferInputBuffer(IN_BUFFER_A);
		BytesTransferred += TransferInputBuffer(IN_BUFFER_B);
		break;
        // fall through
    case DMA_DONEB|DMA_BIU: // This should never happen!
    case DMA_DONEB:
        // Load B
        BytesTransferred += TransferInputBuffer(IN_BUFFER_B);
        break;
    }

    // If it was our interrupt, but we weren't able to transfer any bytes
    // (e.g. no empty buffers ready to be filled)
    // Then stop the input DMA
    if (BytesTransferred==0)
    {
        StopInputDMA();
    }
    return BytesTransferred;
}


void HardwareContext::InterruptThread()
{
    ULONG InputTransferred, OutputTransferred;
	BOOL dmaInterruptSource = 0;

    // Fast way to access embedded pointers in wave headers in other processes.
	SetProcPermissions((DWORD)-1);

    while(TRUE)
    {
		WaitForSingleObject(m_hAudioInterrupt, INFINITE);
		dmaInterruptSource = 0;
		//----- 1. Grab the lock -----
		Lock();

		__try
		{

			//----- 3. Determine the interrupt source (input DMA operation or output DMA operation?) -----
			//----- NOTE:	Often, platforms use two separate DMA channels for input/output operations but
			//				have the OAL return SYSINTR_AUDIO as the interrupt source.  If this is the case,
			//				then the interrupt source (input or output DMA channel) must be determined in
			//				this step.

			if( s2440INT->INTMSK & (1 << IRQ_DMA1) ){
				dmaInterruptSource |= DMA_CH_MIC;								// Input DMA is supported...
			    //----- 2. Acknowledge the DMA interrupt -----
			    InterruptDone(m_dwSysintrInput);
			}
			
			if( s2440INT->INTMSK & (1 << IRQ_DMA2) ){
				dmaInterruptSource |= DMA_CH_OUT;								// Output DMA is supported...
			    //----- 2. Acknowledge the DMA interrupt -----
			    InterruptDone(m_dwSysintrOutput);
			}
						
           
            //----- 4. Handle any interrupts on the input source -----
			//		   NOTE: The InterruptDone() call below automatically clears the interrupt.
			if ((dmaInterruptSource & DMA_CH_MIC) != 0)
			{
				//----- Determine which buffer just completed the DMA transfer -----
				if(m_InputDMAStatus & DMA_BIU)
				{
					m_InputDMAStatus &= ~DMA_STRTB;							// Buffer B just completed...
					m_InputDMAStatus |= DMA_DONEB;

					m_InputDMAStatus &= ~DMA_BIU;							// Buffer A is in use
					SELECT_AUDIO_DMA_INPUT_BUFFER_B();
					DEBUGMSG(ZONE_FUNCTION,(TEXT("1\n")));
				}else
				{
					m_InputDMAStatus &= ~DMA_STRTA;							// Buffer A just completed...
					m_InputDMAStatus |= DMA_DONEA;

					m_InputDMAStatus |= DMA_BIU;							// Buffer B is in use
					SELECT_AUDIO_DMA_INPUT_BUFFER_A();
					DEBUGMSG(ZONE_FUNCTION,(TEXT("2\n")));
				}
				
				//----- 6. Retrieve the next chunk of recorded data from the non-playing buffer -----
				InputTransferred = TransferInputBuffers(m_InputDMAStatus);			
			}

			//----- 7. Handle any interrupts on the output source -----
			//		   NOTE: The InterruptDone() call below automatically clears the interrupt.
			if ((dmaInterruptSource & DMA_CH_OUT) != 0)
			{	
				//----- Determine which buffer just completed the DMA transfer -----
				if(m_OutputDMAStatus & DMA_BIU)
				{
					m_OutputDMAStatus &= ~DMA_STRTB;						// Buffer A just completed...
					m_OutputDMAStatus |= DMA_DONEB;

					m_OutputDMAStatus &= ~DMA_BIU;							// Buffer B is in use
					
					while((g_pDMAregs->DSTAT2&0xfffff)==0);
					SELECT_AUDIO_DMA_OUTPUT_BUFFER_B();		// charlie. B => A
				}else
				{
					m_OutputDMAStatus &= ~DMA_STRTA;						// Buffer B just completed...
					m_OutputDMAStatus |= DMA_DONEA;

					m_OutputDMAStatus |= DMA_BIU;							// Buffer A is in use
					
					while((g_pDMAregs->DSTAT2&0xfffff)==0);
					SELECT_AUDIO_DMA_OUTPUT_BUFFER_A();		// charlie. B => A
				}
				//----- 9. Fill the non-playing buffer with the next chunk of audio data to play -----
				OutputTransferred = TransferOutputBuffers(m_OutputDMAStatus);			
			}

		}
		__except(EXCEPTION_EXECUTE_HANDLER) 
		{
			DEBUGMSG(ZONE_ERROR, (TEXT("WAVDEV2.DLL:InterruptThread() - EXCEPTION: %d"), GetExceptionCode()));
		}

		//----- 10. Give up the lock ----- 
		Unlock();
	}  
}


/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function:		AudioMute()

Description:	Mutes/unmutes the specified audio channel.

Notes:			If both audio channels are MUTED, then the chip 
				is powered down to conserve battery life.  
				Alternatively, if either audio channel is unMUTED, 
				the chip is powered up.

Returns:		Boolean indicating success
-------------------------------------------------------------------*/
BOOL HardwareContext::AudioMute(DWORD channel, BOOL bMute)
{
	static DWORD dwActiveChannel = 0;
	return(TRUE);
}


void CallInterruptThread(HardwareContext *pHWContext)
{
    pHWContext->InterruptThread();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩精品一区二区三区| 国产日韩欧美综合在线| 精品国产凹凸成av人网站| 中文字幕av一区二区三区| 亚洲人亚洲人成电影网站色| 午夜精品久久久| 成人午夜免费av| 欧美成人一级视频| 亚洲另类在线一区| 国产精品久久久久精k8 | 裸体在线国模精品偷拍| 春色校园综合激情亚洲| 欧美日本视频在线| 中文字幕一区二区5566日韩| 蜜臀av一区二区三区| 91美女蜜桃在线| 久久人人97超碰com| 日韩国产欧美三级| av中文字幕不卡| 欧美videos中文字幕| 亚洲男人的天堂在线aⅴ视频| 黄页网站大全一区二区| 欧美高清性hdvideosex| 亚洲最新视频在线播放| 成人免费看片app下载| 国产午夜精品久久久久久久| 五月天亚洲婷婷| 成人av手机在线观看| 国产蜜臀av在线一区二区三区| 最新高清无码专区| 青青草国产精品亚洲专区无| 欧美亚洲一区二区在线观看| 亚洲视频在线观看三级| 91在线视频免费观看| 亚洲三级在线免费| 色偷偷成人一区二区三区91| 亚洲精品视频在线| 欧美日韩一区二区在线观看| 丝袜亚洲另类欧美| 日韩一级完整毛片| 久久成人麻豆午夜电影| 久久蜜桃av一区二区天堂| 国产成人一区二区精品非洲| 欧美高清在线一区| 91玉足脚交白嫩脚丫在线播放| 亚洲美女视频在线观看| 欧美久久久久久久久中文字幕| 日韩av二区在线播放| 欧美国产一区二区| 在线观看亚洲精品| 国产在线日韩欧美| 18成人在线观看| 日韩午夜激情av| 99久久精品久久久久久清纯| 在线成人午夜影院| 成人av免费在线| 久久影音资源网| 色综合天天综合网天天狠天天| 青青草国产成人av片免费| 国产精品久久久久久久久果冻传媒 | 91国偷自产一区二区开放时间| 亚洲成人在线网站| 日本国产一区二区| 欧美tk—视频vk| 99在线视频精品| 蜜臀av在线播放一区二区三区| 国产午夜精品在线观看| 色94色欧美sute亚洲13| 国产一区欧美二区| 亚洲午夜久久久| 国产日韩一级二级三级| 国精品**一区二区三区在线蜜桃| 亚洲精品一二三四区| 国产精品久久久久影院老司 | 国产aⅴ精品一区二区三区色成熟| 欧美婷婷六月丁香综合色| 精品一区二区在线播放| 性做久久久久久久免费看| 一区在线播放视频| 日本一二三不卡| 精品国产第一区二区三区观看体验| 欧美综合亚洲图片综合区| 色综合久久精品| 日韩高清不卡一区二区| 亚洲国产精品自拍| 亚洲mv大片欧洲mv大片精品| 亚洲自拍偷拍麻豆| 一个色综合网站| 亚洲www啪成人一区二区麻豆| 伊人开心综合网| 一区二区激情小说| 久久久九九九九| 中国av一区二区三区| 欧美高清在线一区二区| 国产精品大尺度| 亚洲欧美日韩国产综合在线| 国产精品国产馆在线真实露脸| 国产精品亚洲人在线观看| 蜜桃精品视频在线| 欧美日韩在线播放三区四区| 岛国一区二区三区| 不卡电影一区二区三区| 91麻豆免费在线观看| 91麻豆文化传媒在线观看| 欧美日韩亚洲综合| 精品免费视频.| 国产精品不卡一区| 亚洲一卡二卡三卡四卡五卡| 久久九九国产精品| 亚洲夂夂婷婷色拍ww47| 麻豆精品在线看| 不卡的看片网站| 日韩一区二区三区四区五区六区| 欧美精品一区男女天堂| 国产精品久久免费看| 午夜一区二区三区在线观看| 狠狠色狠狠色综合系列| 欧美在线免费播放| 国产欧美一区二区三区网站| 亚洲第一主播视频| 成人性生交大片免费看中文 | 麻豆91精品视频| 欧美在线一二三| 国产精品久久久久影院亚瑟| 日本欧美一区二区三区乱码 | 精品久久久久久久一区二区蜜臀| 久久伊99综合婷婷久久伊| 亚洲一区二区三区自拍| 国产老妇另类xxxxx| 欧美一级精品大片| 亚洲第一激情av| 国产中文一区二区三区| 欧美美女直播网站| 亚洲欧美日韩久久| 懂色av一区二区夜夜嗨| 在线视频你懂得一区| 日韩一级在线观看| 亚洲精品久久久久久国产精华液| 国产在线视频不卡二| 国产盗摄一区二区三区| 亚洲精品在线电影| 日韩经典中文字幕一区| 欧美性大战久久| 亚洲中国最大av网站| 欧美视频一区二区三区在线观看| 欧美久久久久久久久| 天天影视涩香欲综合网| 欧洲一区在线电影| 亚洲欧美自拍偷拍色图| 成人亚洲一区二区一| 国产精品另类一区| 91视频免费看| 亚洲一卡二卡三卡四卡| 激情综合亚洲精品| 久久综合九色综合97婷婷女人 | 欧美精三区欧美精三区| 日韩在线卡一卡二| 精品国产髙清在线看国产毛片| 久久99精品久久久| 欧美国产一区视频在线观看| 99re成人精品视频| 中文字幕一区二区三区视频| 色婷婷一区二区三区四区| 亚洲丝袜自拍清纯另类| 91麻豆精品91久久久久同性| 极品尤物av久久免费看| 日本一区二区免费在线观看视频| 成人精品鲁一区一区二区| 亚洲三级视频在线观看| 欧美一级理论性理论a| 高清不卡一二三区| 日韩av午夜在线观看| 国产精品―色哟哟| 欧美日韩国产高清一区二区三区| 日韩精品电影在线观看| 国产欧美精品国产国产专区| 欧美亚洲免费在线一区| 国产高清精品在线| 国产精品久久久久久福利一牛影视 | 久久精品国产久精国产爱| 亚洲国产精品v| 蜜乳av一区二区| 亚洲人精品午夜| 欧美成人乱码一区二区三区| 丝袜亚洲另类欧美综合| 在线欧美小视频| 成人国产精品免费观看视频| 久久国产视频网| 午夜影院在线观看欧美| 亚洲精品中文在线| 国产色一区二区| 国产日本欧洲亚洲| 国产欧美一区二区三区在线看蜜臀| 欧美成人福利视频| 欧美成人性战久久| 国产片一区二区| 亚洲国产精品黑人久久久| 国产夜色精品一区二区av| 亚洲国产成人在线| 中文字幕综合网|