Avoid failing if ALSA can't set a buffer or period time near to our request

These functions should not fail, but there seem to be bugs that cause them to
sometimes. We're flexible enough to handle almost anything it throws back at us
though, so anything is better than nothing here.
This commit is contained in:
Chris Robinson
2012-06-16 23:02:59 -07:00
parent 90ca6675c2
commit 051195a991
+2 -21
View File
@@ -763,29 +763,10 @@ static ALCboolean alsa_reset_playback(ALCdevice *device)
CHECK(snd_pcm_hw_params_set_rate_near(data->pcmHandle, hp, &rate, NULL));
/* set buffer time (implicitly constrains period/buffer parameters) */
if(snd_pcm_hw_params_set_buffer_time_near(data->pcmHandle, hp, &bufferLen, NULL) < 0)
{
unsigned int mintime, maxtime;
CHECK(snd_pcm_hw_params_get_buffer_time_min(hp, &mintime, NULL));
CHECK(snd_pcm_hw_params_get_buffer_time_max(hp, &maxtime, NULL));
TRACE("Failed to set %uus buffer time, detected range: %u -> %u\n", bufferLen, mintime, maxtime);
bufferLen = clampu(bufferLen, mintime, maxtime);
periodLen = minu(periodLen, bufferLen/2);
CHECK(snd_pcm_hw_params_set_buffer_time_near(data->pcmHandle, hp, &bufferLen, NULL));
}
ERR("snd_pcm_hw_params_set_buffer_time_near failed: %s\n", snd_strerror(err));
/* set period time (implicitly sets buffer size/bytes/time and period size/bytes) */
if(snd_pcm_hw_params_set_period_time_near(data->pcmHandle, hp, &periodLen, NULL) < 0)
{
unsigned int mintime, maxtime;
CHECK(snd_pcm_hw_params_get_period_time_min(hp, &mintime, NULL));
CHECK(snd_pcm_hw_params_get_period_time_max(hp, &maxtime, NULL));
TRACE("Failed to set %uus period time, detected range: %u -> %u\n", periodLen, mintime, maxtime);
periodLen = clampu(periodLen, mintime, maxtime);
CHECK(snd_pcm_hw_params_set_period_time_near(data->pcmHandle, hp, &periodLen, NULL));
}
ERR("snd_pcm_hw_params_set_period_time_near failed: %s\n", snd_strerror(err));
/* install and prepare hardware configuration */
CHECK(snd_pcm_hw_params(data->pcmHandle, hp));
/* retrieve configuration info */