if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
                plugin = snd_pcm_plug_last(plug);
                while (plugin && drv_frames > 0) {
-                       if (check_size && drv_frames > plugin->buf_frames)
-                               drv_frames = plugin->buf_frames;
                        plugin_prev = plugin->prev;
                        if (plugin->src_frames)
                                drv_frames = plugin->src_frames(plugin, drv_frames);
+                       if (check_size && plugin->buf_frames &&
+                           drv_frames > plugin->buf_frames)
+                               drv_frames = plugin->buf_frames;
                        plugin = plugin_prev;
                }
        } else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
                plugin = snd_pcm_plug_first(plug);
                while (plugin && drv_frames > 0) {
                        plugin_next = plugin->next;
+                       if (check_size && plugin->buf_frames &&
+                           drv_frames > plugin->buf_frames)
+                               drv_frames = plugin->buf_frames;
                        if (plugin->dst_frames)
                                drv_frames = plugin->dst_frames(plugin, drv_frames);
-                       if (check_size && drv_frames > plugin->buf_frames)
-                               drv_frames = plugin->buf_frames;
                        plugin = plugin_next;
                }
        } else
                plugin = snd_pcm_plug_first(plug);
                while (plugin && frames > 0) {
                        plugin_next = plugin->next;
+                       if (check_size && plugin->buf_frames &&
+                           frames > plugin->buf_frames)
+                               frames = plugin->buf_frames;
                        if (plugin->dst_frames) {
                                frames = plugin->dst_frames(plugin, frames);
                                if (frames < 0)
                                        return frames;
                        }
-                       if (check_size && frames > plugin->buf_frames)
-                               frames = plugin->buf_frames;
                        plugin = plugin_next;
                }
        } else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
                plugin = snd_pcm_plug_last(plug);
                while (plugin) {
-                       if (check_size && frames > plugin->buf_frames)
-                               frames = plugin->buf_frames;
                        plugin_prev = plugin->prev;
                        if (plugin->src_frames) {
                                frames = plugin->src_frames(plugin, frames);
                                if (frames < 0)
                                        return frames;
                        }
+                       if (check_size && plugin->buf_frames &&
+                           frames > plugin->buf_frames)
+                               frames = plugin->buf_frames;
                        plugin = plugin_prev;
                }
        } else