mirror of
https://github.com/badaix/snapcast.git
synced 2025-08-06 10:09:33 +02:00
Use period frames if avail < 0
This commit is contained in:
parent
3ac9245d00
commit
eadba70c9a
2 changed files with 35 additions and 27 deletions
|
@ -465,6 +465,35 @@ bool AlsaPlayer::needsThread() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AlsaPlayer::getAvailDelay(snd_pcm_sframes_t& avail, snd_pcm_sframes_t& delay)
|
||||||
|
{
|
||||||
|
int result = snd_pcm_avail_delay(handle_, &avail, &delay);
|
||||||
|
if (result < 0)
|
||||||
|
{
|
||||||
|
LOG(WARNING, LOG_TAG) << "snd_pcm_avail_delay failed: " << snd_strerror(result) << ", avail: " << avail << ", delay: " << delay
|
||||||
|
<< ", using snd_pcm_avail amd snd_pcm_delay.\n";
|
||||||
|
this_thread::sleep_for(1ms);
|
||||||
|
avail = snd_pcm_avail(handle_);
|
||||||
|
result = snd_pcm_delay(handle_, &delay);
|
||||||
|
if ((result < 0) || (delay < 0))
|
||||||
|
{
|
||||||
|
LOG(WARNING, LOG_TAG) << "snd_pcm_avail and snd_pcm_delay failed: " << snd_strerror(result) << ", avail: " << avail << ", delay: " << delay << "\n";
|
||||||
|
this_thread::sleep_for(10ms);
|
||||||
|
snd_pcm_prepare(handle_);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (avail < 0)
|
||||||
|
{
|
||||||
|
LOG(DEBUG, LOG_TAG) << "snd_pcm_avail < 0: " << avail << ", using " << frames_ << "\n";
|
||||||
|
avail = frames_;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void AlsaPlayer::worker()
|
void AlsaPlayer::worker()
|
||||||
{
|
{
|
||||||
snd_pcm_sframes_t pcm;
|
snd_pcm_sframes_t pcm;
|
||||||
|
@ -509,38 +538,16 @@ void AlsaPlayer::worker()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int result = snd_pcm_avail_delay(handle_, &framesAvail, &framesDelay);
|
if (!getAvailDelay(framesAvail, framesDelay))
|
||||||
if (result < 0)
|
|
||||||
{
|
{
|
||||||
// if (result == -EPIPE)
|
this_thread::sleep_for(10ms);
|
||||||
// snd_pcm_prepare(handle_);
|
snd_pcm_prepare(handle_);
|
||||||
// else
|
continue;
|
||||||
// uninitAlsa();
|
|
||||||
LOG(WARNING, LOG_TAG) << "snd_pcm_avail_delay failed: " << snd_strerror(result) << ", avail: " << framesAvail << ", delay: " << framesDelay
|
|
||||||
<< ", retrying.\n";
|
|
||||||
this_thread::sleep_for(5ms);
|
|
||||||
int result = snd_pcm_avail_delay(handle_, &framesAvail, &framesDelay);
|
|
||||||
if (result < 0)
|
|
||||||
{
|
|
||||||
this_thread::sleep_for(5ms);
|
|
||||||
LOG(WARNING, LOG_TAG) << "snd_pcm_avail_delay failed again: " << snd_strerror(result) << ", avail: " << framesAvail
|
|
||||||
<< ", delay: " << framesDelay << ", using snd_pcm_avail and snd_pcm_delay.\n";
|
|
||||||
framesAvail = snd_pcm_avail(handle_);
|
|
||||||
result = snd_pcm_delay(handle_, &framesDelay);
|
|
||||||
if ((result < 0) || (framesAvail <= 0) || (framesDelay <= 0))
|
|
||||||
{
|
|
||||||
LOG(WARNING, LOG_TAG) << "snd_pcm_avail and snd_pcm_delay failed: " << snd_strerror(result) << ", avail: " << framesAvail
|
|
||||||
<< ", delay: " << framesDelay << "\n";
|
|
||||||
this_thread::sleep_for(10ms);
|
|
||||||
snd_pcm_prepare(handle_);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (framesAvail < static_cast<snd_pcm_sframes_t>(frames_))
|
if (framesAvail < static_cast<snd_pcm_sframes_t>(frames_))
|
||||||
{
|
{
|
||||||
this_thread::sleep_for(10ms);
|
this_thread::sleep_for(5ms);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,7 @@ private:
|
||||||
/// free alsa and optionally the mixer
|
/// free alsa and optionally the mixer
|
||||||
/// @param uninit_mixer free the mixer
|
/// @param uninit_mixer free the mixer
|
||||||
void uninitAlsa(bool uninit_mixer);
|
void uninitAlsa(bool uninit_mixer);
|
||||||
|
bool getAvailDelay(snd_pcm_sframes_t& avail, snd_pcm_sframes_t& delay);
|
||||||
|
|
||||||
void initMixer();
|
void initMixer();
|
||||||
void uninitMixer();
|
void uninitMixer();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue