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

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

?? hwctxt.cpp

?? 三星2440 cpu WINCE 5.00板級支持包
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

	//------ 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一区二区三区免费野_久草精品视频
不卡一区在线观看| 欧美日韩精品一区二区三区 | 久久99热99| 欧美一区二区三区视频在线观看 | 久久精品久久综合| 欧美一区二区啪啪| 国产中文一区二区三区| 国产精品婷婷午夜在线观看| 成人app网站| 亚洲一区在线电影| 91精品国产高清一区二区三区| 免费看黄色91| 中文字幕成人av| 色婷婷av一区| 天堂久久一区二区三区| 精品国产人成亚洲区| 国产精品亚洲第一区在线暖暖韩国 | 黑人巨大精品欧美一区| 久久久不卡网国产精品一区| 成人aaaa免费全部观看| 亚洲国产va精品久久久不卡综合 | 国产精品亚洲一区二区三区在线 | 欧美一级片免费看| 国产九色精品成人porny| 亚洲免费看黄网站| 欧美一级在线观看| 成人av在线电影| 亚洲成人av免费| 国产性天天综合网| 欧美日韩三级一区二区| 激情图片小说一区| 夜夜夜精品看看| 欧美成人一区二区三区片免费| 成人午夜大片免费观看| 亚洲高清中文字幕| 国产免费成人在线视频| 欧美日韩国产成人在线免费| 国产成人小视频| 亚洲一区二区在线免费观看视频| 精品国内片67194| 91黄色免费网站| 不卡电影一区二区三区| 日韩vs国产vs欧美| 亚洲欧美aⅴ...| 久久免费偷拍视频| 欧美日韩一区二区三区在线| 国产精品亚洲第一区在线暖暖韩国| 亚洲一二三四区| 国产精品免费久久久久| 日韩欧美国产综合| 欧美日韩国产综合一区二区三区| 懂色中文一区二区在线播放| 日韩不卡免费视频| 一区二区三区美女| 国产精品乱码妇女bbbb| 日韩欧美一区在线观看| 精品视频色一区| 成人福利电影精品一区二区在线观看| 三级在线观看一区二区 | 久久精品视频在线免费观看| 欧美挠脚心视频网站| 91丨国产丨九色丨pron| 国产老妇另类xxxxx| 亚洲h动漫在线| 亚洲综合一区二区精品导航| 成人欧美一区二区三区视频网页 | 日产精品久久久久久久性色| 一区二区三区在线观看网站| 国产精品全国免费观看高清| 久久在线免费观看| 日韩一区二区三区视频在线观看| 欧美性感一类影片在线播放| 97精品电影院| 99麻豆久久久国产精品免费| 成人久久视频在线观看| 懂色av中文字幕一区二区三区| 国产在线精品一区二区不卡了| 美国十次了思思久久精品导航| 天天影视涩香欲综合网| 亚洲a一区二区| 亚洲成av人片一区二区| 亚洲 欧美综合在线网络| 亚洲福中文字幕伊人影院| 亚洲一区二区在线观看视频 | 99re亚洲国产精品| 成人aaaa免费全部观看| 97se狠狠狠综合亚洲狠狠| 不卡av在线网| 色婷婷综合久久久| 欧美性猛交一区二区三区精品| 欧美日韩精品欧美日韩精品一| 欧美三级在线视频| 日韩欧美的一区| 久久久蜜桃精品| 国产免费成人在线视频| 亚洲欧洲三级电影| 一区二区三区四区中文字幕| 亚洲伊人色欲综合网| 日韩电影在线一区| 国产伦精品一区二区三区免费迷 | 久久国产视频网| 国产一区二三区| 波多野结衣的一区二区三区| 91麻豆自制传媒国产之光| 欧美性大战久久| 精品国产一区二区三区不卡| 国产精品久久久久永久免费观看 | 成人一级片网址| 在线观看av一区| 欧美成人女星排行榜| 国产精品国产自产拍在线| 亚洲综合色噜噜狠狠| 秋霞国产午夜精品免费视频| 国产美女在线精品| 色婷婷久久综合| 2020国产精品久久精品美国| 亚洲视频免费在线观看| 免费观看91视频大全| 国产成人av电影在线| 欧美主播一区二区三区| 精品国产乱码久久久久久影片| 17c精品麻豆一区二区免费| 丝袜诱惑制服诱惑色一区在线观看| 久久99精品一区二区三区| 97久久超碰国产精品| 日韩一区二区三区电影在线观看| 日本一区二区电影| 日韩电影在线免费| 91香蕉视频污| 久久久国产一区二区三区四区小说 | 久久色在线观看| 亚洲国产色一区| 成人av在线网站| 欧美变态口味重另类| 亚洲国产一区二区在线播放| 国产精品一区二区在线看| 欧美片在线播放| 亚洲色图欧洲色图婷婷| 精品一区二区三区香蕉蜜桃| 欧美xxxxxxxxx| 三级欧美在线一区| 99re视频精品| 国产精品伦一区二区三级视频| 精品一区二区在线观看| 欧美视频精品在线观看| 国产精品国产三级国产普通话蜜臀 | 在线视频一区二区三区| 91精品国产综合久久久久久| 国产日韩欧美精品综合| 亚洲一区二区三区在线看| 成人黄色软件下载| 日韩欧美一级在线播放| 一区二区三区在线免费观看| 久久精品噜噜噜成人88aⅴ| 91.成人天堂一区| 国产精品视频线看| 精品亚洲国内自在自线福利| 国产盗摄女厕一区二区三区| 欧美电影免费观看高清完整版 | 国产福利精品导航| 7777精品伊人久久久大香线蕉经典版下载 | 国产精品欧美久久久久无广告| 亚洲一区二区三区视频在线| 成人av在线播放网址| 日韩欧美www| 美洲天堂一区二卡三卡四卡视频| 欧美午夜宅男影院| 亚洲天堂免费看| 九九九久久久精品| 日韩欧美一级二级三级久久久| 亚洲高清在线精品| 在线亚洲一区二区| 国产精品女人毛片| 国产高清精品在线| 精品成人在线观看| 精品亚洲国产成人av制服丝袜 | 精品国产一区二区在线观看| 天天综合日日夜夜精品| 欧美亚洲综合网| 亚洲gay无套男同| 欧美另类高清zo欧美| 亚洲一区免费在线观看| 欧美综合天天夜夜久久| 午夜精品久久久久久久99樱桃| 色天使色偷偷av一区二区| 亚洲视频在线观看一区| 91福利视频在线| 五月婷婷色综合| 在线综合视频播放| 久久国产剧场电影| 欧美精品丝袜久久久中文字幕| 青娱乐精品在线视频| 日韩视频免费观看高清在线视频| 久久成人免费电影| 欧美一级精品大片| 精品一区二区三区在线播放视频| 26uuu另类欧美| 成人一级视频在线观看| 亚洲美腿欧美偷拍| 欧美日韩五月天|