diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-06-25 13:45:40 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2008-06-25 13:45:40 +0000 |
| commit | 3202566a05ef57922379697c5192010415488d20 (patch) | |
| tree | 82de4ab0408e891890a373221569a3b98c531427 /src/plugins/Output/alsa/outputalsa.cpp | |
| parent | 32fb51e49fa811d6caf23283a5714851a57eba9c (diff) | |
| download | qmmp-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.cpp | 28 |
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) { |
