[alsa-devel] how is 'dir' in snd_pcm_hw_params_set_periods_near() supposed to work?
clemens at ladisch.de
Tue Sep 9 10:02:15 CEST 2008
Lennart Poettering wrote:
> How is the 'dir' argument in snd_pcm_hw_params_set_periods_near()
> supposed to work?
Short answer: use NULL.
Long answer: Before calling the function, -1 means that the number of
periods must be less than 'val', 1 means greater. After calling the
function, 'dir' is set to -1 to indicate that the actual number of
periods is less than 'val', etc.
> I'd assume that passing dir=1 would mean that it is looked for a
> number of periods that is greater *or equal* to what we request. [...]
> The docs don't really elaborate on this much.
While the docs don't really elaborate on anything, for any ALSA
function, in this case they actually say "<" and not "<=".
> I'd certainly think that having ">=" and "<=" here is much more useful
> and natural than ">" and "<", and hence I was wondering: is this just
> a bug in the software or is it really intended to be this way?
In the configuration space, parameters like the number of periods are
represented as an interval, i.e., as a minimum and a maximum value.
Since it is possible to have values that are not integers (e.g., buffer
size = 1000, period size = 400 => number of periods = 2.5), both bounds
of the interval can be 'open', i.e., the respective boundary value does
not belong the the interval. In the above example, the minimum would be
2 and the maximum 3, with both values themselves excluded.
It is not very useful to set the 'dir' parameter before calling
snd_pcm_hw_params_set_periods_near(); if you don't want an exact value,
you're more likely to set an interval with *_set_*_min() and *_max()
The 'dir' parameter is useful to determine, after the call, that the
value is not an integer. In this case, <= or >= would not make sense.
More information about the Alsa-devel