summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2010-04-16 21:23:19 +0200
committerChristian Gmeiner <christian.gmeiner@gmail.com>2010-04-16 21:23:19 +0200
commitb06b679a780f8ab0f636e94abd38f2090829b713 (patch)
treed37301cd46efb6e5594c3b5516daa1f5ea133f47
parent59e94aed06da78b0dce94d2540c98c97bdc31968 (diff)
downloadvdr-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.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;