]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: file: use snd_pcm_file_areas_read_infile for readi
authorAdam Miartus <amiartus@de.adit-jv.com>
Tue, 21 May 2019 13:33:08 +0000 (15:33 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 22 May 2019 14:20:26 +0000 (16:20 +0200)
use previously introduced helper function, this commit unifies behavior
of readi and readn

corner case behavior of readi is changed by this commit, previously,
in case 0 bytes were red from file (EOF), frames = 0 was returned,
signaling api user as if no data was red from slave, after the patch,
amount of frames red from slave with data red from slave stored in buffer
is returned when EOF is reached

Signed-off-by: Adam Miartus <amiartus@de.adit-jv.com>
Reviewed-by: Timo Wischer <twischer@de.adit-jv.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_file.c

index 3c682659d5ec6c5fecdd0621cc0bfb4e05bdd05c..dcaa41d10e35eff00937582b92cedc711df48c26 100644 (file)
@@ -579,22 +579,21 @@ static snd_pcm_sframes_t snd_pcm_file_readi(snd_pcm_t *pcm, void *buffer, snd_pc
 {
        snd_pcm_file_t *file = pcm->private_data;
        snd_pcm_channel_area_t areas[pcm->channels];
-       snd_pcm_sframes_t n;
+       snd_pcm_sframes_t frames;
+
+       __snd_pcm_lock(pcm);
+
+       frames = _snd_pcm_readi(file->gen.slave, buffer, size);
+       if (frames <= 0)
+               return frames;
 
-       n = _snd_pcm_readi(file->gen.slave, buffer, size);
-       if (n <= 0)
-               return n;
-       if (file->ifd >= 0) {
-               __snd_pcm_lock(pcm);
-               n = read(file->ifd, buffer, n * pcm->frame_bits / 8);
-               __snd_pcm_unlock(pcm);
-               if (n < 0)
-                       return n;
-               n = n * 8 / pcm->frame_bits;
-       }
        snd_pcm_areas_from_buf(pcm, areas, buffer);
-       snd_pcm_file_add_frames(pcm, areas, 0, n);
-       return n;
+       snd_pcm_file_areas_read_infile(pcm, areas, 0, frames);
+       snd_pcm_file_add_frames(pcm, areas, 0, frames);
+
+       __snd_pcm_unlock(pcm);
+
+       return frames;
 }
 
 /* locking */