diff options
-rw-r--r-- | dxr3audio-alsa.c | 5 | ||||
-rw-r--r-- | dxr3audio-alsa.h | 1 | ||||
-rw-r--r-- | dxr3audio-oss.c | 5 | ||||
-rw-r--r-- | dxr3audio-oss.h | 1 | ||||
-rw-r--r-- | dxr3audio-pa.c | 8 | ||||
-rw-r--r-- | dxr3audio-pa.h | 1 | ||||
-rw-r--r-- | dxr3audio.h | 1 | ||||
-rw-r--r-- | dxr3device.c | 9 | ||||
-rw-r--r-- | dxr3device.h | 1 |
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); |