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

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

?? hwctxt.cpp

?? windows CE 的BSP開發包.包含眾多的驅動程序和OAL層的開發代碼
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
				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);
    int tmp;

    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;
	int tmp;
	BOOL dmaInterruptSource = 0;

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

    while(TRUE)
    {
		WaitForSingleObject(m_hAudioInterrupt, INFINITE);
		DEBUGMSG(1,(TEXT("0x%x\n"),s2440INT->rINTMSK));
		DEBUGMSG(1,(TEXT("start\n")));
		dmaInterruptSource = 0;
		//----- 1. Grab the lock -----
		Lock();

		__try
		{
			DEBUGMSG(1,(TEXT("try\n")));

			//----- 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.
			// charlie, determine the interrupt source

			if( s2440INT->rINTMSK & BIT_DMA1 ){
				dmaInterruptSource |= DMA_CH_MIC;								// Input DMA is supported...
			}
			
			if( s2440INT->rINTMSK & BIT_DMA2 ){
				dmaInterruptSource |= DMA_CH_OUT;								// Output DMA is supported...
			}
						
			// For determine the interrupt source
			//----- 2. Acknowledge the DMA interrupt -----
			InterruptDone(m_IntrAudio);

			if ( m_Dx != D0 ) continue;

			//----- 4. Handle any interrupts on the input source -----
			//		   NOTE: The InterruptDone() call below automatically clears the interrupt.
//			if((m_InputDMARunning) && (dmaInterruptSource == DMA_CH_MIC))
			if((dmaInterruptSource == DMA_CH_MIC))
			{
				//----- 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();
					v_pDMAregs->rDIDST1 = (int)(AUDIO_DMA_BUFFER_PHYS+3*AUDIO_DMA_PAGE_SIZE);

					DEBUGMSG(1,(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();
					v_pDMAregs->rDIDST1 = (int)(AUDIO_DMA_BUFFER_PHYS+2*AUDIO_DMA_PAGE_SIZE);

					DEBUGMSG(1,(TEXT("2\n")));
				}
/*
				//----- 5. Schedule the next DMA transfer -----
				//AUDIO_IN_DMA_ENABLE();
				v_pDMAregs->rDMASKTRIG1 |= ENABLE_DMA_CHANNEL; \
				v_pDMAregs->rDMASKTRIG1 &= ~STOP_DMA_TRANSFER; \
				v_pIISregs->rIISFCON |= ( RECEIVE_FIFO_ACCESS_DMA  | RECEIVE_FIFO_ENABLE);	\
				v_pIISregs->rIISCON  |= RECEIVE_DMA_REQUEST_ENABLE;	
*/
				
				//----- 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((m_OutputDMARunning) && (dmaInterruptSource == DMA_CH_OUT))
//			if((dmaInterruptSource == DMA_CH_OUT))
			else
			{	
				//----- 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
					
					delay_count = 0;
				    while((v_pDMAregs->rDSTAT2&0xfffff)==0){
	        			if( delay_count++ > DELAY_COUNT )	break;
	        		} 

					//SELECT_AUDIO_DMA_OUTPUT_BUFFER_B();		// charlie. B => A
					v_pDMAregs->rDISRC2 = (int)(AUDIO_DMA_BUFFER_PHYS+AUDIO_DMA_PAGE_SIZE);

				}else
				{
					m_OutputDMAStatus &= ~DMA_STRTA;						// Buffer B just completed...
					m_OutputDMAStatus |= DMA_DONEA;

					m_OutputDMAStatus |= DMA_BIU;							// Buffer A is in use
					
					delay_count = 0;
					while((v_pDMAregs->rDSTAT2&0xfffff)==0){
	        			if( delay_count++ > DELAY_COUNT )	break;
	        		} 

					//SELECT_AUDIO_DMA_OUTPUT_BUFFER_A();		// charlie. B => A
					v_pDMAregs->rDISRC2 = (int)(AUDIO_DMA_BUFFER_PHYS);

				}


				//----- 8. Schedule the next DMA transfer -----
				//AUDIO_OUT_DMA_ENABLE();
				//v_pDMAregs->rDMASKTRIG2 &= ~STOP_DMA_TRANSFER;
				//v_pDMAregs->rDMASKTRIG2 |= ENABLE_DMA_CHANNEL;

				//----- 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;

	DEBUGMSG(1,(TEXT("Mute:%d\n"),bMute));	
	// 
	// Turn off/on mute bit in control register B.
	// 
	if( !m_InputDMARunning && !m_OutputDMARunning )		// 030711
	{
		if(bMute)
		{
			_WrL3Addr(0x14+0); //DATA0 (000101xx+00)
			_WrL3Data(0xa4,0); //mute
		}
		else
		{
			_WrL3Addr(0x14+0); //DATA0, 
			_WrL3Data(0xa0,0); //no mute
		}
	}		
	
	return TRUE;
}


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

DWORD 
HardwareContext::Open(
    void
    )
{
    DWORD mmErr = MMSYSERR_NOERROR;
    
    // Don't allow play when not on, if there is a power constraint upon us.
    if ( D0 != m_Dx )
    {
        // Tell the Power Manager we need to power up.
        // If there is a power constraint then fail.
        DWORD dwErr = DevicePowerNotify(_T("WAV1:"), D0, POWER_NAME);
        if ( ERROR_SUCCESS !=  dwErr ) {
            RETAILMSG(1, (TEXT("WAVEDEV::Open:DevicePowerNotify ERROR: %u\r\n"), dwErr ));
            mmErr = MMSYSERR_ERROR;
        }
    }
    
    return mmErr;
}


DWORD 
HardwareContext::Close(
    void
    )
{
    DWORD mmErr = MMSYSERR_NOERROR;
    DWORD dwErr;
    
    // we are done so inform Power Manager to power us down, 030711
//    dwErr = DevicePowerNotify(_T("WAV1:"), (_CEDEVICE_POWER_STATE)D4, POWER_NAME);
    if ( ERROR_SUCCESS !=  dwErr ) {
        RETAILMSG(1, (TEXT("WAVEDEV::Close:DevicePowerNofify ERROR: %u\r\n"), dwErr ));
		mmErr = MMSYSERR_ERROR;
    }
    
    return mmErr;
}


BOOL 
HardwareContext::IOControl( 
    DWORD  dwOpenData,
    DWORD  dwCode,
    PBYTE  pBufIn,
    DWORD  dwLenIn,
    PBYTE  pBufOut,
    DWORD  dwLenOut,
    PDWORD pdwActualOut)
{
    DWORD dwErr = ERROR_SUCCESS;    
    BOOL  bRc = TRUE;

    UNREFERENCED_PARAMETER(dwOpenData);
    
    switch (dwCode) {
        //
        // Power Management
        //
        case IOCTL_POWER_CAPABILITIES: 
        {
            PPOWER_CAPABILITIES ppc;
            
            if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(POWER_CAPABILITIES)) ) {
                bRc = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
                break;
            }
            
            ppc = (PPOWER_CAPABILITIES)pBufOut;
            
            memset(ppc, 0, sizeof(POWER_CAPABILITIES));

            // support D0, D4
            ppc->DeviceDx = 0x11;

            // no wake
            // no inrush

            // Report our nominal power consumption in uAmps rather than mWatts.
            ppc->Flags = POWER_CAP_PREFIX_MICRO | POWER_CAP_UNIT_AMPS;

            // REVIEW: Do we enable all these for normal playback?
            // D0: SPI + I2S + CODEC (Playback) + Headphone= 
            //     0.5 mA + 0.5 mA + (23 mW, into BUGBUG ohms ) + (30 mW, into 32 ohms)
            //     500 uA + 500 uA + 23000 uA + 32000 uA
            ppc->Power[D0] = 56000;
            
            *pdwActualOut = sizeof(POWER_CAPABILITIES);
        } break;

        case IOCTL_POWER_SET: 
        {
            CEDEVICE_POWER_STATE NewDx;
            
            if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) {
                bRc = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
                break;
            }
            
            NewDx = *(PCEDEVICE_POWER_STATE)pBufOut;

            if ( VALID_DX(NewDx) ) {
                // grab the CS since the normal Xxx_PowerXxx can not.
                Lock();
                switch ( NewDx ) {
                    case D0:
                        if (m_Dx != D0) {
                            PowerUp();
                            m_Dx = D0;
                        }
                        break;

                    default:
                        if (m_Dx != (_CEDEVICE_POWER_STATE)D4) {
                            PowerDown();
                            m_Dx = (_CEDEVICE_POWER_STATE)D4;
                        }
                        break;
                }
                
                // return our state
                *(PCEDEVICE_POWER_STATE)pBufOut = m_Dx;
				//RETAILMSG(1, (TEXT("WAVEDEV: IOCTL_POWER_SET: D%u => D%u \r\n"), NewDx, m_Dx));

                Unlock();
                
                *pdwActualOut = sizeof(CEDEVICE_POWER_STATE);
            } else {
                bRc = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
            }
            
        } break;

        case IOCTL_POWER_GET: 
            if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) {
                bRc = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
                break;
            }

            *(PCEDEVICE_POWER_STATE)pBufOut = m_Dx;

            RETAILMSG(1, (TEXT("WAVEDEV: IOCTL_POWER_GET: D%u \r\n"), m_Dx));

            *pdwActualOut = sizeof(CEDEVICE_POWER_STATE);
            break;
            
        default:
            bRc = FALSE;
            dwErr = ERROR_INVALID_FUNCTION;
            DEBUGMSG (ZONE_FUNCTION, (TEXT(" Unsupported ioctl 0x%X\r\n"), dwCode));
            break;            
    }
    
    if ( !bRc ) {
        SetLastError(dwErr);
    }
    
    return(bRc);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线中文字幕一区二区| 91网站最新地址| 中文字幕欧美三区| 91色.com| 日本在线不卡视频| 久久奇米777| 99久久综合国产精品| 国产精品久久久久三级| 欧美日韩精品免费| 成人免费视频app| 亚洲高清免费观看| 中国av一区二区三区| 欧美三区在线观看| 国产成人午夜电影网| 午夜精品免费在线| 中文字幕亚洲综合久久菠萝蜜| 欧美日韩一区二区三区在线| 精品在线观看视频| 一区二区三区四区不卡视频| 2024国产精品| 欧美日韩在线播放一区| 成熟亚洲日本毛茸茸凸凹| 日韩国产欧美在线视频| 亚洲毛片av在线| 久久品道一品道久久精品| 欧美日韩国产区一| 92精品国产成人观看免费| 国内精品自线一区二区三区视频| 国产精品白丝在线| 久久久不卡网国产精品一区| 51精品国自产在线| 91国模大尺度私拍在线视频| 懂色av一区二区夜夜嗨| 美女视频黄 久久| 亚洲妇女屁股眼交7| 1区2区3区国产精品| 久久久久久毛片| 欧美一级艳片视频免费观看| 97se亚洲国产综合自在线| 国产精品一区二区三区99| 日本欧美在线观看| 性做久久久久久免费观看欧美| 中文字幕欧美激情| 国产拍揄自揄精品视频麻豆| 欧美精品一区二区久久婷婷| 91精品国产色综合久久久蜜香臀| 欧美三级电影在线观看| a级高清视频欧美日韩| 国产91丝袜在线18| 国产99久久久精品| 成人在线综合网| 国产精品123| 粗大黑人巨茎大战欧美成人| 国产成人在线免费| 国产精品一区二区无线| 国产精品影视网| 国产成人综合网| 国产成人精品午夜视频免费| 国产福利视频一区二区三区| 国产最新精品精品你懂的| 性做久久久久久久免费看| 亚洲v日本v欧美v久久精品| 亚洲一区二区三区影院| 性感美女久久精品| 婷婷久久综合九色国产成人| 日日夜夜免费精品| 琪琪一区二区三区| 免费成人av在线播放| 蜜臀国产一区二区三区在线播放| 亚洲成va人在线观看| 三级欧美在线一区| 黄色日韩网站视频| 成年人网站91| 不卡在线观看av| 在线观看不卡视频| 欧美一区二区播放| www久久久久| 亚洲欧洲无码一区二区三区| 国产日产亚洲精品系列| 国产精品理论片| 一区二区激情小说| 日本不卡在线视频| 国产高清无密码一区二区三区| av色综合久久天堂av综合| 日本韩国欧美一区二区三区| 9191国产精品| 国产三级三级三级精品8ⅰ区| 国产精品国产三级国产普通话三级 | 99国产精品久久久久久久久久 | 欧美大片一区二区| 国产欧美日韩中文久久| 亚洲精品成人天堂一二三| 亚洲伊人色欲综合网| 久久99国产精品免费网站| 成人永久aaa| 欧美日韩免费不卡视频一区二区三区| 制服丝袜一区二区三区| 久久综合久色欧美综合狠狠| 亚洲欧美日韩国产综合在线| 蜜桃传媒麻豆第一区在线观看| 国产成人午夜高潮毛片| 欧美唯美清纯偷拍| 精品福利一区二区三区| 精品黑人一区二区三区久久| 中文字幕亚洲精品在线观看| 日韩不卡在线观看日韩不卡视频| 国产乱一区二区| 日本大香伊一区二区三区| 欧美电影免费观看高清完整版在 | 欧美国产日产图区| 亚洲www啪成人一区二区麻豆| 青青草91视频| 91视视频在线直接观看在线看网页在线看 | 性做久久久久久免费观看欧美| 国产精品66部| 欧美军同video69gay| 中文在线一区二区| 精品亚洲国产成人av制服丝袜 | 精品国产欧美一区二区| 一区二区三区日韩欧美精品| 国产一区视频在线看| 欧美日韩国产乱码电影| 国产精品进线69影院| 亚洲美女区一区| 免费高清视频精品| 91女厕偷拍女厕偷拍高清| 欧美一区二区三区日韩| 亚洲最新在线观看| 93久久精品日日躁夜夜躁欧美| 欧美成人一级视频| 日韩高清不卡一区二区三区| 91亚洲精品乱码久久久久久蜜桃| 2021中文字幕一区亚洲| 亚洲一二三区在线观看| 国产剧情在线观看一区二区| 欧美一区二区久久| 亚洲福利一二三区| 欧美日韩一二三区| 亚洲一区在线看| 91天堂素人约啪| 国产精品人人做人人爽人人添| 国产一区二区免费看| 久久九九久精品国产免费直播| 日韩和欧美一区二区三区| 色婷婷av一区二区三区大白胸 | 国产乱一区二区| 久久久久久久综合色一本| 精一区二区三区| 欧美tickle裸体挠脚心vk| 国产乱码字幕精品高清av| 精品剧情在线观看| 美女被吸乳得到大胸91| 日韩欧美精品在线| 日日夜夜免费精品视频| 欧美成人一区二区三区| 韩国精品主播一区二区在线观看| 久久综合色婷婷| 国产不卡在线一区| 一区二区三区中文字幕| 色噜噜久久综合| 亚洲综合在线视频| 欧美日韩午夜在线视频| 无码av免费一区二区三区试看| 欧美精品粉嫩高潮一区二区| 亚洲影视在线观看| 欧美日韩成人一区| 韩国女主播成人在线| 国产亚洲美州欧州综合国| 国产成人鲁色资源国产91色综 | 中文字幕久久午夜不卡| www.视频一区| 亚洲精品自拍动漫在线| 欧美色中文字幕| 日韩成人午夜电影| 久久免费视频色| 成人免费高清在线观看| 亚洲福利一区二区三区| 日韩三级精品电影久久久| 国内成+人亚洲+欧美+综合在线| 久久精品视频网| 欧美在线啊v一区| 美女视频免费一区| 国产精品视频线看| 在线精品视频一区二区| 国产伦精品一区二区三区免费迷| 国产亚洲欧美一区在线观看| 91美女在线看| 日韩成人一级片| 亚洲女厕所小便bbb| 91精品国产综合久久久久久漫画| 精品亚洲成a人在线观看| 中文字幕成人网| 欧美一个色资源| 99久久免费视频.com| 日产精品久久久久久久性色| 精品国产乱子伦一区| 欧美日韩三级视频| 粉嫩av一区二区三区粉嫩| 视频一区视频二区在线观看| 亚洲日穴在线视频|