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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? hwctxt.cpp

?? wince 下的bsp測(cè)試wince_bspSMDK2440_L35T32.rar
?? CPP
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
    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);
#if 0 //DMA_FLAG        
		BytesTransferred += TransferInputBuffer(IN_BUFFER_B);
		break;
#endif		
        // 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);
		AC97MSG(1,(TEXT("0x%x\n"),s2440INT->rINTMSK));
		AC97MSG(1,(TEXT("start\n")));
		dmaInterruptSource = 0;
		//----- 1. Grab the lock -----
		Lock();

		__try
		{
			AC97MSG(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
//			s2440INT->rSRCPND
			if( s2440INT->rINTMSK & BIT_DMA1 ){
				dmaInterruptSource |= DMA_CH_OUT;								// Output DMA is supported...
			}
			
			if( s2440INT->rINTMSK & BIT_DMA2 ){
				dmaInterruptSource |= DMA_CH_MIC;								// Input 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
#if DMA_FLAG					
					SELECT_AUDIO_DMA_INPUT_BUFFER_B();
#else					
					SELECT_AUDIO_DMA_INPUT_BUFFER_A();
#endif
					AC97MSG(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
#if DMA_FLAG
					SELECT_AUDIO_DMA_INPUT_BUFFER_A();
#else										
					SELECT_AUDIO_DMA_INPUT_BUFFER_B();
#endif				
					AC97MSG(1,(TEXT("2\n")));
				}
#if !DMA_FLAG		
				//----- 5. Schedule the next DMA transfer -----
				AUDIO_IN_DMA_ENABLE();
#endif				
				
				//----- 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)
				{
					//RETAILMSG(DMA_CHK,(_T("BB\r\n")));
					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->rDSTAT1&0xfffff)==0){
			        	RETAILMSG(1,(_T("3")));
#if WAIT_DMA_END
						Sleep(1);
#else
        				if( delay_count++ > DELAY_COUNT )	break;
#endif
	        		} 

#if DMA_FLAG		
					SELECT_AUDIO_DMA_OUTPUT_BUFFER_B();		// charlie. B => A
#else				
					SELECT_AUDIO_DMA_OUTPUT_BUFFER_A();		// charlie. B => A	
#endif					
				}else
				{
					//RETAILMSG(DMA_CHK,(_T("AA\r\n")));
					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->rDSTAT1&0xfffff)==0)
					{
			        	RETAILMSG(1,(_T("4")));
#if WAIT_DMA_END
						Sleep(1);
#else
        				if( delay_count++ > DELAY_COUNT )	break;
#endif
					}
				
				
#if DMA_FLAG					
					SELECT_AUDIO_DMA_OUTPUT_BUFFER_A();		// charlie. B => A
#else				
					SELECT_AUDIO_DMA_OUTPUT_BUFFER_B();		// charlie. B => A	
#endif					
				}
#if !DMA_FLAG		
				//----- 8. Schedule the next DMA transfer -----
				AUDIO_OUT_DMA_ENABLE();
#endif
				//----- 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;
	USHORT volume;

	// 
	// Turn off/on mute bit in volume control register.
	// 
	if( (channel & DMA_CH_OUT ) && !m_OutputDMARunning )		// 030711
	{
		if(bMute)
		{
			volume = ReadCodecRegister(AC97_HEADPHONE_VOL);
     		WriteCodecRegister(AC97_HEADPHONE_VOL, volume | 0x8000);
		}
		else
		{
			volume = ReadCodecRegister(AC97_HEADPHONE_VOL);
     		WriteCodecRegister(AC97_HEADPHONE_VOL, volume & ~0x8000);
		}
	}		

	if( (channel & DMA_CH_MIC ) && !m_InputDMARunning )
	{
		if(bMute)
		{
			volume = ReadCodecRegister(AC97_MIC_VOL);
     		WriteCodecRegister(AC97_MIC_VOL, volume | 0x8000);
		}
		else
		{
			volume = ReadCodecRegister(AC97_MIC_VOL);
     		WriteCodecRegister(AC97_MIC_VOL, volume & ~0x8000);
		}
	}		
	
	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("AC97::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("AC97::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;
            RETAILMSG(1,(_T("IOCTL_POWER_CAPABILITIES++\r\n")));
            
            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);
            
            RETAILMSG(1,(_T("IOCTL_POWER_CAPABILITIES--\r\n")));
        } break;

        case IOCTL_POWER_SET: 

        	bRc = TRUE;
			break;

