[alsa-devel] what is exactly pcm.boundary?
Takashi Sakamoto
o-takashi at sakamocchi.jp
Thu Jan 5 21:36:01 CET 2017
Hi,
On Jan 6 2017 03:10, Ricardo Biehl wrote:
> Well, in src/pcm/pcm_local.h line ~469:
>
> 1 static inline snd_pcm_uframes_t snd_pcm_mmap_playback_avail(snd_pcm_t *pcm)
> 2 {
> 3 snd_pcm_sframes_t avail;
> 4 avail = *pcm->hw.ptr + pcm->buffer_size - *pcm->appl.ptr;
> 5 if (avail < 0)
> 6 avail += pcm->boundary;
> 7 else if ((snd_pcm_uframes_t) avail >= pcm->boundary)
> 8 avail -= pcm->boundary;
> 9 return avail;
> 10 }
>
> First, I assumed that both hw_ptr and appl_ptr always points to addresses inside
> a REGION of memory that is exactly the size of buffer = (period_size * periods).
No. Both of the 'appl_ptr' and 'hw_ptr' is not within the size of
buffer. They round up to the size of boundary. The size of boundary is
calculated in these lines.
https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/sound/core/pcm_native.c?h=v4.10-rc2#n590
590 while (runtime->boundary * 2 <= LONG_MAX - runtime->buffer_size)
591 runtime->boundary *= 2;
You can also see current value of the boundary in PCM substream via
procfs, like:
$ cat /proc/asound/card0/pcm0p/sub0/sw_params
tstamp_mode: ENABLE
period_step: 1
avail_min: 1088
start_threshold: 18446744073709551615
stop_threshold: 4971973988617027584
silence_threshold: 0
silence_size: 0
boundary: 4971973988617027584
You can see it's not the size of allocated memory because it's quite large.
The size of boundary is always multiple of the size of period in
intermediate buffer for user space, up to UINT_MAX. Both of 'hw_ptr' and
'appl_ptr' means total number of processed PCM frames in current PCM
substream. They're not directly related to dedicated buffer for data
transmission.
Regards
Takashi Sakamoto
More information about the Alsa-devel
mailing list