summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2010-06-24 19:29:57 +0200
committerChristian Gmeiner <christian.gmeiner@gmail.com>2010-06-24 19:29:57 +0200
commitd72b9a3bfa4d15c0bf906cf3ad86bc921667b6b0 (patch)
treed7f074e94164255ccfe06894bb70582f8db72bb7
parent6522f093db52ee828c9ce6d0398811174d607b41 (diff)
downloadvdr-plugin-dxr3-d72b9a3bfa4d15c0bf906cf3ad86bc921667b6b0.tar.gz
vdr-plugin-dxr3-d72b9a3bfa4d15c0bf906cf3ad86bc921667b6b0.tar.bz2
alsa: try to use mmap access type and fall back to slow write, if mmap not avaiable
-rw-r--r--dxr3audio-alsa.c16
-rw-r--r--dxr3audio-alsa.h2
2 files changed, 14 insertions, 4 deletions
diff --git a/dxr3audio-alsa.c b/dxr3audio-alsa.c
index a946d2f..23af170 100644
--- a/dxr3audio-alsa.c
+++ b/dxr3audio-alsa.c
@@ -92,9 +92,17 @@ void cAudioAlsa::setup(int channels, int samplerate)
}
// set access type
- err = snd_pcm_hw_params_set_access(handle, alsa_hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);
+ pcm_write_func = &snd_pcm_mmap_writei;
+ err = snd_pcm_hw_params_set_access(handle, alsa_hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED);
if (err < 0) {
- esyslog("[dxr3-audio-alsa] Unable to set access type: %s", snd_strerror(err));
+ esyslog("[dxr3-audio-alsa] mmap not available, attempting to fall back to slow writes");
+
+ pcm_write_func = &snd_pcm_writei;
+ err = snd_pcm_hw_params_set_access(handle, alsa_hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);
+ if (err < 0) {
+ esyslog("[dxr3-audio-alsa] Unable to set access type: %s", snd_strerror(err));
+ exit(-2);
+ }
}
// set format
@@ -228,10 +236,10 @@ void cAudioAlsa::write(uchar* data, size_t size)
snd_pcm_sframes_t res = 0;
while (frames > 0) {
- res = snd_pcm_writei(handle, output_samples, frames);
+ res = pcm_write_func(handle, output_samples, frames);
if (res == -EAGAIN) {
- snd_pcm_wait(handle, 500);
+ snd_pcm_wait(handle, 10);
} else if (res == -EINTR) {
// nothing to do
res = 0;
diff --git a/dxr3audio-alsa.h b/dxr3audio-alsa.h
index c5eda3e..81588ab 100644
--- a/dxr3audio-alsa.h
+++ b/dxr3audio-alsa.h
@@ -44,6 +44,8 @@ private:
snd_pcm_status_t *status;
size_t bytesFrame;
+ snd_pcm_sframes_t (*pcm_write_func)(snd_pcm_t*, const void*, snd_pcm_uframes_t);
+
void Xrun();
};