if (avail > runtime->buffer_size)
                                avail = runtime->buffer_size;
                        runtime->silence_filled = avail > 0 ? avail : 0;
-                       runtime->silence_start = (runtime->status->hw_ptr +
-                                                 runtime->silence_filled) %
-                                                runtime->boundary;
+                       runtime->silence_start = runtime->status->hw_ptr;
                } else {
                        ofs = runtime->status->hw_ptr;
                        frames = new_hw_ptr - ofs;
                        runtime->silence_filled -= frames;
                        if ((snd_pcm_sframes_t)runtime->silence_filled < 0) {
                                runtime->silence_filled = 0;
-                               runtime->silence_start = new_hw_ptr;
-                       } else {
-                               runtime->silence_start = ofs;
                        }
+                       runtime->silence_start = new_hw_ptr;
                }
                frames = runtime->buffer_size - runtime->silence_filled;
        }
                return;
        if (frames == 0)
                return;
-       ofs = runtime->silence_start % runtime->buffer_size;
+       ofs = (runtime->silence_start + runtime->silence_filled) % runtime->buffer_size;
        while (frames > 0) {
                transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames;
                err = fill_silence_frames(substream, ofs, transfer);