diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-10-26 15:36:40 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-10-26 15:36:40 +0000 |
| commit | e03c732afb410b4d6b9f9540c36c33c941ee38f1 (patch) | |
| tree | 6726b70fe68281c956eb5044e991bd0d5ba074b1 /lib/driver | |
| parent | 2acb4b8b6992707d79f7678f714c711e2c6fce1f (diff) | |
| download | enigma2-e03c732afb410b4d6b9f9540c36c33c941ee38f1.tar.gz enigma2-e03c732afb410b4d6b9f9540c36c33c941ee38f1.zip | |
add auto vcr switching support (needs new drivers (fp.ko))
Diffstat (limited to 'lib/driver')
| -rw-r--r-- | lib/driver/avswitch.cpp | 47 | ||||
| -rw-r--r-- | lib/driver/avswitch.h | 13 |
2 files changed, 56 insertions, 4 deletions
diff --git a/lib/driver/avswitch.cpp b/lib/driver/avswitch.cpp index 199a7855..8233d97e 100644 --- a/lib/driver/avswitch.cpp +++ b/lib/driver/avswitch.cpp @@ -1,5 +1,3 @@ -#include <lib/driver/avswitch.h> - #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> @@ -7,6 +5,8 @@ #include <lib/base/init.h> #include <lib/base/init_num.h> #include <lib/base/eerror.h> +#include <lib/base/ebase.h> +#include <lib/driver/avswitch.h> eAVSwitch *eAVSwitch::instance = 0; @@ -15,6 +15,49 @@ eAVSwitch::eAVSwitch() ASSERT(!instance); instance = this; m_video_mode = 0; + m_fp_fd = open("/dev/dbox/fp0", O_RDONLY|O_NONBLOCK); + if (m_fp_fd == -1) + { + eDebug("couldnt open /dev/dbox/fp0 to monitor vcr scart slow blanking changed!"); + m_fp_notifier=0; + } + else + { + m_fp_notifier = new eSocketNotifier(eApp, m_fp_fd, eSocketNotifier::Read); + CONNECT(m_fp_notifier->activated, eAVSwitch::fp_event); + } +} + +#ifndef FP_IOCTL_GET_EVENT +#define FP_IOCTL_GET_EVENT 20 +#endif + +#ifndef FP_IOCTL_GET_VCR +#define FP_IOCTL_GET_VCR 7 +#endif + +#ifndef FP_EVENT_VCR_SB_CHANGED +#define FP_EVENT_VCR_SB_CHANGED 1 +#endif + +int eAVSwitch::getVCRSlowBlanking() +{ + int val=0; + if (m_fp_fd >= 0) + { + if (ioctl(m_fp_fd, FP_IOCTL_GET_VCR, &val) < 0) + eDebug("FP_GET_VCR failed (%m)"); + } + return val; +} + +void eAVSwitch::fp_event(int what) +{ + int val = FP_EVENT_VCR_SB_CHANGED; // ask only for this event + if (ioctl(m_fp_fd, FP_IOCTL_GET_EVENT, &val) < 0) + eDebug("FP_IOCTL_GET_EVENT failed (%m)"); + else if (val & FP_EVENT_VCR_SB_CHANGED) + /* emit */ vcr_sb_notifier(getVCRSlowBlanking()); } eAVSwitch::~eAVSwitch() diff --git a/lib/driver/avswitch.h b/lib/driver/avswitch.h index d0221d50..2b3b40fb 100644 --- a/lib/driver/avswitch.h +++ b/lib/driver/avswitch.h @@ -1,10 +1,18 @@ #ifndef __avswitch_h #define __avswitch_h -class eAVSwitch +#include <lib/base/object.h> +#include <lib/python/connections.h> + +class eSocketNotifier; + +class eAVSwitch: public Object { static eAVSwitch *instance; int m_video_mode; + eSocketNotifier *m_fp_notifier; + void fp_event(int what); + int m_fp_fd; #ifdef SWIG eAVSwitch(); ~eAVSwitch(); @@ -16,7 +24,7 @@ public: ~eAVSwitch(); #endif static eAVSwitch *getInstance(); - + int getVCRSlowBlanking(); void setFastBlank(int val); void setColorFormat(int format); void setAspectRatio(int ratio); @@ -24,6 +32,7 @@ public: void setInput(int val); void setSlowblank(int val); void setWSS(int val); + PSignal1<void, int> vcr_sb_notifier; }; #endif |
