diff --git a/src/plugins/oss/ao_oss.c b/src/plugins/oss/ao_oss.c
index 164736908ce2772e7859b52c9d4754a0c373067a..c7615bb0262a9d53af1271e2aa6c205c2ddcb288 100644
--- a/src/plugins/oss/ao_oss.c
+++ b/src/plugins/oss/ao_oss.c
@@ -59,6 +59,7 @@ static ao_info ao_oss_info =
 typedef struct ao_oss_internal {
 	char *dev;
 	int fd;
+	int buf_size;
 } ao_oss_internal;
 
 
@@ -219,6 +220,16 @@ int ao_plugin_open(ao_device *device, ao_sample_format *format)
 
 	/* Now set all of the parameters */
 
+	internal->buf_size = -1;
+	if ((ioctl(internal->fd,SNDCTL_DSP_GETBLKSIZE,
+				&(internal->buf_size)) < 0) ||
+			internal->buf_size<=0 )
+	{
+		fprintf(stderr, "libao - OSS cannot get buffer size for "
+				" devince\n");
+		goto ERR;
+	}
+
 	switch (format->channels)
 	{
 	case 1: tmp = 0;
@@ -281,12 +292,23 @@ int ao_plugin_open(ao_device *device, ao_sample_format *format)
 int ao_plugin_play(ao_device *device, const char *output_samples, 
 		uint_32 num_bytes)
 {
+	int ret;
+	int send;
 	ao_oss_internal *internal = (ao_oss_internal *) device->internal;
 
-	if (write(internal->fd, output_samples, num_bytes) < 0)
-		return 0;
-	else
-		return 1;
+	while(num_bytes > 0) {
+		send = num_bytes>internal->buf_size?
+			internal->buf_size:num_bytes;
+		ret = write(internal->fd, output_samples, send);
+
+		if (ret <= 0)
+			return 0;
+
+		num_bytes-=ret;
+		output_samples+=ret;
+	}
+
+	return 1;
 }