summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2010-04-16 21:05:57 +0200
committerChristian Gmeiner <christian.gmeiner@gmail.com>2010-04-16 21:05:57 +0200
commitc182191b3d54dcb22abc5c8b08d9c63e7a57b585 (patch)
tree253bbf0d84a0e79f226fc84910ac971d58aed99b
parentc4bd8a38e6547b3ccd2eadd151053e0a5e7d7ac2 (diff)
downloadvdr-plugin-dxr3-c182191b3d54dcb22abc5c8b08d9c63e7a57b585.tar.gz
vdr-plugin-dxr3-c182191b3d54dcb22abc5c8b08d9c63e7a57b585.tar.bz2
add infrastructure to observe settings changes
Check it out by changing BSC vales in the settings osd.
-rw-r--r--dxr3.c22
-rw-r--r--dxr3device.c15
-rw-r--r--dxr3device.h6
-rw-r--r--settings.c18
-rw-r--r--settings.h17
5 files changed, 77 insertions, 1 deletions
diff --git a/dxr3.c b/dxr3.c
index 028120d..a7d2c99 100644
--- a/dxr3.c
+++ b/dxr3.c
@@ -90,6 +90,21 @@ cMenuSetupDxr3::cMenuSetupDxr3()
// save menu values
void cMenuSetupDxr3::Store()
{
+ bool emitAudio = false;
+ bool emitBCS = false;
+
+ // check which events we should emit
+ if (cSettings::instance()->useDigitalOut() != newUseDigitalOut) {
+ emitAudio = true;
+ }
+
+ if (cSettings::instance()->brightness() != newBrightness ||
+ cSettings::instance()->contrast() != newContrast ||
+ cSettings::instance()->saturation() != newSaturation) {
+ emitBCS = true;
+ }
+
+ // store new settings
SetupStore("Brightness", cSettings::instance()->brightness(newBrightness));
SetupStore("Contrast", cSettings::instance()->contrast(newContrast));
SetupStore("Saturation", cSettings::instance()->saturation(newSaturation));
@@ -98,6 +113,13 @@ void cMenuSetupDxr3::Store()
SetupStore("UseDigitalOut", cSettings::instance()->useDigitalOut(newUseDigitalOut));
SetupStore("HideMenu", cSettings::instance()->hideMenu(newHideMenu));
SetupStore("Dxr3Card", cSettings::instance()->card(newDxr3Card));
+
+ // emit
+ if (emitAudio)
+ cSettings::instance()->emitChange(AUDIO);
+
+ if (emitBCS)
+ cSettings::instance()->emitChange(BCS);
}
// ==================================
diff --git a/dxr3device.c b/dxr3device.c
index 1f8be19..02773bb 100644
--- a/dxr3device.c
+++ b/dxr3device.c
@@ -68,6 +68,9 @@ cDxr3Device::cDxr3Device() : spuDecoder(NULL), pluginOn(true), vPts(0), scrSet(f
audioOut->openDevice();
aDecoder = new cDxr3AudioDecoder();
+
+ // register observer
+ cSettings::instance()->registerObserver(this);
}
cDxr3Device::~cDxr3Device()
@@ -457,6 +460,18 @@ int cDxr3Device::ossSetPlayMode(uint32_t mode)
return ioctl(fdControl, EM8300_IOCTL_SET_AUDIOMODE, &mode);
}
+void cDxr3Device::settingsChange(SettingsChange change)
+{
+ if (change == BCS) {
+ // update bcs value
+ bcs.brightness = cSettings::instance()->brightness();
+ bcs.contrast = cSettings::instance()->contrast();
+ bcs.saturation = cSettings::instance()->saturation();
+
+ CHECK(ioctl(fdControl, EM8300_IOCTL_SETBCS, &bcs));
+ }
+}
+
void cDxr3Device::claimDevices()
{
// open control stream
diff --git a/dxr3device.h b/dxr3device.h
index 3d2cef7..1732c03 100644
--- a/dxr3device.h
+++ b/dxr3device.h
@@ -30,6 +30,7 @@
#include "dxr3audiodecoder.h"
#include "dxr3spudecoder.h"
#include "dxr3audio.h"
+#include "settings.h"
#include "uncopyable.h"
class cDxr3Name {
@@ -47,7 +48,7 @@ private:
cDxr3Device is the interface for VDR devices.
Is is the part, which VDR "talks" with our plugin.
*/
-class cDxr3Device : public cDevice, public Uncopyable {
+class cDxr3Device : public cDevice, public Uncopyable, public iSettingsObserver {
public:
static cDxr3Device *instance();
@@ -95,6 +96,9 @@ public:
int ossSetPlayMode(uint32_t mode);
+ // observer
+ virtual void settingsChange(SettingsChange change);
+
private:
cDxr3Device();
~cDxr3Device();
diff --git a/settings.c b/settings.c
index 3bc0dfa..7e7b0f3 100644
--- a/settings.c
+++ b/settings.c
@@ -64,3 +64,21 @@ bool cSettings::processArgs(int argc, char *argv[])
}
return true;
}
+
+void cSettings::registerObserver(iSettingsObserver *observer)
+{
+ if (!observer)
+ return;
+
+ observers.push_back(observer);
+}
+
+void cSettings::emitChange(SettingsChange change)
+{
+ std::vector<iSettingsObserver *>::iterator iter = observers.begin();
+
+ while(iter != observers.end()) {
+ (*iter)->settingsChange(change);
+ iter++;
+ }
+}
diff --git a/settings.h b/settings.h
index 084d3f4..d22e5a7 100644
--- a/settings.h
+++ b/settings.h
@@ -30,6 +30,7 @@
#include "singleton.h"
#include "accessors.h"
#include <linux/em8300.h>
+#include <vector>
// ==================================
//! possible video modes
@@ -53,6 +54,15 @@ enum Ac3AudioMode {
AC3_PASSTHROUGH
};
+enum SettingsChange {
+ AUDIO,
+ BCS
+};
+class iSettingsObserver {
+public:
+ virtual void settingsChange(SettingsChange change) = 0;
+};
+
// ==================================
//! global interface to access all config datas of this plugin
/*
@@ -83,6 +93,13 @@ public:
Accessors<bool> loadFirmware;
Accessors<AudioDriver> audioDriver;
Accessors<Ac3AudioMode> ac3AudioMode;
+
+ // observer
+ void registerObserver(iSettingsObserver *observer);
+ void emitChange(SettingsChange change);
+
+private:
+ std::vector<iSettingsObserver *> observers;
};
#endif /*SETTINGS_H*/