[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: kdemultimedia/akode/plugins/alsa_sink
From: Allan Sandfeld Jensen <kde () carewolf ! com>
Date: 2005-01-09 18:44:49
Message-ID: 20050109184449.BC7B8191C4 () office ! kde ! org
[Download RAW message or body]
CVS commit by carewolf:
Better state handling. Avoids initial XRUN.
M +13 -10 alsa_sink.cpp 1.12
--- kdemultimedia/akode/plugins/alsa_sink/alsa_sink.cpp #1.11:1.12
@@ -32,5 +32,5 @@ extern "C" { ALSASinkPlugin alsa_sink; }
struct ALSASink::private_data
{
- private_data() : pcm_playback(0), open(false), error(false) {};
+ private_data() : pcm_playback(0), error(false) {};
snd_pcm_t *pcm_playback;
@@ -41,5 +41,4 @@ struct ALSASink::private_data
int sampleSize;
void* buffer;
- bool open;
bool error;
};
@@ -78,5 +77,4 @@ void ALSASink::close()
}
m_data->pcm_playback = 0;
- m_data->open = false;
m_data->error = false;
}
@@ -110,4 +108,5 @@ int ALSASink::setAudioConfiguration(cons
// Try 16bit then
m_data->config.sample_width = 16;
+ res = 1;
}
if (m_data->config.sample_width > 24 && m_data->config.sample_width <=32) {
@@ -119,4 +118,5 @@ int ALSASink::setAudioConfiguration(cons
// Try 24bit then
m_data->config.sample_width = 24;
+ res = 1;
}
if (m_data->config.sample_width > 16 && m_data->config.sample_width <= 24) {
@@ -150,5 +150,8 @@ found_format:
unsigned int rate = config->sample_rate;
snd_pcm_hw_params_set_rate_near(m_data->pcm_playback, hw, &rate, 0);
+ if (m_data->config.sample_rate != rate) {
m_data->config.sample_rate = rate;
+ res = 1;
+ }
snd_pcm_hw_params_set_channels(m_data->pcm_playback, hw, config->channels);
@@ -163,5 +166,5 @@ found_format:
}
else
- return 1;
+ return res;
}
@@ -186,5 +189,4 @@ void ALSASink::_writeFrame(AudioFrame* f
if (status == -EPIPE) {
snd_pcm_prepare(m_data->pcm_playback);
- snd_pcm_start(m_data->pcm_playback);
goto xrun;
}
@@ -198,4 +200,8 @@ void ALSASink::_writeFrame(AudioFrame* f
i++;
}
+
+ if (snd_pcm_state( m_data->pcm_playback ) == SND_PCM_STATE_PREPARED)
+ snd_pcm_start(m_data->pcm_playback);
+
}
@@ -212,9 +218,6 @@ bool ALSASink::writeFrame(AudioFrame* fr
}
- if (!m_data->open) {
+ if (snd_pcm_state( m_data->pcm_playback ) == SND_PCM_STATE_SETUP)
snd_pcm_prepare(m_data->pcm_playback);
- snd_pcm_start(m_data->pcm_playback);
- m_data->open = true;
- }
if (frame->sample_width<0)
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic