diff options
author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2010-04-16 21:23:19 +0200 |
---|---|---|
committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2010-04-16 21:23:19 +0200 |
commit | b06b679a780f8ab0f636e94abd38f2090829b713 (patch) | |
tree | d37301cd46efb6e5594c3b5516daa1f5ea133f47 | |
parent | 59e94aed06da78b0dce94d2540c98c97bdc31968 (diff) | |
download | vdr-plugin-dxr3-b06b679a780f8ab0f636e94abd38f2090829b713.tar.gz vdr-plugin-dxr3-b06b679a780f8ab0f636e94abd38f2090829b713.tar.bz2 |
All audio modes should work with oss driver except ac3 passthrough
It is also possible to change audio related settings in setup menu
of the plugin and they become active immediately.
-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; |