📄 hwctxt.cpp.bak
字号:
//----- 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);
}
//----- 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();
}
}
/////////////////////////////////////////////////
/*void HardwareContext::HeadsetInterruptThread()
{
int HP_level_pro=0,HP_level_now=0;
v_pIOPregs->rGPFCON &= ~(0x3 << 2);//input
//v_pIOPregs->rGPFCON |= (0x2 << 2); //int1
v_pIOPregs->rGPFUP &=0xfd; //pull-up
while(TRUE)
{
Lock();
if((v_pIOPregs->rGPFDAT)&0x02)//HP
{
HP_level_pro=1;
gHP_flag=true;
//RETAILMSG(1,(TEXT("----------------HP!-----------------\r\n")));
}else
{
HP_level_pro=0;
gHP_flag=false; //no HP
//RETAILMSG(1,(TEXT(" -----------------no HP!--------------------\r\n")));
}
Unlock();
Sleep(3000); //2 second sample!!!
Lock();
if((v_pIOPregs->rGPFDAT)&0x02)//HP
{
HP_level_now=1;
gHP_flag=true;
//RETAILMSG(1,(TEXT("----------------HP!-----------------\r\n")));
}else
{
HP_level_now=0;
gHP_flag=false; //no HP
//RETAILMSG(1,(TEXT(" -----------------no HP!--------------------\r\n")));
}
if(HP_level_now-HP_level_pro)
gb_changed=true;
//MAX_AudioMuted(IIC_OUTPUT_CHANNEl,gHP_flag);
else
gb_changed=false;
Unlock();
//Sleep(2000);
//Delay(40000);
//RETAILMSG(1,(TEXT("---------****************----------\r\n")));
}
}*/
BOOL HardwareContext::AudioMute(AUDIO_CHANNLE channel, BOOL bMute)
{
//MAX_AudioMuted(channel,bMute);
return TRUE;
}
/*CreatThread function
*/
void CallInterruptThread(HardwareContext *pHWContext)
{
pHWContext->InterruptThread();
}
/*void MAX_CallHeadsetInterruptThread()
{
SoundControlInit();
//pHWContext->HeadsetInterruptThread();
}*/
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);
}
//void CallInterruptThreadIncreaseVolume(HardwareContext *pHWContext)
/*void CallInterruptThreadReduceVolume(HardwareContext *pHWContext)
{
while(1)
{
//RETAILMSG(1,(TEXT("----------ReduceVolume--------------- WaitForSingleObject!!! \r\n")));
WaitForSingleObject(m_hVolumeReduEvent, INFINITE);
v_pIOPregs->rGPFCON &= ~(0x3 << 14);
v_pIOPregs->rGPFUP&=0x00;
//Sleep(100);
if(!(v_pIOPregs->rGPFDAT&0x80 ))
{
CeEventHasOccurred (NOTIFICATION_EVENT_VOLUME_CHANGE,NULL);
SetEvent(m_hBKLightEvent);
//U8 data0,data1;
//pHWContext->Lock();
DWORD data0=MAX_RegesterRead();
if(data0<5)
data0++;
MAX_RegesterWrite(data0);
RETAILMSG(1,(TEXT("--------------reduce--------------------%d\r\n"),MAX_RegesterRead()));
}
Sleep(400);
v_pIOPregs->rGPFCON &= ~(0x3<<14); // eint 3 7
v_pIOPregs->rGPFCON |= (0x2<<14);
v_pIOPregs->rGPFUP&=0x0; //pull-up enable!
v_pIOPregs->rEXTINT0&=~(0x7<<28);
v_pIOPregs->rEXTINT0|=(0x2<<28);
InterruptDone(SYSINTR_REDVOLUME);
//pHWContext->Unlock();
//RETAILMSG(1,(TEXT("----------------------------------%d\r\n"),MAX_RegesterRead()));
}
}
//void CallInterruptThreadReduceVolume(HardwareContext *pHWContext)
void CallInterruptThreadIncreaseVolume(HardwareContext *pHWContext)
{
while(1)
{
//RETAILMSG(1,(TEXT("----------IncreaseVolume--------------- WaitForSingleObject!!! \r\n")));
WaitForSingleObject(m_hVolumeIncrEvent, INFINITE);
v_pIOPregs->rGPFCON &= ~(0x3 << 6);
v_pIOPregs->rGPFUP&=0x00;
//Sleep(100);
if(!(v_pIOPregs->rGPFDAT&0x08 ))
{
CeEventHasOccurred (NOTIFICATION_EVENT_VOLUME_CHANGE,NULL);
SetEvent(m_hBKLightEvent);
//pHWContext->Lock();
//U8 data0,data1;
DWORD data1=MAX_RegesterRead();
if(data1<6&& data1>0 )
data1--;
MAX_RegesterWrite(data1);
RETAILMSG(1,(TEXT("--------------Increase--------------------%d\r\n"),MAX_RegesterRead()));
}
Sleep(400);
v_pIOPregs->rGPFCON &= ~(0x3<<6); // eint 3 7
v_pIOPregs->rGPFCON |= (0x2<<6);
v_pIOPregs->rGPFUP&=0x0; //pull-up enable!
v_pIOPregs->rEXTINT0&=~(0x7<<12);
v_pIOPregs->rEXTINT0|=(0x2<<12);
InterruptDone(SYSINTR_INCVOLUME);
//pHWContext->Unlock();
//RETAILMSG(1,(TEXT("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")));
}
}
void CallBKLight()
{
while(1)
{
WaitForSingleObject(m_hBKLightEvent, INFINITE);
//v_pIOPregs->rGPGCON&=~(0x3<<22); //GPG11
//v_pIOPregs->rGPGCON|=(0x1<<22); //output!
//v_pIOPregs->rGPGUP&=~(0x1<<22); //pull-up enable!
v_pIOPregs->rGPGDAT&=~(0x1<<11); //output 0
Sleep(8000);
v_pIOPregs->rGPGDAT|=(0x1<<11); //disable keybutyton light!
RETAILMSG(1,(TEXT("------------BKLight----------------\r\n")));
ResetEvent(m_hBKLightEvent); //nosignal stat!
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -