Commit 23eb4c41 authored by Clément Stenac's avatar Clément Stenac

Fix handling of buffer underruns in ALSA. Probably closes #461

We passed the delay verbatim to ...frames_to_bytes function which doesn't like negative numbers.
parent 6458cddb
...@@ -818,6 +818,8 @@ static void ALSAFill( aout_instance_t * p_aout ) ...@@ -818,6 +818,8 @@ static void ALSAFill( aout_instance_t * p_aout )
/* Here the device should be either in the RUNNING state. /* Here the device should be either in the RUNNING state.
* p_status is valid. */ * p_status is valid. */
#if 0
/* This apparently does not work correctly in Alsa 1.0.11 */
snd_pcm_status_get_tstamp( p_status, &ts_next ); snd_pcm_status_get_tstamp( p_status, &ts_next );
next_date = (mtime_t)ts_next.tv_sec * 1000000 + ts_next.tv_usec; next_date = (mtime_t)ts_next.tv_sec * 1000000 + ts_next.tv_usec;
if( next_date ) if( next_date )
...@@ -826,19 +828,16 @@ static void ALSAFill( aout_instance_t * p_aout ) ...@@ -826,19 +828,16 @@ static void ALSAFill( aout_instance_t * p_aout )
* 1000000 / p_aout->output.output.i_rate; * 1000000 / p_aout->output.output.i_rate;
} }
else else
#endif
{ {
/* With screwed ALSA drivers the timestamp is always zero; /* With screwed ALSA drivers the timestamp is always zero;
* use another method then */ * use another method then */
snd_pcm_sframes_t delay; snd_pcm_sframes_t delay = 0;
ssize_t i_bytes = 0; ssize_t i_bytes = 0;
if( !snd_pcm_delay( p_sys->p_snd_pcm, &delay ) ) snd_pcm_delay( p_sys->p_snd_pcm, &delay );
{ next_date = mdate() + (mtime_t)(delay) * 1000000 /
i_bytes = snd_pcm_frames_to_bytes(p_sys->p_snd_pcm, delay); p_aout->output.output.i_rate
}
next_date = mdate() + (mtime_t)i_bytes * 1000000
/ p_aout->output.output.i_bytes_per_frame
/ p_aout->output.output.i_rate
* p_aout->output.output.i_frame_length; * p_aout->output.output.i_frame_length;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment