diff options
-rw-r--r-- | ffnetdev.c | 23 | ||||
-rw-r--r-- | osdworker.c | 93 | ||||
-rw-r--r-- | osdworker.h | 1 | ||||
-rw-r--r-- | remote.c | 20 | ||||
-rw-r--r-- | vncEncoder.c | 2 |
5 files changed, 82 insertions, 57 deletions
@@ -68,6 +68,8 @@ cPluginFFNetDev::~cPluginFFNetDev() { cOSDWorker::Exit(); cTSWorker::Exit(); + + delete m_Remote; } const char *cPluginFFNetDev::CommandLineHelp(void) @@ -180,7 +182,11 @@ bool cPluginFFNetDev::SetupParse(const char *Name, const char *Value) } void cPluginFFNetDev::SetPrimaryDevice() -{ +{ + int i = 0; + while ((cOsd::IsOpen() > 0) && (i-- > 0)) + cRemote::Put(kBack); + if ((config.iAutoSetPrimaryDVB == 1) && (m_origPrimaryDevice == -1)) { cDevice *PrimaryDevice; @@ -202,8 +208,11 @@ void cPluginFFNetDev::SetPrimaryDevice() if(EnableRemote) { - m_Remote = new cMyRemote("ffnetdev"); - new cLearningThread(); + if (m_Remote == NULL) + m_Remote = new cMyRemote("ffnetdev"); + + if (!cRemote::HasKeys()) + new cLearningThread(); #ifdef DEBUG fprintf(stderr, "[ffnetdev] remote control enabled.\n"); #endif @@ -215,20 +224,20 @@ void cPluginFFNetDev::SetPrimaryDevice() fprintf(stderr, "[ffnetdev] remote control disabled.\n"); #endif isyslog("[ffnetdev] remote control disabled.\n"); - delete m_Remote; - m_Remote = NULL; } } void cPluginFFNetDev::RestorePrimaryDevice() { + int i = 10; + while ((cOsd::IsOpen() > 0) && (i-- > 0)) + cRemote::Put(kBack); + #ifdef DEBUG fprintf(stderr, "[ffnetdev] remote control disabled.\n"); #endif isyslog("[ffnetdev] remote control disabled.\n"); - delete m_Remote; - m_Remote = NULL; if (m_origPrimaryDevice != -1) { diff --git a/osdworker.c b/osdworker.c index 8147ddb..f8f67cd 100644 --- a/osdworker.c +++ b/osdworker.c @@ -31,7 +31,6 @@ cOSDWorker::cOSDWorker(void) m_pSendBuffer = NULL; m_SendBufferSize = 0; state = NO_CLIENT; - close_OSDclient_request = false; UseAlpha = false; @@ -50,7 +49,7 @@ cOSDWorker::cOSDWorker(void) memset(&m_OSDBuffer, 0, sizeof(m_OSDBuffer)); - numOSDColors = 0; + numOSDColors = 1; memset(&OSDColors, 0, sizeof(OSDColors)); m_notupdatedLeft = -1; @@ -59,6 +58,9 @@ cOSDWorker::cOSDWorker(void) m_notupdatedBottom = -1; memset(&m_lasttime, 0, sizeof(m_lasttime)); memset(&m_lastupdate, 0, sizeof(m_lastupdate)); + + memset(&ClientFormat, 0, sizeof(ClientFormat)); + ClientFormat.trueColour = 1; } cOSDWorker::~cOSDWorker() { @@ -106,10 +108,29 @@ void cOSDWorker::CloseOSDClient(void) { if (m_Instance == NULL) return; - m_Instance->close_OSDclient_request = true; + m_Instance->state = NO_CLIENT; + m_Instance->UseAlpha = false; + + delete m_Instance->m_pEncoder; + m_Instance->m_pEncoder = NULL; + + m_Instance->m_pPlugin->RestorePrimaryDevice(); + + if (m_Instance->m_OSDClient != NULL) { + if ( m_Instance->m_OSDClient->Close() ) { +#ifdef DEBUG + fprintf(stderr, "[ffnetdev] VNC: Client socket closed successfully.\n"); +#endif + isyslog("[ffnetdev] VNC: Connection closed."); + } + else { #ifdef DEBUG - fprintf(stderr, "[ffnetdev] VNC: Closing of OSD client socket requested.\r\n"); + fprintf(stderr, "[ffnetdev] VNC: Error closing client socket.\n"); #endif + esyslog("[ffnetdev] VNC: Error closing connection."); + m_Instance->m_Active=false; + } + } } bool cOSDWorker::SendPlayMode(ePlayMode PlayMode) { @@ -140,15 +161,16 @@ bool cOSDWorker::ClearScreen(void) // this should be improved; // 1) maybe we should send a our very "special" pseudo encoding[CLEAR_SCREEN] to our "special" VNC client to get an empty screen really fast + + m_Instance->numOSDColors = 1; + memset(&m_Instance->OSDColors, 0, sizeof(m_Instance->OSDColors)); + SendCMAP(m_Instance->numOSDColors, m_Instance->OSDColors); + bool bRetVal = false; memset(&(m_Instance->m_OSDBuffer), 0, 720*576); memset(&(m_Instance->m_lasttime), 0, sizeof(m_Instance->m_lasttime)); bRetVal = SendScreen(720,0,0,720,576,&(m_Instance->m_OSDBuffer)); - rfbBellMsg fu; - fu.type=rfbBell; - OSDWrite((unsigned char*)&fu, sz_rfbBellMsg); - return bRetVal; } @@ -217,6 +239,13 @@ bool cOSDWorker::SendScreen(unsigned int stride, unsigned int x1, unsigned int y #endif dsyslog("[ffnetdev] VNC: Send OSD Data %d Bytes\n", BufferSize); OSDWrite((unsigned char*)m_Instance->m_pSendBuffer, BufferSize); + + if ((m_Instance->numOSDColors == 0) || ((m_Instance->numOSDColors == 1) && (m_Instance->OSDColors[0] == 0))) + { + rfbBellMsg fu; + fu.type=rfbBell; + OSDWrite((unsigned char*)&fu, sz_rfbBellMsg); + } return true; } @@ -240,6 +269,7 @@ bool cOSDWorker::SendCMAP(int NumColors, const tColor *Colors) int i; if ((m_Instance->state==HANDSHAKE_OK) && !(m_Instance->ClientFormat.trueColour)) { + dsyslog("[ffnetdev] VNC: SendColourMapEntries"); scme.type=rfbSetColourMapEntries; scme.firstColour = Swap16IfLE(0); scme.nColours = Swap16IfLE((CARD16)NumColors); @@ -311,6 +341,7 @@ bool cOSDWorker::RFBRead(char *buffer, int len) return false; if ( m_OSDClient->Read(buffer, len)==0 ) { + /* #ifdef DEBUG fprintf(stderr, "[ffnetdev] VNC: Client closed connection.\n"); #endif @@ -320,7 +351,9 @@ bool cOSDWorker::RFBRead(char *buffer, int len) m_Instance->m_OSDClient->Close(); delete m_pEncoder; m_pEncoder = NULL; - + */ + CloseOSDClient(); + return false; } else @@ -478,18 +511,19 @@ void cOSDWorker::HandleClientRequests(cTBSelect *select) Swap16IfLE(msg.fur.w), Swap16IfLE(msg.fur.h) ); - if (FirstUpdateRequest) { - ClearScreen(); - FirstUpdateRequest = false; - } - else + + if (numOSDColors > 0) { SendCMAP(numOSDColors, OSDColors); SendScreen(720, //stride Swap16IfLE(msg.fur.x), Swap16IfLE(msg.fur.y), - Swap16IfLE(msg.fur.w), Swap16IfLE(msg.fur.h), + Swap16IfLE(msg.fur.w), Swap16IfLE(msg.fur.h), &m_OSDBuffer); } + else + { + ClearScreen(); + } break; case rfbKeyEvent: if (!RFBRead( ((char*)&msg.ke)+1, sz_rfbKeyEventMsg-1)) return; @@ -595,7 +629,7 @@ void cOSDWorker::Action(void) { } else { -// m_pPlugin->SetPrimaryDevice(); + m_pPlugin->SetPrimaryDevice(); } break; @@ -696,37 +730,10 @@ void cOSDWorker::Action(void) { } state = HANDSHAKE_OK; - FirstUpdateRequest = true; break; case HANDSHAKE_OK: - /* Check for closed OSD connection */ - if (close_OSDclient_request==true) { - close_OSDclient_request = false; - state = NO_CLIENT; - UseAlpha = false; - - delete m_pEncoder; - m_pEncoder = NULL; - - m_pPlugin->RestorePrimaryDevice(); - - if ( m_OSDClient->Close() ) { -#ifdef DEBUG - fprintf(stderr, "[ffnetdev] VNC: Client socket closed successfully.\n"); -#endif - isyslog("[ffnetdev] VNC: Connection closed."); - } - else { -#ifdef DEBUG - fprintf(stderr, "[ffnetdev] VNC: Error closing client socket.\n"); -#endif - esyslog("[ffnetdev] VNC: Error closing connection."); - m_Active=false; - continue; - } - } HandleClientRequests(&select); break; diff --git a/osdworker.h b/osdworker.h index 296c8b3..10c0c3c 100644 --- a/osdworker.h +++ b/osdworker.h @@ -63,7 +63,6 @@ private: int OSDPort; int state; bool UseAlpha; - bool FirstUpdateRequest; int numOSDColors; rfbPixelFormat ClientFormat; rfbPixelFormat ServerFormat; @@ -45,14 +45,24 @@ cLearningThread::~cLearningThread(void) void cLearningThread::Action(void) { - while (!cOSDWorker::ClientIsReady()) - usleep(100000); + int i = 10; + while ((!cOSDWorker::ClientIsReady()) && (i-- > 0)) + sleep(1); - while (cOsd::IsOpen() > 0) - usleep(100000); + i = 10; + while ((cOsd::IsOpen() > 0) && (i-- > 0)) + cRemote::Put(kBack); + + if (!cOSDWorker::ClientIsReady() || (cOsd::IsOpen() > 0)) + { + dsyslog("[ffnetdev] ClientIsReady=%d OsdIsOpen=%d SkinsIsOpen=%d", + cOSDWorker::ClientIsReady(), cOsd::IsOpen(), Skins.IsOpen()); + delete this; + return; + } - sleep(5); dsyslog("[ffnetdev] start learning keys"); Interface->LearnKeys(); + delete this; } diff --git a/vncEncoder.c b/vncEncoder.c index 04827ae..1ade07d 100644 --- a/vncEncoder.c +++ b/vncEncoder.c @@ -36,7 +36,7 @@ // Pixel format used internally when the client is palette-based & server is truecolour static const rfbPixelFormat BGR233Format = { - 8, 8, 0, 1, 7, 7, 3, 0, 3, 6 + 8, 8, 0, 1, 7, 7, 3, 0, 3, 6, 0, 0 }; // The base (RAW) encoder class |