[alsa-devel] how is 'dir' in snd_pcm_hw_params_set_periods_near() supposed to work?
Heya!
How is the 'dir' argument in snd_pcm_hw_params_set_periods_near() supposed to work?
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. If we pass dir=-1 we'd be looking for a number of periods that is smaller *or equal* to what we request.
However, what I am experiencing is that there is no "or equal". On my softvol on hda setup here if I ask for 5 periods I will always get 6 if I pass dir=1 -- even if the could give me 5 and will give me five if I pass dir=0.
The docs don't really elaborate on this much.
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?
Lennart
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?
It's intended.
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() anyway.
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.
Regards, Clemens
participants (2)
-
Clemens Ladisch
-
Lennart Poettering