diff options
-rw-r--r-- | dxr3.c | 22 | ||||
-rw-r--r-- | dxr3device.c | 15 | ||||
-rw-r--r-- | dxr3device.h | 6 | ||||
-rw-r--r-- | settings.c | 18 | ||||
-rw-r--r-- | settings.h | 17 |
5 files changed, 77 insertions, 1 deletions
@@ -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(); @@ -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++; + } +} @@ -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*/ |