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