aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Output/alsa/outputalsa.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-06-25 13:45:40 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2008-06-25 13:45:40 +0000
commit3202566a05ef57922379697c5192010415488d20 (patch)
tree82de4ab0408e891890a373221569a3b98c531427 /src/plugins/Output/alsa/outputalsa.cpp
parent32fb51e49fa811d6caf23283a5714851a57eba9c (diff)
downloadqmmp-3202566a05ef57922379697c5192010415488d20.tar.gz
qmmp-3202566a05ef57922379697c5192010415488d20.tar.bz2
qmmp-3202566a05ef57922379697c5192010415488d20.zip
alsa plugin: mmap access support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@431 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Output/alsa/outputalsa.cpp')
-rw-r--r--src/plugins/Output/alsa/outputalsa.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp
index 0f3b62d7e..100d3a7b6 100644
--- a/src/plugins/Output/alsa/outputalsa.cpp
+++ b/src/plugins/Output/alsa/outputalsa.cpp
@@ -29,6 +29,10 @@
#include <string.h>
#include <iostream>
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
#include <qmmp/constants.h>
#include <qmmp/buffer.h>
#include <qmmp/visual.h>
@@ -41,6 +45,7 @@ OutputALSA::OutputALSA(QObject * parent, bool useVolume)
{
QSettings settings(QDir::homePath()+"/.qmmp/qmmprc", QSettings::IniFormat);
QString dev_name = settings.value("ALSA/device","default").toString();
+ m_use_mmap = settings.value("ALSA/use_mmap", FALSE).toBool();
pcm_name = strdup(dev_name.toAscii().data());
stream = SND_PCM_STREAM_PLAYBACK;
snd_pcm_hw_params_alloca(&hwparams);
@@ -120,12 +125,23 @@ void OutputALSA::configure(long freq, int chan, int prec, int brate)
uint period_time = settings.value("period_time",100).toUInt()*1000;
settings.endGroup();
- if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
+ if (m_use_mmap)
{
- qWarning("OutputALSA: Error setting access.");
- return;
+ if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0)
+ {
+ qWarning("OutputALSA: Error setting mmap access.");
+ m_use_mmap = FALSE;
+ }
}
+ if (!m_use_mmap)
+ {
+ if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
+ {
+ qWarning("OutputALSA: Error setting access.");
+ return;
+ }
+ }
if (snd_pcm_hw_params_set_format(pcm_handle, hwparams, SND_PCM_FORMAT_S16_LE) < 0)
{
@@ -137,6 +153,7 @@ void OutputALSA::configure(long freq, int chan, int prec, int brate)
exact_rate = rate;// = 11000;
qDebug("OutputALSA: frequency=%d, channels=%d, bitrate=%d",
rate, chan, brate);
+
if (snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &exact_rate, 0) < 0)
{
qWarning("OutputALSA: Error setting rate.\n");
@@ -285,7 +302,10 @@ void OutputALSA::run()
l = snd_pcm_bytes_to_frames(pcm_handle, b->nbytes - n);
while (l>0)
{
- m = snd_pcm_writei (pcm_handle, b->data+n, l);
+ if (m_use_mmap)
+ m = snd_pcm_mmap_writei (pcm_handle, b->data+n, l);
+ else
+ m = snd_pcm_writei (pcm_handle, b->data+n, l);
if (m > 0)
{