diff mbox

[alsa-lib] pcm: fix snd_pcm_mmap_hw_avail() near the boundary

Message ID 1409502227-4505-1-git-send-email-patrakov@gmail.com (mailing list archive)
State Accepted
Delegated to: Takashi Iwai
Headers show

Commit Message

Alexander Patrakov Aug. 31, 2014, 4:23 p.m. UTC
This function returned incorrect results when hw.ptr was near the
boundary and hw.appl_ptr was near zero. Here "incorrect" means "greater
than the boundary".

The result was incorrect, because it was used as a return value of
various *_rewindable() functions and also as the delay for ioplug.

Signed-off-by: Alexander E. Patrakov <patrakov@gmail.com>
---
 src/pcm/pcm_local.h | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

Comments

Takashi Iwai Sept. 1, 2014, 1:29 p.m. UTC | #1
At Sun, 31 Aug 2014 22:23:47 +0600,
Alexander E. Patrakov wrote:
> 
> This function returned incorrect results when hw.ptr was near the
> boundary and hw.appl_ptr was near zero. Here "incorrect" means "greater
> than the boundary".
> 
> The result was incorrect, because it was used as a return value of
> various *_rewindable() functions and also as the delay for ioplug.
> 
> Signed-off-by: Alexander E. Patrakov <patrakov@gmail.com>

Hrm, the very early version of snd_pcm_mmap_hw_avail() was correctly
implemented:

static inline ssize_t snd_pcm_mmap_hw_avail(snd_pcm_t *pcm)
{
       if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
               return snd_pcm_mmap_playback_hw_avail(pcm);
       else
               return snd_pcm_mmap_capture_hw_avail(pcm);
}

Since the commit 9a435c2d934a, the breakage was introduced there.
I have no idea what and why this was done so, it's a really old commit
more than a decade ago.

In anyway, your fix look good and simple, so I applied it as is now,
instead of reverting to the old version above.

BTW, at the next done, don't forget to put maintainers to Cc.


thanks,

Takashi

> ---
>  src/pcm/pcm_local.h | 8 +-------
>  1 file changed, 1 insertion(+), 7 deletions(-)
> 
> diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
> index 80bbe59..74ebd60 100644
> --- a/src/pcm/pcm_local.h
> +++ b/src/pcm/pcm_local.h
> @@ -461,13 +461,7 @@ static inline snd_pcm_sframes_t snd_pcm_mmap_capture_hw_avail(snd_pcm_t *pcm)
>  
>  static inline snd_pcm_sframes_t snd_pcm_mmap_hw_avail(snd_pcm_t *pcm)
>  {
> -	snd_pcm_sframes_t avail;
> -	avail = *pcm->hw.ptr - *pcm->appl.ptr;
> -	if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
> -		avail += pcm->buffer_size;
> -	if (avail < 0)
> -		avail += pcm->boundary;
> -	return pcm->buffer_size - avail;
> +	return pcm->buffer_size - snd_pcm_mmap_avail(pcm);
>  }
>  
>  static inline const snd_pcm_channel_area_t *snd_pcm_mmap_areas(snd_pcm_t *pcm)
> -- 
> 2.1.0
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
diff mbox

Patch

diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
index 80bbe59..74ebd60 100644
--- a/src/pcm/pcm_local.h
+++ b/src/pcm/pcm_local.h
@@ -461,13 +461,7 @@  static inline snd_pcm_sframes_t snd_pcm_mmap_capture_hw_avail(snd_pcm_t *pcm)
 
 static inline snd_pcm_sframes_t snd_pcm_mmap_hw_avail(snd_pcm_t *pcm)
 {
-	snd_pcm_sframes_t avail;
-	avail = *pcm->hw.ptr - *pcm->appl.ptr;
-	if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
-		avail += pcm->buffer_size;
-	if (avail < 0)
-		avail += pcm->boundary;
-	return pcm->buffer_size - avail;
+	return pcm->buffer_size - snd_pcm_mmap_avail(pcm);
 }
 
 static inline const snd_pcm_channel_area_t *snd_pcm_mmap_areas(snd_pcm_t *pcm)