summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dxr3audio-oss.c30
-rw-r--r--dxr3audio-oss.h1
-rw-r--r--dxr3audio.c10
-rw-r--r--dxr3audio.h6
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;