|
@@ -592,18 +592,26 @@ snd_pcm_sframes_t snd_pcm_plug_write_transfer(struct snd_pcm_substream *plug, st
|
|
|
snd_pcm_sframes_t frames = size;
|
|
|
|
|
|
plugin = snd_pcm_plug_first(plug);
|
|
|
- while (plugin && frames > 0) {
|
|
|
+ while (plugin) {
|
|
|
+ if (frames <= 0)
|
|
|
+ return frames;
|
|
|
if ((next = plugin->next) != NULL) {
|
|
|
snd_pcm_sframes_t frames1 = frames;
|
|
|
- if (plugin->dst_frames)
|
|
|
+ if (plugin->dst_frames) {
|
|
|
frames1 = plugin->dst_frames(plugin, frames);
|
|
|
+ if (frames1 <= 0)
|
|
|
+ return frames1;
|
|
|
+ }
|
|
|
if ((err = next->client_channels(next, frames1, &dst_channels)) < 0) {
|
|
|
return err;
|
|
|
}
|
|
|
if (err != frames1) {
|
|
|
frames = err;
|
|
|
- if (plugin->src_frames)
|
|
|
+ if (plugin->src_frames) {
|
|
|
frames = plugin->src_frames(plugin, frames1);
|
|
|
+ if (frames <= 0)
|
|
|
+ return frames;
|
|
|
+ }
|
|
|
}
|
|
|
} else
|
|
|
dst_channels = NULL;
|