I have just downloaded alsa-lib 0.9.0rc2
alsa-lib-0.9.0rc2/src/pcm/pcm_local.h
The code below will return negative value when avail < - pcm->boundary
It may happen if appl.ptr==0 and hw.ptr+pcm->buffer_size goes from 0x7fffffff
to 0x80000000 .
static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
{
snd_pcm_sframes_t avail;
avail = *pcm->hw.ptr + pcm->buffer_size - *pcm->appl.ptr;
if (avail < 0)
avail += pcm->boundary;
else if ((snd_pcm_uframes_t) avail >= pcm->boundary)
avail -= pcm->boundary;
return avail;
}
May be the following code would be better?
static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
{
snd_pcm_sframes_t avail;
avail = *pcm->hw.ptr + pcm->buffer_size - *pcm->appl.ptr;
if (avail < 0)
avail += pcm->boundary;
if (avail < 0)
avail += pcm->boundary;
else if ((snd_pcm_uframes_t) avail >= pcm->boundary)
avail -= pcm->boundary;
return avail;
}
The solution is not as simple as I thought. There has to be a discontinuity
somewhere.
I have the following questions about the design:
1. Is hw.ptr allowed to be set by the alsa-driver >= than
boundary?
2. Is snd_pcm_mmap_playback_avail allowed to return negative number?
What is confusing is that there seems to be a protection against returning
negative values, but it does not work 100 %.
There are more functions nearby which have the same problem.
What I need is just an ((unsigned)hw.ptr)%boundary
Best regards,
--
Tomasz Motylewski
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel