[alsa-devel] [PATCH] alsa-libs: initialize pcm_dmix monotonic field

Takashi Iwai tiwai at suse.de
Thu Jan 23 09:48:46 CET 2014


At Wed, 22 Jan 2014 19:04:45 -0500,
Olivier Langlois wrote:
> 
> not doing so, leaves the pcm object in an inconsistent state since
> 'info' field is copied from the slave which is then used when
> snd_pcm_hw_params_is_monotonic() is called.
> 
> For instance, when using dmix with aplay and an underrun is occuring, the following
> info is returned:
> 
> underrun!!! (at least 1248687948.256 ms long)
> Status:
>   state       : XRUN
>   trigger_time: 1390347762.628483000
>   tstamp      : 1390347766.184350000
>   delay       : -635
>   avail       : 15687
>   avail_max   : 15675
> 
> now is computed from CLOCK_MONOTONIC while pcm status tstamps are from gettimeofday().
> 
> After the fix, underruns are still occuring on my setup but at least the displayed info
> is correct:
> 
> underrun!!! (at least 7630.409 ms long)
> Status:
>   state       : XRUN
>   trigger_time: 7652.739201431
>   tstamp      : 7660.369600636
>   delay       : -624
>   avail       : 15676
>   avail_max   : 15664
> 
> Signed-off-by: Olivier Langlois <olivier at trillion01.com>

Applied, thanks.

(And I fixed dshare and dsnoop as well in another patch.)


Takashi

> ---
>  src/pcm/pcm_direct.c | 2 ++
>  src/pcm/pcm_dmix.c   | 2 +-
>  2 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
> index 899c250..5416cf7 100644
> --- a/src/pcm/pcm_direct.c
> +++ b/src/pcm/pcm_direct.c
> @@ -857,6 +857,7 @@ static void save_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
>  	COPY_SLAVE(buffer_time);
>  	COPY_SLAVE(sample_bits);
>  	COPY_SLAVE(frame_bits);
> +	COPY_SLAVE(monotonic);
>  }
>  
>  #undef COPY_SLAVE
> @@ -1220,6 +1221,7 @@ static void copy_slave_setting(snd_pcm_direct_t *dmix, snd_pcm_t *spcm)
>  	COPY_SLAVE(buffer_time);
>  	COPY_SLAVE(sample_bits);
>  	COPY_SLAVE(frame_bits);
> +	COPY_SLAVE(monotonic);
>  
>  	spcm->info &= ~SND_PCM_INFO_PAUSE;
>  	spcm->boundary = recalc_boundary_size(dmix->shmptr->s.boundary, spcm->buffer_size);
> diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
> index 2bd5d39..4aa6d4e 100644
> --- a/src/pcm/pcm_dmix.c
> +++ b/src/pcm/pcm_dmix.c
> @@ -1104,7 +1104,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
>  		
>  	pcm->poll_fd = dmix->poll_fd;
>  	pcm->poll_events = POLLIN;	/* it's different than other plugins */
> -		
> +	pcm->monotonic = spcm->monotonic;
>  	pcm->mmap_rw = 1;
>  	snd_pcm_set_hw_ptr(pcm, &dmix->hw_ptr, -1, 0);
>  	snd_pcm_set_appl_ptr(pcm, &dmix->appl_ptr, -1, 0);
> -- 
> 1.8.5.3
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list