From 74460d2e8b2363bb002087c8e916287f9855ab8b Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Tue, 20 Dec 2005 10:26:53 +0000
Subject: [PATCH] Fix choppy audio with > 20ms audio frames (bug #5697)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7542 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_meetme.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index fb5f660ea3..2c7970bb79 100644
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -263,14 +263,17 @@ static char *istalking(int x)
 		return "(not talking)";
 }
 
-static int careful_write(int fd, unsigned char *data, int len)
+static int careful_write(int fd, unsigned char *data, int len, int block)
 {
 	int res;
 	int x;
 
 	while (len) {
-		x = ZT_IOMUX_WRITE | ZT_IOMUX_SIGEVENT;
-		res = ioctl(fd, ZT_IOMUX, &x);
+		if (block) {
+			x = ZT_IOMUX_WRITE | ZT_IOMUX_SIGEVENT;
+			res = ioctl(fd, ZT_IOMUX, &x);
+		} else
+			res = 0;
 		if (res >= 0)
 			res = write(fd, data, len);
 		if (res < 1) {
@@ -423,7 +426,7 @@ static void conf_play(struct ast_channel *chan, struct ast_conference *conf, int
 		len = 0;
 	}
 	if (data) 
-		careful_write(conf->fd, data, len);
+		careful_write(conf->fd, data, len, 1);
 
 	ast_mutex_unlock(&conflock);
 
@@ -1308,7 +1311,11 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
 						   audio frames (in which case carefully writing would only
 						   have delayed the audio even further).
 						*/
-						write(fd, f->data, f->datalen);
+						/* As it turns out, we do want to use careful write.  We just
+						   don't want to block, but we do want to at least *try*
+						   to write out all the samples.
+						 */
+						careful_write(fd, f->data, f->datalen, 0);
 					}
 				} else if ((f->frametype == AST_FRAME_DTMF) && (confflags & CONFFLAG_EXIT_CONTEXT)) {
 					char tmp[2];
-- 
GitLab