summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dxr3audio-alsa.c5
-rw-r--r--dxr3audio-alsa.h1
-rw-r--r--dxr3audio-oss.c5
-rw-r--r--dxr3audio-oss.h1
-rw-r--r--dxr3audio-pa.c8
-rw-r--r--dxr3audio-pa.h1
-rw-r--r--dxr3audio.h1
-rw-r--r--dxr3device.c9
-rw-r--r--dxr3device.h1
9 files changed, 30 insertions, 2 deletions
diff --git a/dxr3audio-alsa.c b/dxr3audio-alsa.c
index bb06eeb..6463028 100644
--- a/dxr3audio-alsa.c
+++ b/dxr3audio-alsa.c
@@ -227,6 +227,11 @@ void cAudioAlsa::write(uchar* data, size_t size)
}
}
+void cAudioAlsa::flush()
+{
+ snd_pcm_drop(handle);
+}
+
void cAudioAlsa::Xrun()
{
int res;
diff --git a/dxr3audio-alsa.h b/dxr3audio-alsa.h
index 1d6ec59..c5eda3e 100644
--- a/dxr3audio-alsa.h
+++ b/dxr3audio-alsa.h
@@ -36,6 +36,7 @@ public:
virtual void releaseDevice();
virtual void setup(int channels, int samplerate);
virtual void write(uchar* data, size_t size);
+ virtual void flush();
virtual void setDigitalAudio(bool on) {}
private:
diff --git a/dxr3audio-oss.c b/dxr3audio-oss.c
index 148c900..8b2494d 100644
--- a/dxr3audio-oss.c
+++ b/dxr3audio-oss.c
@@ -85,6 +85,11 @@ void cAudioOss::write(uchar* data, size_t size)
}
}
+void cAudioOss::flush()
+{
+ CHECK(cDxr3Device::instance()->ossFlush());
+}
+
void cAudioOss::poll(cPoller &poller)
{
poller.Add(fd, true);
diff --git a/dxr3audio-oss.h b/dxr3audio-oss.h
index d181719..6cdc691 100644
--- a/dxr3audio-oss.h
+++ b/dxr3audio-oss.h
@@ -32,6 +32,7 @@ public:
virtual void releaseDevice();
virtual void setup(int channels, int samplerate);
virtual void write(uchar* data, size_t size);
+ virtual void flush();
virtual void poll(cPoller &poller);
virtual void setDigitalAudio(bool on);
virtual void reconfigure();
diff --git a/dxr3audio-pa.c b/dxr3audio-pa.c
index fefabae..30be28f 100644
--- a/dxr3audio-pa.c
+++ b/dxr3audio-pa.c
@@ -76,4 +76,12 @@ void cAudioPA::write(uchar* data, size_t size)
}
}
+void cAudioPA::flush()
+{
+ int ret = pa_simple_flush(s, &error);
+
+ if (ret < 0) {
+ esyslog("[dxr3-audio-pa] failed to write audio data: %s", pa_strerror(error));
+ }
+}
#endif
diff --git a/dxr3audio-pa.h b/dxr3audio-pa.h
index 350ee13..a1fe307 100644
--- a/dxr3audio-pa.h
+++ b/dxr3audio-pa.h
@@ -35,6 +35,7 @@ public:
virtual void releaseDevice();
virtual void setup(int channels, int samplerate);
virtual void write(uchar* data, size_t size);
+ virtual void flush();
virtual void poll(cPoller &poller) {}
virtual void setDigitalAudio(bool on) {}
diff --git a/dxr3audio.h b/dxr3audio.h
index 6a8d503..296d7f3 100644
--- a/dxr3audio.h
+++ b/dxr3audio.h
@@ -38,6 +38,7 @@ public:
virtual void releaseDevice() = 0;
virtual void setup(int channels, int samplerate) = 0;
virtual void write(uchar* data, size_t size) = 0;
+ virtual void flush() = 0;
virtual void poll(cPoller &poller) { (void)poller; }
diff --git a/dxr3device.c b/dxr3device.c
index 02773bb..fc1c31a 100644
--- a/dxr3device.c
+++ b/dxr3device.c
@@ -182,8 +182,7 @@ void cDxr3Device::Clear()
uint32_t ioval = EM8300_SUBDEVICE_VIDEO;
CHECK(ioctl(fdControl, EM8300_IOCTL_FLUSH, &ioval));
- ioval = EM8300_SUBDEVICE_AUDIO;
- CHECK(ioctl(fdControl, EM8300_IOCTL_FLUSH, &ioval));
+ audioOut->flush();
cDevice::Clear();
}
@@ -460,6 +459,12 @@ int cDxr3Device::ossSetPlayMode(uint32_t mode)
return ioctl(fdControl, EM8300_IOCTL_SET_AUDIOMODE, &mode);
}
+int cDxr3Device::ossFlush()
+{
+ uint32_t ioval = EM8300_SUBDEVICE_AUDIO;
+ return ioctl(fdControl, EM8300_IOCTL_FLUSH, &ioval);
+}
+
void cDxr3Device::settingsChange(SettingsChange change)
{
if (change == BCS) {
diff --git a/dxr3device.h b/dxr3device.h
index 1732c03..aa26f25 100644
--- a/dxr3device.h
+++ b/dxr3device.h
@@ -95,6 +95,7 @@ public:
void clearButton();
int ossSetPlayMode(uint32_t mode);
+ int ossFlush();
// observer
virtual void settingsChange(SettingsChange change);