summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorphintuka <phintuka>2006-08-07 21:09:16 +0000
committerphintuka <phintuka>2006-08-07 21:09:16 +0000
commit957b76ac2122a217e2f0ec90df0e4104bf991a79 (patch)
tree6891420920217536e6f756ba99bc376bbf45d381
parent648a769cd711010e4954a0695613e1717c99aebc (diff)
downloadxineliboutput-957b76ac2122a217e2f0ec90df0e4104bf991a79.tar.gz
xineliboutput-957b76ac2122a217e2f0ec90df0e4104bf991a79.tar.bz2
Added detaching osd from device as osd's cant be just deleted ...
(might be useful with primary device switching)
-rw-r--r--osd.c91
-rw-r--r--osd.h21
2 files changed, 60 insertions, 52 deletions
diff --git a/osd.c b/osd.c
index 379fbf84..09c05b52 100644
--- a/osd.c
+++ b/osd.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: osd.c,v 1.3 2006-07-06 02:57:59 phintuka Exp $
+ * $Id: osd.c,v 1.4 2006-08-07 21:09:16 phintuka Exp $
*
*/
@@ -19,9 +19,8 @@
#include "xine_osd_command.h"
-//extern "C" {
-//#include "xine_frontend.h"
-//} // extern "C"
+cList<cXinelibOsd> cXinelibOsd::m_OsdStack;
+cMutex cXinelibOsd::m_Lock;
static inline void CmdSize(cXinelibDevice *Device, int wnd, int w=0, int h=0)
{
@@ -153,6 +152,7 @@ cXinelibOsd::cXinelibOsd(cXinelibDevice *Device, int x, int y)
: cOsd(x, y), m_IsVisible(true)
{
TRACEF("cXinelibOsd::cXinelibOsd");
+
m_Device = Device;
m_Shown = false;
CmdSize(m_Device, 0, 720, 576);
@@ -162,12 +162,15 @@ cXinelibOsd::~cXinelibOsd()
{
TRACEF("cXinelibOsd::~cXinelibOsd");
- cXinelibOsdProvider::OsdClosing(this);
- m_Lock.Lock();
+ cMutexLock ml(&m_Lock);
+
if(m_IsVisible)
Hide();
- m_Lock.Unlock();
- cXinelibOsdProvider::OsdClosed(this);
+
+ m_OsdStack.Del(this,false);
+
+ if(m_OsdStack.First())
+ m_OsdStack.First()->Show();
}
eOsdError cXinelibOsd::SetAreas(const tArea *Areas, int NumAreas)
@@ -236,9 +239,9 @@ void cXinelibOsd::Flush(void)
if(now - last_refresh < 100) {
/* too fast refresh rate, delay ... */
cCondWait::SleepMs(40); /* Can't update faster anyway ... */
-#if 0
+# if 0
LOGDBG("cXinelibOsd::Flush: OSD refreshing too fast ! (>10Hz) -> Sleeping 50ms");
-#endif
+# endif
}
last_refresh = now;
}
@@ -290,64 +293,72 @@ void cXinelibOsd::Hide(void)
}
}
+void cXinelibOsd::Detach(void)
+{
+ TRACEF("cXinelibOsd::Detach");
+
+ cMutexLock ml(&m_Lock);
-cList<cXinelibOsd> cXinelibOsdProvider::m_OsdStack;
-cMutex cXinelibOsdProvider::m_Lock;
+ Hide();
+ m_Device = NULL;
+}
+
+//
+// cXinelibOsdProvider
+//
cXinelibOsdProvider::cXinelibOsdProvider(cXinelibDevice *Device)
- : m_Device(Device)
{
+ m_Device = Device;
}
cXinelibOsdProvider::~cXinelibOsdProvider()
{
- if(m_OsdStack.First())
+ LOGMSG("cXinelibOsdProvider: shutting down !");
+
+ cMutexLock ml(&cXinelibOsd::m_Lock);
+
+ m_Device = NULL;
+
+ if(cXinelibOsd::m_OsdStack.First()) {
LOGMSG("cXinelibOsdProvider: OSD open while OSD provider shutting down !");
+
+ // Detach all OSD instances from device
+ cXinelibOsd *osd;
+ while(osd = cXinelibOsd::m_OsdStack.First()) {
+ osd->Detach();
+ cXinelibOsd::m_OsdStack.Del(osd, false);
+ }
+ }
}
cOsd *cXinelibOsdProvider::CreateOsd(int Left, int Top)
{
TRACEF("cXinelibOsdProvider::CreateOsd");
- cMutexLock ml(&m_Lock);
+ cMutexLock ml(&cXinelibOsd::m_Lock);
- if(m_OsdStack.First())
- LOGDBG("cXinelibOsdProvider::CreateOsd - OSD already open !");
+ if(cXinelibOsd::m_OsdStack.First())
+ LOGMSG("cXinelibOsdProvider::CreateOsd - OSD already open !");
cXinelibOsd *m_OsdInstance = new cXinelibOsd(m_Device, Left, Top);
- if(m_OsdStack.First())
- m_OsdStack.First()->Hide();
+ if(cXinelibOsd::m_OsdStack.First())
+ cXinelibOsd::m_OsdStack.First()->Hide();
- m_OsdStack.Ins(m_OsdInstance);
+ cXinelibOsd::m_OsdStack.Ins(m_OsdInstance);
return m_OsdInstance;
}
-void cXinelibOsdProvider::OsdClosed(cXinelibOsd *Osd)
-{
- TRACEF("cXinelibOsdProvider::OsdClosed");
-// m_Lock.Lock(); Atomic with OsdClosing
- if(m_OsdStack.First())
- m_OsdStack.First()->Show();
- m_Lock.Unlock();
-}
-
-void cXinelibOsdProvider::OsdClosing(cXinelibOsd *Osd)
-{
- TRACEF("cXinelibOsdProvider::OsdClosing");
- m_Lock.Lock();
- m_OsdStack.Del(Osd,false);
-// m_Lock.Unlock(); Atomic with OsdClosed
-}
-
void cXinelibOsdProvider::RefreshOsd(void)
{
TRACEF("cXinelibOsdProvider::RefreshOsd");
- cMutexLock ml(&m_Lock);
- if(m_OsdStack.First())
- m_OsdStack.First()->Refresh();
+ cMutexLock ml(&cXinelibOsd::m_Lock);
+
+ if(cXinelibOsd::m_OsdStack.First())
+ cXinelibOsd::m_OsdStack.First()->Refresh();
}
diff --git a/osd.h b/osd.h
index ccdfe74e..b7f7e2dc 100644
--- a/osd.h
+++ b/osd.h
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: osd.h,v 1.1 2006-06-03 09:50:54 phintuka Exp $
+ * $Id: osd.h,v 1.2 2006-08-07 21:09:16 phintuka Exp $
*
*/
@@ -13,7 +13,6 @@
#include <vdr/config.h>
#include <vdr/osd.h>
-#include <vdr/thread.h> // cMutex
#include <vdr/tools.h> // cListObject
class cXinelibDevice;
@@ -23,10 +22,13 @@ class cXinelibOsd : public cOsd, public cListObject
private:
cXinelibOsd();
cXinelibOsd(cXinelibOsd&);
+
cXinelibDevice *m_Device;
protected:
- cMutex m_Lock;
+ static cMutex m_Lock;
+ static cList<cXinelibOsd> m_OsdStack;
+
bool m_IsVisible;
bool m_Shown;
@@ -38,6 +40,7 @@ class cXinelibOsd : public cOsd, public cListObject
void Show(void);
void Hide(void);
void Refresh(void);
+ void Detach(void);
friend class cXinelibOsdProvider;
@@ -46,18 +49,12 @@ class cXinelibOsd : public cOsd, public cListObject
virtual ~cXinelibOsd();
};
+class cMutex;
+
class cXinelibOsdProvider : public cOsdProvider
{
protected:
- cXinelibDevice *m_Device;
- static cList<cXinelibOsd> m_OsdStack;
- static cMutex m_Lock;
-
- // Messages from cXinelibOsd
- static void OsdClosing(cXinelibOsd *Osd);
- static void OsdClosed(cXinelibOsd *Osd);
-
- friend class cXinelibOsd;
+ cXinelibDevice *m_Device;
public:
cXinelibOsdProvider(cXinelibDevice *Device);