diff options
-rw-r--r-- | dxr3audio-alsa.c | 17 | ||||
-rw-r--r-- | dxr3audio-alsa.h | 2 | ||||
-rw-r--r-- | dxr3audio-oss.c | 19 | ||||
-rw-r--r-- | dxr3audio-oss.h | 4 | ||||
-rw-r--r-- | dxr3audio.h | 5 | ||||
-rw-r--r-- | dxr3device.c | 2 |
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) |