summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ffnetdev.c23
-rw-r--r--osdworker.c93
-rw-r--r--osdworker.h1
-rw-r--r--remote.c20
-rw-r--r--vncEncoder.c2
5 files changed, 82 insertions, 57 deletions
diff --git a/ffnetdev.c b/ffnetdev.c
index a10bc14..558daea 100644
--- a/ffnetdev.c
+++ b/ffnetdev.c
@@ -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;
diff --git a/remote.c b/remote.c
index e1f392d..f5ed0e8 100644
--- a/remote.c
+++ b/remote.c
@@ -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