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

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

?? hwctxt.cpp

?? 基于WINCE 的音頻驅動源碼
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
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一区二区三区免费野_久草精品视频
久久精品日产第一区二区三区高清版| 国产精品久久777777| 精品99999| 成人欧美一区二区三区小说| 亚洲bdsm女犯bdsm网站| 高清不卡在线观看av| 欧美日韩国产一区二区三区地区| 国产日韩影视精品| 视频一区视频二区在线观看| 白白色 亚洲乱淫| 日韩欧美国产一二三区| 亚洲欧美另类在线| 大尺度一区二区| 欧美r级在线观看| 婷婷综合五月天| 91啦中文在线观看| 亚洲欧洲国产日本综合| 国产精品一品视频| 日韩免费在线观看| 日韩va亚洲va欧美va久久| 日本韩国精品一区二区在线观看| 国产亚洲综合在线| 久久99国产精品久久| 欧美日韩亚洲综合| 亚洲国产综合91精品麻豆 | 久久这里都是精品| 亚洲v中文字幕| 欧美专区在线观看一区| 一区二区欧美在线观看| 99re这里都是精品| 亚洲欧洲另类国产综合| 国产麻豆精品视频| 久久精品亚洲一区二区三区浴池 | 日本亚洲免费观看| 欧美人牲a欧美精品| 亚洲蜜桃精久久久久久久| av毛片久久久久**hd| 国产亚洲欧美激情| 懂色av一区二区三区免费看| 久久网站最新地址| 国产一区二区三区免费看| 日韩你懂的在线播放| 九九精品视频在线看| 日韩一区二区电影网| 青青草一区二区三区| 日韩欧美精品在线视频| 久久精品国产精品亚洲红杏 | 国产精品美女久久久久久久久| 欧美色图一区二区三区| 亚洲午夜影视影院在线观看| 91福利精品视频| 亚洲狠狠丁香婷婷综合久久久| 一本一道久久a久久精品 | 精品久久久三级丝袜| 久久av资源网| 国产精品久久久久久妇女6080 | 久久精品久久综合| 久久久久九九视频| 91在线观看一区二区| 亚洲国产毛片aaaaa无费看| 欧美一区二区日韩一区二区| 韩国中文字幕2020精品| 中文字幕久久午夜不卡| 欧美色视频在线观看| 毛片av一区二区三区| 国产喷白浆一区二区三区| jizzjizzjizz欧美| 亚洲一区二区五区| 精品99一区二区三区| proumb性欧美在线观看| 蜜臀久久99精品久久久久久9 | 欧美一区二区三区不卡| 国产一区二区三区黄视频| 狠狠v欧美v日韩v亚洲ⅴ| 久久久久久久久久久黄色| 色哟哟国产精品| 久久91精品久久久久久秒播| 亚洲日本一区二区| 日韩欧美一级精品久久| 色又黄又爽网站www久久| 人人精品人人爱| 中文字幕中文在线不卡住| 日韩三级中文字幕| 99精品一区二区三区| 久久精品国产免费| 亚洲一区自拍偷拍| 国产喷白浆一区二区三区| 欧美一区二区三区在线视频| www.欧美亚洲| 精品一区二区综合| 亚洲成人福利片| 亚洲欧美一区二区不卡| 国产亚洲一二三区| 欧美一区2区视频在线观看| 91丝袜高跟美女视频| 国产999精品久久久久久| 日韩福利电影在线| 亚洲国产精品精华液网站| 久久一区二区视频| 精品视频在线看| 色av一区二区| 成人午夜av电影| 精品中文字幕一区二区小辣椒| 亚洲成av人片在线| 亚洲一区二区三区四区在线观看 | 日本欧美肥老太交大片| 亚洲三级电影网站| 中文字幕在线免费不卡| 国产欧美日韩另类视频免费观看| 日韩一级免费观看| 91精品国产综合久久福利| 欧美性生活大片视频| 色婷婷精品大视频在线蜜桃视频| 国产+成+人+亚洲欧洲自线| 免费观看一级特黄欧美大片| 婷婷久久综合九色综合绿巨人 | 一本一道综合狠狠老| 成a人片亚洲日本久久| 国产成人午夜99999| 欧美三级日韩三级| 在线免费观看不卡av| 色综合天天综合网天天狠天天 | 蜜桃在线一区二区三区| 五月婷婷综合激情| 日韩av电影天堂| 日韩电影网1区2区| 九九视频精品免费| 国产一区欧美日韩| 成人一区二区三区视频在线观看| 国产一区二区视频在线| 国产成人综合亚洲网站| 成年人网站91| 在线视频中文字幕一区二区| 欧美区在线观看| 6080yy午夜一二三区久久| 91精品国产麻豆| 久久久不卡网国产精品二区 | 精品乱人伦小说| 国产亚洲短视频| 亚洲欧洲日韩综合一区二区| 亚洲人成伊人成综合网小说| 亚洲制服丝袜av| 久久国产生活片100| 国产剧情一区在线| 99久久精品99国产精品| 色就色 综合激情| 日韩一区二区在线播放| 久久久亚洲精华液精华液精华液 | 国产精品久久久99| 亚洲乱码精品一二三四区日韩在线| 又紧又大又爽精品一区二区| 91蜜桃在线观看| 91精品国产91久久综合桃花| 久久久亚洲精品石原莉奈| 亚洲美女偷拍久久| 日本不卡一区二区三区高清视频| 国产综合色产在线精品| 91麻豆国产精品久久| 欧美美女喷水视频| 久久免费看少妇高潮| 亚洲国产美女搞黄色| 国产精品一区二区三区网站| 91成人免费电影| 久久综合国产精品| 亚洲综合色网站| 国产成人aaa| 制服.丝袜.亚洲.另类.中文| 国产精品久久国产精麻豆99网站| 视频一区二区三区中文字幕| 成人综合在线视频| 日韩欧美一区二区视频| 最近日韩中文字幕| 久久国产人妖系列| 欧美天堂亚洲电影院在线播放| 久久久久久免费网| 天堂影院一区二区| 91色乱码一区二区三区| 久久久亚洲精品石原莉奈| 五月天网站亚洲| 国产偷国产偷精品高清尤物| 亚洲国产美女搞黄色| 成人av网址在线| 欧美www视频| 视频一区视频二区中文字幕| 一本色道亚洲精品aⅴ| 国产精品午夜在线| 国产一区二区三区视频在线播放| 91精品久久久久久蜜臀| 夜夜嗨av一区二区三区四季av| 丰满亚洲少妇av| 久久久噜噜噜久久人人看 | 麻豆一区二区在线| 911精品产国品一二三产区| 亚洲综合丝袜美腿| 91玉足脚交白嫩脚丫在线播放| 国产精品美女久久久久aⅴ国产馆| 国产一区二三区| 久久久久久久网| 成人午夜免费视频| 国产精品视频一二三区|