*  read function
  */
 
-static ssize_t pcm_read(u_char *data, size_t count)
+static ssize_t pcm_read(u_char *data, size_t rcount)
 {
        ssize_t r;
        size_t result = 0;
+       size_t count = rcount;
+
+       if (mode == SND_PCM_MODE_FRAGMENT &&
+           count != buffer_size) {
+               count = buffer_size;
+       }
 
        while (count > 0) {
                r = read_func(handle, data, count);
                        data += r * bits_per_frame / 8;
                }
        }
-       return result;
+       return rcount;
 }
 
-static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t count)
+static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount)
 {
        ssize_t r;
        size_t result = 0;
+       size_t count = rcount;
+
+       if (mode == SND_PCM_MODE_FRAGMENT &&
+           count != buffer_size) {
+               count = buffer_size;
+       }
 
        while (count > 0) {
                unsigned int channel;
                        count -= r;
                }
        }
-       return result;
+       return rcount;
 }
 
 /*