STDMETHODIMP CAtmoRemoteControlImplEx::getEffect(enum ComEffectMode *dwEffect) { m_pAtmoDynData->LockCriticalSection(); CAtmoConfig *atmoConfig = this->m_pAtmoDynData->getAtmoConfig(); if(atmoConfig!=NULL) *dwEffect = ConvertEffectAtmo2Com(atmoConfig->getEffectMode()); m_pAtmoDynData->UnLockCriticalSection(); if(atmoConfig == NULL) return S_FALSE; else return S_OK; }
EffectMode CAtmoTools::SwitchEffect(CAtmoDynData *pDynData, EffectMode newEffectMode) { // may need a critical section?? if(pDynData == NULL) { return emUndefined; } pDynData->LockCriticalSection(); CAtmoConfig *atmoConfig = pDynData->getAtmoConfig(); if(atmoConfig == NULL) { pDynData->UnLockCriticalSection(); return emUndefined; } CAtmoConnection *atmoConnection = pDynData->getAtmoConnection(); EffectMode oldEffectMode = atmoConfig->getEffectMode(); CThread *currentEffect = pDynData->getEffectThread(); CAtmoInput *currentInput = pDynData->getLiveInput(); CAtmoPacketQueue *currentPacketQueue = pDynData->getLivePacketQueue(); if(oldEffectMode == emLivePicture) { /* in case of disabling the live mode first we have to stop the input then the effect thread! */ if(currentInput != NULL) { pDynData->setLiveInput( NULL ); currentInput->Close(); delete currentInput; currentInput = NULL; } } // stop and delete/cleanup current Effect Thread... pDynData->setEffectThread( NULL ); if(currentEffect != NULL) { currentEffect->Terminate(); delete currentEffect; currentEffect = NULL; } if(oldEffectMode == emLivePicture) { /* and last we kill the PacketQueue used for communication between the threads */ pDynData->setLivePacketQueue( NULL ); delete currentPacketQueue; currentPacketQueue = NULL; } if((atmoConnection!=NULL) && (atmoConnection->isOpen()==ATMO_TRUE)) { // neuen EffectThread nur mit aktiver Connection starten... switch(newEffectMode) { case emUndefined: // do nothing also in that case (avoid compiler warning) break; case emDisabled: { // get values from config - and put them to all channels? pColorPacket packet; AllocColorPacket(packet, atmoConfig->getZoneCount()); for(int i=0; i < packet->numColors; i++) { packet->zone[i].r = 0; packet->zone[i].g = 0; packet->zone[i].b = 0; } atmoConnection->SendData( packet ); atmoConnection->SendData( packet ); delete (char *)packet; break; } case emStaticColor: { // get values from config - and put them to all channels? pColorPacket packet; AllocColorPacket(packet, atmoConfig->getZoneCount()); for(int i=0; i < packet->numColors; i++){ packet->zone[i].r = atmoConfig->getStaticColor_Red(); packet->zone[i].g = atmoConfig->getStaticColor_Green(); packet->zone[i].b = atmoConfig->getStaticColor_Blue(); } packet = CAtmoTools::ApplyGamma( atmoConfig, packet ); if(atmoConfig->isUseSoftwareWhiteAdj()) packet = CAtmoTools::WhiteCalibration(atmoConfig, packet); atmoConnection->SendData( packet ); atmoConnection->SendData( packet ); delete (char *)packet; break; } case emLivePicture: { currentEffect = new CAtmoLiveView(pDynData); #if !defined(_ATMO_VLC_PLUGIN_) CAtmoPacketQueueStatus *packetMon = NULL; if(atmoConfig->getShow_statistics()) { packetMon = new CAtmoPacketQueueStatus(pDynData->getAppHinstance(), (HWND)NULL); packetMon->createWindow(); packetMon->showWindow(SW_SHOW); } currentPacketQueue = new CAtmoPacketQueue(packetMon); pDynData->setLivePictureSource(lpsScreenCapture); //Atmo liveview option GDi <Win7 / DekstopDuplication >Win8 int AtmoSetup_Mode = atmoConfig->getLiveView_Mode(); if (AtmoSetup_Mode == 1) { currentInput = new CAtmoDesktopDuplicationCaptureInput( pDynData ); } else { currentInput = new CAtmoGdiDisplayCaptureInput( pDynData ); } #else currentPacketQueue = new CAtmoPacketQueue(); pDynData->setLivePictureSource(lpsExtern); currentInput = new CAtmoExternalCaptureInput( pDynData ); #endif break; } #if !defined(_ATMO_VLC_PLUGIN_) case emColorChange: currentEffect = new CAtmoColorChanger(atmoConnection, atmoConfig); break; case emLrColorChange: currentEffect = new CAtmoLeftRightColorChanger(atmoConnection, atmoConfig); break; #endif } } atmoConfig->setEffectMode( newEffectMode ); pDynData->setLivePacketQueue( currentPacketQueue ); pDynData->setEffectThread( currentEffect ); pDynData->setLiveInput( currentInput ); if(currentEffect != NULL) currentEffect->Run(); if(currentInput != NULL) currentInput->Open(); pDynData->UnLockCriticalSection(); return oldEffectMode; }
ATMO_BOOL CAtmoLiveSettings::ExecuteCommand(HWND hControl,int wmId, int wmEvent) { switch(wmId) { case IDOK: { CAtmoConfig *pAtmoConfig = this->m_pDynData->getAtmoConfig(); if(UpdateLiveViewValues(ATMO_FALSE) == ATMO_FALSE) return 0; EndDialog(this->m_hDialog, wmId); break; } case IDCANCEL: { // m_pBackupConfig --> wieder herstellen... CAtmoConfig *pAtmoConfig = this->m_pDynData->getAtmoConfig(); pAtmoConfig->Assign(this->m_pBackupConfig); EndDialog(this->m_hDialog, wmId); break; } case IDC_WIDESCREEN: { CAtmoConfig *pAtmoConfig = this->m_pDynData->getAtmoConfig(); if(Button_GetCheck(hControl) == BST_CHECKED) pAtmoConfig->setLiveView_WidescreenMode(1); else pAtmoConfig->setLiveView_WidescreenMode(0); break; } case IDC_FILTERMODE: { /// CBN_SELCHANGE if(wmEvent == CBN_SELCHANGE) { CAtmoConfig *pAtmoConfig = this->m_pDynData->getAtmoConfig(); int i = ComboBox_GetCurSel(hControl); pAtmoConfig->setLiveViewFilterMode((AtmoFilterMode)i); } break; } case IDC_DISPLAYS: { if(wmEvent == CBN_SELCHANGE) { CAtmoConfig *pAtmoConfig = this->m_pDynData->getAtmoConfig(); int i = ComboBox_GetCurSel(hControl); if(i != pAtmoConfig->getLiveView_DisplayNr()) { UpdateLiveViewValues( pAtmoConfig->getEffectMode() == emLivePicture ); } } break; } case IDC_GDI_CAPURE_RATE: { if(wmEvent == EN_CHANGE) { char buffer[20]; if(Edit_GetText(hControl,buffer,sizeof(buffer))>0) { int value = atoi(buffer); if((value>=1) && (value<=50)) { CAtmoConfig *pAtmoConfig = this->m_pDynData->getAtmoConfig(); pAtmoConfig->setLiveView_GDI_FrameRate(value); } else { MessageBeep(MB_ICONEXCLAMATION); } } } break; } default: return ATMO_FALSE; } return ATMO_TRUE; }