mirror of https://github.com/mpv-player/mpv
Simplify get_delay(): we don't need to get the complete PCM status but
can call snd_pcm_delay() directly. To avoid the audio device appearing to be running too fast after an underrun, ignore any samples that were lost in an underrun. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17574 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
689c7b37a2
commit
a25341464c
|
@ -1037,35 +1037,20 @@ static int get_space(void)
|
||||||
/* delay in seconds between first and last sample in buffer */
|
/* delay in seconds between first and last sample in buffer */
|
||||||
static float get_delay(void)
|
static float get_delay(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (alsa_handler) {
|
if (alsa_handler) {
|
||||||
|
snd_pcm_sframes_t delay;
|
||||||
|
|
||||||
snd_pcm_status_t *status;
|
if (snd_pcm_delay(alsa_handler, &delay) < 0)
|
||||||
float ret;
|
return 0;
|
||||||
|
|
||||||
snd_pcm_status_alloca(&status);
|
if (delay < 0) {
|
||||||
|
/* underrun - move the application pointer forward to catch up */
|
||||||
if ((ret = snd_pcm_status(alsa_handler, status)) < 0)
|
#if SND_LIB_VERSION >= 0x000901 /* snd_pcm_forward() exists since 0.9.0rc8 */
|
||||||
{
|
snd_pcm_forward(alsa_handler, -delay);
|
||||||
mp_msg(MSGT_AO,MSGL_ERR,"alsa-delay: cannot get pcm status: %s\n", snd_strerror(ret));
|
#endif
|
||||||
|
delay = 0;
|
||||||
}
|
}
|
||||||
|
return (float)delay / (float)ao_data.samplerate;
|
||||||
switch(snd_pcm_status_get_state(status))
|
|
||||||
{
|
|
||||||
case SND_PCM_STATE_OPEN:
|
|
||||||
case SND_PCM_STATE_PREPARED:
|
|
||||||
case SND_PCM_STATE_RUNNING:
|
|
||||||
ret = (float)snd_pcm_status_get_delay(status)/(float)ao_data.samplerate;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
ret = 0;
|
|
||||||
return(ret);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue