diff options
-rw-r--r-- | dxr3audio-oss.c | 30 | ||||
-rw-r--r-- | dxr3audio-oss.h | 1 | ||||
-rw-r--r-- | dxr3audio.c | 10 | ||||
-rw-r--r-- | dxr3audio.h | 6 |
4 files changed, 38 insertions, 9 deletions
diff --git a/dxr3audio-oss.c b/dxr3audio-oss.c index c13e91d..148c900 100644 --- a/dxr3audio-oss.c +++ b/dxr3audio-oss.c @@ -24,6 +24,7 @@ #include "dxr3audio-oss.h" #include "dxr3device.h" +#include "settings.h" static const char *DEV_DXR3_OSS = "_ma"; @@ -91,21 +92,34 @@ void cAudioOss::poll(cPoller &poller) void cAudioOss::setDigitalAudio(bool on) { - if (digitalAudio == on) { + if (digitalAudio == on) return; - } - uint32_t ioval = 0; + reconfigure(); - if (on) { - ioval = EM8300_AUDIOMODE_DIGITALPCM; + digitalAudio = on; +} + +void cAudioOss::reconfigure() +{ + uint32_t ioval = 0; + dsyslog("[dxr3-oss] reconfigure"); + + // this is quite an imporant part, as we need to + // decide how we set the audiomode of oss device. + if (digitalAudio) { + ioval = EM8300_AUDIOMODE_DIGITALAC3; } else { - ioval = EM8300_AUDIOMODE_ANALOG; + + // digital or analog pcm? + if (cSettings::instance()->useDigitalOut()) { + ioval = EM8300_AUDIOMODE_DIGITALPCM; + } else { + ioval = EM8300_AUDIOMODE_ANALOG; + } } // we need to do it this way, as we dont have access // to the file handle for the conrtol sub device. cDxr3Device::instance()->ossSetPlayMode(ioval); - - digitalAudio = on; } diff --git a/dxr3audio-oss.h b/dxr3audio-oss.h index 162d91e..d181719 100644 --- a/dxr3audio-oss.h +++ b/dxr3audio-oss.h @@ -34,6 +34,7 @@ public: virtual void write(uchar* data, size_t size); virtual void poll(cPoller &poller); virtual void setDigitalAudio(bool on); + virtual void reconfigure(); private: int fd; diff --git a/dxr3audio.c b/dxr3audio.c index fa61708..2b2bc61 100644 --- a/dxr3audio.c +++ b/dxr3audio.c @@ -32,6 +32,16 @@ const static int AUDIO_MONO_RIGHT = 2; iAudio::iAudio() : open(false), enabled(false), vol(0), audioChannel(0), digitalAudio(false) { memset(&curContext, 0, sizeof(SampleContext)); + + cSettings::instance()->registerObserver(this); +} + +void iAudio::settingsChange(SettingsChange change) +{ + if (change == AUDIO) { + // apply changed audio settings + reconfigure(); + } } void iAudio::changeVolume(int16_t* pcmbuf, size_t size) diff --git a/dxr3audio.h b/dxr3audio.h index 229b6e6..6a8d503 100644 --- a/dxr3audio.h +++ b/dxr3audio.h @@ -21,6 +21,7 @@ #ifndef _AUDIO_H_ #define _AUDIO_H_ +#include "settings.h" #include <vdr/tools.h> // for uchar struct SampleContext { @@ -28,7 +29,7 @@ struct SampleContext { int samplerate; }; -class iAudio { +class iAudio : public iSettingsObserver { public: iAudio(); virtual ~iAudio() {} @@ -51,6 +52,9 @@ public: virtual void setDigitalAudio(bool on) = 0; bool isDigitalAudio() { return digitalAudio; } + virtual void settingsChange(SettingsChange change); + virtual void reconfigure() {} + protected: bool open; bool enabled; |