Commit graph

14 commits

Author SHA1 Message Date
Timo Wischer
b420056604 pcm: interval: Interpret (x x+1] correctly and return x+1
Without this change an interval of (x x+1] will be interpreted as an
empty interval but the right value would be x+1.
This leads to a failing snd_pcm_hw_params() call which returns -EINVAL.

An example issue log is given in the following:
snd_pcm_hw_params failed with err -22 (Invalid argument)
ACCESS: MMAP_NONINTERLEAVED
FORMAT: S16_LE
SUBFORMAT: STD
SAMPLE_BITS: 16
FRAME_BITS: 16
CHANNELS: 1
RATE: 16000
PERIOD_TIME: (15999 16000]
PERIOD_SIZE: (255 256]
PERIOD_BYTES: (510 512]
PERIODS: [2 3)
BUFFER_TIME: 32000
BUFFER_SIZE: 512
BUFFER_BYTES: 1024

In case of (x x+1) we have to interpret it anyway as a single value of x to
compensate rounding issues.
For example the period size will result in an interval of (352 353) when
the period time is 16ms and the sample rate 22050 Hz
(16ms * 22,05 kHz = 352,8 frames). But 352 has to be chosen to allow a
buffer size of 705 (32ms * 22,05 kHz = 705,6 frames) which has to be >= 2x
period size to avoid Xruns. The buffer size will not end up with an
interval of (705 706) simular to the period size because
snd_pcm_rate_hw_refine_cchange() calls snd_interval_floor() for the buffer
size. Therefore this value will be interpreted as an integer interval
instead of a real interval further on.

This issue seems to exist since the change of 9bb985c38 ("pcm:
snd_interval_refine_first/last: exclude value only if also excluded
before")

Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2018-10-24 12:07:33 +02:00
Jaroslav Kysela
5b9041bced Change FSF address (Franklin Street)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
2017-11-14 14:29:26 +01:00
Jaroslav Kysela
f40c238a41 Added snd_interval_set_min_max()... 2003-02-17 10:21:24 +00:00
Jaroslav Kysela
dac0626b9f Added snd_pcm_hw_params_current() function and clear() functions for structures 2002-10-12 10:38:43 +00:00
Jaroslav Kysela
3e3df2d32b Updated GNU GPL license (address).
Changed GNU LGPL licence from 2.0 to 2.1.
2001-12-30 09:22:54 +00:00
Abramo Bagnara
5b50ec848a Lot of cleanings with the help of gcc3 2001-03-29 17:50:28 +00:00
Abramo Bagnara
de19407578 Removed card type from devices info. Added card number to devices info. Completed encapsulation of PCM API. Removed snd_pcm_card(). All copy functions now have the form copy(dst, src). 2001-01-31 17:26:56 +00:00
Abramo Bagnara
8712ffc6a5 Added snd_ prefix to mask and interval. Divided header.h wrappers 2001-01-30 16:51:26 +00:00
Abramo Bagnara
199452ae8b buffer_size weak link fixed 2001-01-19 18:28:50 +00:00
Abramo Bagnara
d41c210493 Added _snd_pcm_hw_param_setempty 2001-01-19 16:19:29 +00:00
Abramo Bagnara
cc90e32557 New PCM model with fragment concept removal and two interrupt sources
Renamed size_t/ssize_t to snd_pcm_sframes_t/snd_pcm_uframes_t
2001-01-15 11:06:53 +00:00
Abramo Bagnara
8f1b27dfb8 PCM API cleaning. silencing implementation. xfer_min removal 2000-12-29 15:00:53 +00:00
Abramo Bagnara
80c3adaace Little cleaning of interval code 2000-12-23 10:14:15 +00:00
Abramo Bagnara
8dd927e97f New hw_params implementation 2000-12-21 20:44:10 +00:00