aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Output/alsa
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-04-04 10:39:13 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2009-04-04 10:39:13 +0000
commitc685eb34a9657ab6788c8e785936b0bfe0bc7cfc (patch)
tree646cea5b81bee187b83b487a9c33bfcd714d474b /src/plugins/Output/alsa
parent2f05ffcee8b6fee8c0a18adc9137fa7b45d7f658 (diff)
downloadqmmp-c685eb34a9657ab6788c8e785936b0bfe0bc7cfc.tar.gz
qmmp-c685eb34a9657ab6788c8e785936b0bfe0bc7cfc.tar.bz2
qmmp-c685eb34a9657ab6788c8e785936b0bfe0bc7cfc.zip
alsa plugin: added hard restart
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@890 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Output/alsa')
-rw-r--r--src/plugins/Output/alsa/outputalsa.cpp10
-rw-r--r--src/plugins/Output/alsa/outputalsa.h1
2 files changed, 8 insertions, 3 deletions
diff --git a/src/plugins/Output/alsa/outputalsa.cpp b/src/plugins/Output/alsa/outputalsa.cpp
index 6ed462e16..da361c0bd 100644
--- a/src/plugins/Output/alsa/outputalsa.cpp
+++ b/src/plugins/Output/alsa/outputalsa.cpp
@@ -49,6 +49,7 @@ OutputALSA::OutputALSA(QObject * parent)
m_prebuf_size = 0;
m_prebuf_fill = 0;
m_pause = FALSE;
+ m_can_pause = FALSE;
}
OutputALSA::~OutputALSA()
@@ -182,7 +183,8 @@ void OutputALSA::configure(quint32 freq, int chan, int prec)
//setup needed values
m_bits_per_frame = snd_pcm_format_physical_width(format) * chan;
m_chunk_size = period_size;
- //}
+ m_can_pause = snd_pcm_hw_params_can_pause(hwparams);
+ qDebug("OutputALSA: can pause: %d", m_can_pause);
Output::configure(freq, chan, prec); //apply configuration
//create alsa prebuffer;
m_prebuf_size = Buffer::size() + m_bits_per_frame * m_chunk_size / 8;
@@ -229,7 +231,9 @@ qint64 OutputALSA::latency()
void OutputALSA::pause()
{
m_pause = !m_pause;
- if (m_pause && pcm_handle)
+ if (m_can_pause)
+ snd_pcm_pause(pcm_handle, m_pause);
+ else if (m_pause && pcm_handle)
{
snd_pcm_drop(pcm_handle);
snd_pcm_prepare(pcm_handle);
@@ -345,7 +349,7 @@ long OutputALSA::alsa_write(unsigned char *data, long size)
return 0;
}
qDebug ("OutputALSA: error: %s", snd_strerror(m));
- return -1;
+ return snd_pcm_prepare (pcm_handle);
}
void OutputALSA::uninitialize()
diff --git a/src/plugins/Output/alsa/outputalsa.h b/src/plugins/Output/alsa/outputalsa.h
index 9b8118dda..b3dc92a68 100644
--- a/src/plugins/Output/alsa/outputalsa.h
+++ b/src/plugins/Output/alsa/outputalsa.h
@@ -68,6 +68,7 @@ private:
qint64 m_prebuf_size;
qint64 m_prebuf_fill;
bool m_pause;
+ bool m_can_pause;
};
class VolumeControlALSA : public VolumeControl