summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dxr3audio-alsa.c17
-rw-r--r--dxr3audio-alsa.h2
-rw-r--r--dxr3audio-oss.c19
-rw-r--r--dxr3audio-oss.h4
-rw-r--r--dxr3audio.h5
-rw-r--r--dxr3device.c2
6 files changed, 32 insertions, 17 deletions
diff --git a/dxr3audio-alsa.c b/dxr3audio-alsa.c
index 87012d5..0e45afb 100644
--- a/dxr3audio-alsa.c
+++ b/dxr3audio-alsa.c
@@ -26,6 +26,9 @@ using namespace std;
void cAudioAlsa::openDevice()
{
+ if (open)
+ return;
+
// generate alsa card name
int card = cDxr3ConfigData::Instance().GetDxr3Card();
string cardname = "EM8300";
@@ -35,9 +38,6 @@ void cAudioAlsa::openDevice()
}
string device = "default:CARD=" + cardname;
-
- releaseDevice();
-
dsyslog("[dxr3-audio-alsa] opening device %s", device.c_str());
int err = snd_pcm_open(&handle, device.c_str(), SND_PCM_STREAM_PLAYBACK, 0);
@@ -45,18 +45,25 @@ void cAudioAlsa::openDevice()
esyslog("[dxr3-audio-alsa] Playback open error: %s", snd_strerror(err));
exit(1);
}
+
+ open = true;
}
void cAudioAlsa::releaseDevice()
{
+ if (!open)
+ return;
+
if (handle) {
snd_pcm_drain(handle);
snd_pcm_close(handle);
handle = NULL;
}
+
+ open = false;
}
-void cAudioAlsa::setup(SampleContext ctx)
+void cAudioAlsa::setup(const SampleContext& ctx)
{
// look if ctx is different
if (curContext.channels == ctx.channels && curContext.samplerate == ctx.samplerate) {
@@ -94,7 +101,7 @@ void cAudioAlsa::setup(SampleContext ctx)
}
// set samplerate
- err = snd_pcm_hw_params_set_rate_near(handle, alsa_hwparams, &ctx.samplerate, NULL);
+ err = snd_pcm_hw_params_set_rate_near(handle, alsa_hwparams, (unsigned int *)&ctx.samplerate, NULL);
if (err < 0) {
esyslog("[dxr3-audio-alsa] Unable to set samplerate %d: %s", ctx.samplerate, snd_strerror(err));
}
diff --git a/dxr3audio-alsa.h b/dxr3audio-alsa.h
index 7a6a337..697e54c 100644
--- a/dxr3audio-alsa.h
+++ b/dxr3audio-alsa.h
@@ -34,7 +34,7 @@ public:
virtual void openDevice();
virtual void releaseDevice();
- virtual void setup(SampleContext ctx);
+ virtual void setup(const SampleContext& ctx);
virtual void write(uchar* data, size_t size);
virtual void setAudioMode(AudioMode m);
diff --git a/dxr3audio-oss.c b/dxr3audio-oss.c
index 94b3e21..16c7adc 100644
--- a/dxr3audio-oss.c
+++ b/dxr3audio-oss.c
@@ -26,13 +26,11 @@
static const char *DEV_DXR3_OSS = "_ma";
-cAudioOss::~cAudioOss()
-{
- close(fd);
-}
-
void cAudioOss::openDevice()
{
+ if (open)
+ return;
+
fd = cDxr3Interface::Dxr3Open(DEV_DXR3_OSS, O_RDWR | O_NONBLOCK);
if (!fd) {
@@ -47,14 +45,21 @@ void cAudioOss::openDevice()
dsyslog("[dxr3-audio-oss] audio mode: analog");
setAudioMode(Analog);
}
+
+ open = true;
}
void cAudioOss::releaseDevice()
{
+ if (!open)
+ return;
+
close(fd);
+
+ open = false;
}
-void cAudioOss::setup(SampleContext ctx)
+void cAudioOss::setup(const SampleContext& ctx)
{
// set sample rate
if (curContext.samplerate != ctx.samplerate) {
@@ -82,7 +87,7 @@ void cAudioOss::write(uchar* data, size_t size)
void cAudioOss::setAudioMode(AudioMode mode)
{
- uint32_t ioval;
+ uint32_t ioval = 0;
switch (mode) {
case Analog:
diff --git a/dxr3audio-oss.h b/dxr3audio-oss.h
index eff2a6a..d1591d5 100644
--- a/dxr3audio-oss.h
+++ b/dxr3audio-oss.h
@@ -26,11 +26,11 @@
class cAudioOss : public iAudio {
public:
cAudioOss() : iAudio(), fd(-1) {}
- ~cAudioOss();
+ ~cAudioOss() {}
virtual void openDevice();
virtual void releaseDevice();
- virtual void setup(SampleContext ctx);
+ virtual void setup(const SampleContext& ctx);
virtual void write(uchar* data, size_t size);
virtual void setAudioMode(AudioMode m);
diff --git a/dxr3audio.h b/dxr3audio.h
index 1f0bbda..118d460 100644
--- a/dxr3audio.h
+++ b/dxr3audio.h
@@ -37,12 +37,12 @@ public:
Ac3,
};
- iAudio() : vol(0), audioChannel(0) { memset(&curContext, 0, sizeof(SampleContext)); }
+ iAudio() : open(false), vol(0), audioChannel(0) { memset(&curContext, 0, sizeof(SampleContext)); }
virtual ~iAudio() {}
virtual void openDevice() = 0;
virtual void releaseDevice() = 0;
- virtual void setup(SampleContext ctx) = 0;
+ virtual void setup(const SampleContext& ctx) = 0;
virtual void write(uchar* data, size_t size) = 0;
void setVolume(int v) { vol = v; }
@@ -59,6 +59,7 @@ public:
protected:
+ bool open;
int vol;
int audioChannel;
SampleContext curContext;
diff --git a/dxr3device.c b/dxr3device.c
index 19efc82..e3b30ed 100644
--- a/dxr3device.c
+++ b/dxr3device.c
@@ -43,6 +43,7 @@ cDxr3Device::cDxr3Device() : m_DemuxDevice(cDxr3Interface::Instance())
// audio output system we will use.
audioOut = new cAudioOss();
//audioOut = new cAudioAlsa();
+ audioOut->openDevice();
m_DemuxDevice.setAudio(audioOut);
}
@@ -50,6 +51,7 @@ cDxr3Device::cDxr3Device() : m_DemuxDevice(cDxr3Interface::Instance())
// ==================================
cDxr3Device::~cDxr3Device()
{
+ audioOut->releaseDevice();
delete audioOut;
if (m_spuDecoder)