]> git.alsa-project.org Git - alsa-lib.git/commitdiff
fixed segfault in rate conversions.
authorTakashi Iwai <tiwai@suse.de>
Fri, 8 Mar 2002 14:29:09 +0000 (14:29 +0000)
committerTakashi Iwai <tiwai@suse.de>
Fri, 8 Mar 2002 14:29:09 +0000 (14:29 +0000)
src/pcm/pcm_plugin.c

index e1d53f8c341da636b37cc0910e28e78b3235f58f..0cb60a724b185f8afca07dbc8ab2f3fc304281f9 100644 (file)
@@ -334,12 +334,19 @@ static snd_pcm_sframes_t snd_pcm_plugin_write_areas(snd_pcm_t *pcm,
                snd_atomic_write_begin(&plugin->watom);
                snd_pcm_mmap_appl_forward(pcm, frames);
                result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
+               if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
+                       snd_pcm_sframes_t res;
+                       res = plugin->undo_write(pcm, slave_areas, slave_offset + result, slave_frames, slave_frames - result);
+                       if (res < 0)
+                               return xfer > 0 ? xfer : res;
+                       frames -= res;
+               }
                snd_atomic_write_end(&plugin->watom);
                if (result <= 0)
                        return xfer > 0 ? xfer : result;
-               offset += result;
-               xfer += result;
-               size -= result;
+               offset += frames;
+               xfer += frames;
+               size -= frames;
        }
        return xfer;
 }
@@ -369,12 +376,20 @@ static snd_pcm_sframes_t snd_pcm_plugin_read_areas(snd_pcm_t *pcm,
                snd_atomic_write_begin(&plugin->watom);
                snd_pcm_mmap_appl_forward(pcm, frames);
                result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
+               if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
+                       snd_pcm_sframes_t res;
+                       
+                       res = plugin->undo_read(slave, areas, offset, frames, slave_frames - result);
+                       if (res < 0)
+                               return xfer > 0 ? xfer : res;
+                       frames -= res;
+               }
                snd_atomic_write_end(&plugin->watom);
                if (result <= 0)
                        return xfer > 0 ? xfer : result;
-               offset += result;
-               xfer += result;
-               size -= result;
+               offset += frames;
+               xfer += frames;
+               size -= frames;
        }
        return xfer;
 }