aplay: pcm_readv(): return read samples instead of requested upon abort

This patch changes the logic of pcm_readv() when abort signal has been
detected. During such condition we should return the amount of frames
actually read instead of the size requested by caller.

Currently functions pcm_read() and pcm_readv() when aborted (in_aborting
flag set) return the amount of requested frames instead of those actually
read prior to interrupt. The consequence of this is repetition of recent X
frames where X stands for amount of frames in one period. This problem is
barely visible or rather audible when the period is small like few
milliseconds because repetition of 1 [ms] of data is not-noticeable
however if we use buffer and period sizes in seconds then the problem
becomes apparent.

Example issue -> thesofproject/sof#3189

Signed-off-by: Marcin Rajwa <marcin.rajwa@linux.intel.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Marcin Rajwa 2020-08-07 15:56:05 +02:00 committed by Jaroslav Kysela
parent 8572c0c427
commit bc7a944c50

View file

@ -2174,7 +2174,9 @@ static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount)
count = chunk_size; count = chunk_size;
} }
while (count > 0 && !in_aborting) { while (count > 0) {
if (in_aborting)
goto abort;
unsigned int channel; unsigned int channel;
void *bufs[channels]; void *bufs[channels];
size_t offset = result; size_t offset = result;
@ -2206,6 +2208,7 @@ static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount)
count -= r; count -= r;
} }
} }
abort:
return rcount; return rcount;
} }