/*       	
        {
            CEDEVICE_POWER_STATE NewDx;

            RETAILMSG(1,(_T("IOCTL_POWER_SET++\r\n")));
            
            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("AC97AUDIO: 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;
            }

            RETAILMSG(1,(_T("IOCTL_POWER_SET--\r\n")));
            
        } break;
*/
        case IOCTL_POWER_GET: 

            RETAILMSG(1,(_T("IOCTL_POWER_GET++\r\n")));

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

            *(PCEDEVICE_POWER_STATE)pBufOut = m_Dx;

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

            *pdwActualOut = sizeof(CEDEVICE_POWER_STATE);

            RETAILMSG(1,(_T("IOCTL_POWER_GET++\r\n")));
            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);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产不卡一区二区三区| 夜夜嗨av一区二区三区中文字幕 | 一区二区中文字幕在线| 26uuu亚洲综合色欧美| 日韩欧美激情在线| 久久久久九九视频| 亚洲免费av高清| 日韩经典一区二区| 国产精品综合一区二区三区| 成人免费看片app下载| 91在线精品一区二区三区| 欧美日韩视频不卡| 欧美精品一区二区三区蜜桃| 亚洲品质自拍视频网站| 丝袜诱惑亚洲看片| 成人性生交大片免费看中文 | 亚洲电影在线播放| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产v日产∨综合v精品视频| www.亚洲国产| 欧美视频日韩视频在线观看| 久久亚洲一区二区三区明星换脸 | 香港成人在线视频| 国产一区二区三区四区五区入口 | 亚洲欧美影音先锋| 美女视频第一区二区三区免费观看网站| 国产一区视频网站| 欧美二区三区的天堂| 日韩伦理av电影| 国产成人免费在线| 日韩一级二级三级精品视频| 亚洲国产一区二区三区青草影视| 国产成人av电影在线| 日韩欧美电影一区| 日韩国产在线一| 欧美亚洲综合在线| 国产精品免费免费| 欧美bbbbb| 正在播放亚洲一区| 亚洲地区一二三色| 欧美日韩成人在线| 亚洲va韩国va欧美va| 色老头久久综合| 一区二区三区四区乱视频| 成人毛片老司机大片| 国产精品视频免费| 成人性生交大片| 中文字幕一区三区| 91网址在线看| 亚洲欧美福利一区二区| 91猫先生在线| 一区二区三区国产豹纹内裤在线| 色综合激情久久| 亚洲国产综合人成综合网站| 欧美日韩激情一区| 视频一区中文字幕| 精品噜噜噜噜久久久久久久久试看| 免费在线观看一区| 国产午夜精品福利| 国产一区二区三区久久久| 日本一区二区三区四区| 99视频一区二区| 亚洲妇女屁股眼交7| 日韩欧美国产三级| 成人精品免费看| 中文字幕一区二区三区不卡 | 日韩成人免费在线| 日本一区二区综合亚洲| 亚洲成人激情av| 精品成人一区二区| 色综合天天综合网国产成人综合天| 亚洲成人在线免费| 久久久久久日产精品| 色综合色综合色综合| 亚洲美女区一区| 精品国产乱码久久久久久1区2区| 99久久99久久综合| 久久99精品久久只有精品| 亚洲男女毛片无遮挡| 欧美色图第一页| 国产精品亚洲第一区在线暖暖韩国 | 成人欧美一区二区三区| 欧美精品乱码久久久久久按摩| 国产乱码精品一区二区三| 亚洲第一在线综合网站| 久久在线免费观看| 91精品麻豆日日躁夜夜躁| 99re在线视频这里只有精品| 免费高清成人在线| 亚洲另类在线制服丝袜| 欧美成人激情免费网| 欧美日本在线一区| 欧美最新大片在线看| 色综合色狠狠天天综合色| 国产黄色91视频| 国产精品88888| 激情五月播播久久久精品| 日本伊人色综合网| 日产欧产美韩系列久久99| 首页综合国产亚洲丝袜| 日本va欧美va精品| 乱一区二区av| 亚洲一本大道在线| 性做久久久久久免费观看 | 99视频一区二区三区| 成人av在线资源网站| 91色婷婷久久久久合中文| 日本韩国精品在线| 欧美三级三级三级| 91精品蜜臀在线一区尤物| 欧美一区二区三区爱爱| 日韩午夜激情av| 欧美一区永久视频免费观看| 欧美高清性hdvideosex| 在线视频你懂得一区二区三区| 在线视频一区二区三区| 欧美亚洲一区二区在线| 3d成人h动漫网站入口| 8v天堂国产在线一区二区| 日韩欧美国产wwwww| 精品久久久久久久久久久院品网| 精品久久国产字幕高潮| 久久久欧美精品sm网站| 欧美国产精品专区| 亚洲国产乱码最新视频| 亚洲成人三级小说| 婷婷六月综合网| 麻豆国产精品一区二区三区| 三级久久三级久久| 成人精品国产一区二区4080| 色国产综合视频| 欧美群妇大交群中文字幕| 精品久久人人做人人爱| 亚洲欧洲成人自拍| 日韩高清在线电影| 懂色av一区二区三区免费观看 | 久久九九全国免费| 亚洲精品一卡二卡| 久久99精品久久久久久国产越南| jiyouzz国产精品久久| 欧美久久免费观看| 国产精品福利一区| 蜜桃视频在线观看一区| 欧美综合一区二区| 中文欧美字幕免费| 日韩精品每日更新| 95精品视频在线| 久久久久久久综合日本| 天堂va蜜桃一区二区三区| 99久久久无码国产精品| 欧美一级日韩免费不卡| 中文一区在线播放| 国产美女精品在线| 日韩视频一区二区三区在线播放| 久久久青草青青国产亚洲免观| 五月婷婷久久丁香| 99re免费视频精品全部| 久久久久久久免费视频了| 国内成人免费视频| 精品乱人伦小说| 精品系列免费在线观看| 日韩精品资源二区在线| 青青国产91久久久久久| 91精品国产综合久久精品app | 成人免费毛片app| 最新不卡av在线| 一本大道av伊人久久综合| 国产精品三级久久久久三级| 国产老女人精品毛片久久| 国产拍欧美日韩视频二区| 国产麻豆午夜三级精品| 欧美大黄免费观看| 国产成人久久精品77777最新版本| 2020国产精品| 国产精品69久久久久水密桃 | 国产精品伦理一区二区| 亚洲高清中文字幕| 欧美xxxxx牲另类人与| 久久国产综合精品| 亚洲国产高清在线| 欧美日韩精品专区| 狠狠色丁香婷婷综合| 国产三级精品在线| 色哟哟精品一区| 日韩黄色在线观看| 久久久亚洲高清| 911精品产国品一二三产区| 韩日av一区二区| 亚洲免费视频中文字幕| 欧美精品123区| 在线精品国精品国产尤物884a| 日韩高清不卡一区| 亚洲欧洲一区二区在线播放| 91麻豆精品国产91久久久久久| 成人午夜视频网站| 天天色综合天天| 中文字幕第一区| 欧美日韩亚州综合| 99久久精品国产导航| 免费xxxx性欧美18vr|