[Asterisk-Dev] Explicit endianness support.

David Woodhouse dwmw2 at infradead.org
Fri Mar 25 04:40:16 MST 2005


Separate patch to make channels explicitly specify the endianness of the
linear frames they produce or require.

I haven't changed chan_nbs or chan_vpb because I'm not sure if the
library we use for each works with native-endian samples or not.

Comments or alternative solutions...?

Index: rtp.c
===================================================================
RCS file: /usr/cvsroot/asterisk/rtp.c,v
retrieving revision 1.114
diff -u -r1.114 rtp.c
--- rtp.c	17 Mar 2005 23:12:15 -0000	1.114
+++ rtp.c	25 Mar 2005 11:38:28 -0000
@@ -593,7 +593,8 @@
 		case AST_FORMAT_ALAW:
 			rtp->f.samples = rtp->f.datalen;
 			break;
-		case AST_FORMAT_SLINEAR:
+		case AST_FORMAT_SLINEAR_LE:
+		case AST_FORMAT_SLINEAR_BE:
 			rtp->f.samples = rtp->f.datalen / 2;
 			break;
 		case AST_FORMAT_GSM:
@@ -654,7 +655,7 @@
   {{1, AST_FORMAT_ALAW}, "audio", "PCMA"},
   {{1, AST_FORMAT_G726}, "audio", "G726-32"},
   {{1, AST_FORMAT_ADPCM}, "audio", "DVI4"},
-  {{1, AST_FORMAT_SLINEAR}, "audio", "L16"},
+  {{1, AST_FORMAT_SLINEAR_BE}, "audio", "L16"},
   {{1, AST_FORMAT_LPC10}, "audio", "LPC"},
   {{1, AST_FORMAT_G729A}, "audio", "G729"},
   {{1, AST_FORMAT_SPEEX}, "audio", "speex"},
@@ -681,8 +682,8 @@
   [6] = {1, AST_FORMAT_ADPCM}, /* 16 kHz */
   [7] = {1, AST_FORMAT_LPC10},
   [8] = {1, AST_FORMAT_ALAW},
-  [10] = {1, AST_FORMAT_SLINEAR}, /* 2 channels */
-  [11] = {1, AST_FORMAT_SLINEAR}, /* 1 channel */
+  [10] = {1, AST_FORMAT_SLINEAR_BE}, /* 2 channels */
+  [11] = {1, AST_FORMAT_SLINEAR_BE}, /* 1 channel */
   [13] = {0, AST_RTP_CN},
   [16] = {1, AST_FORMAT_ADPCM}, /* 11.025 kHz */
   [17] = {1, AST_FORMAT_ADPCM}, /* 22.050 kHz */
@@ -1328,6 +1329,20 @@
 
 
 	switch(subclass) {
+	case AST_FORMAT_SLINEAR_LE:
+	case AST_FORMAT_SLINEAR_BE:
+		if (!rtp->smoother) {
+			rtp->smoother = ast_smoother_new(640);
+		}
+		if (!rtp->smoother) {
+			ast_log(LOG_WARNING, "Unable to create smoother :(\n");
+			return -1;
+		}
+		ast_smoother_feed(rtp->smoother, _f);
+		
+		while((f = ast_smoother_read(rtp->smoother)))
+			ast_rtp_raw_write(rtp, f, codec);
+		break;
 	case AST_FORMAT_ULAW:
 	case AST_FORMAT_ALAW:
 		if (!rtp->smoother) {
Index: channels/chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.259
diff -u -r1.259 chan_iax2.c
--- channels/chan_iax2.c	24 Mar 2005 05:02:49 -0000	1.259
+++ channels/chan_iax2.c	25 Mar 2005 11:32:21 -0000
@@ -153,7 +153,8 @@
 #define IAX_CAPABILITY_FULLBANDWIDTH 	0xFFFF
 /* T1, maybe ISDN */
 #define IAX_CAPABILITY_MEDBANDWIDTH 	(IAX_CAPABILITY_FULLBANDWIDTH & \
-									~AST_FORMAT_SLINEAR & \
+									~AST_FORMAT_SLINEAR_LE & \
+									~AST_FORMAT_SLINEAR_BE & \
 									~AST_FORMAT_ULAW & \
 									~AST_FORMAT_ALAW) 
 /* A modem */
@@ -870,7 +871,8 @@
 	case AST_FORMAT_G729A:
 		samples = 160 * (f->datalen / 20);
 		break;
-	case AST_FORMAT_SLINEAR:
+	case AST_FORMAT_SLINEAR_LE:
+	case AST_FORMAT_SLINEAR_BE:
 		samples = f->datalen / 2;
 		break;
 	case AST_FORMAT_LPC10:
Index: channels/chan_modem.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_modem.c,v
retrieving revision 1.38
diff -u -r1.38 chan_modem.c
--- channels/chan_modem.c	4 Mar 2005 06:47:24 -0000	1.38
+++ channels/chan_modem.c	25 Mar 2005 11:32:21 -0000
@@ -108,7 +108,7 @@
 static const struct ast_channel_tech modem_tech = {
 	.type = type,
 	.description = tdesc,
-	.capabilities = AST_FORMAT_SLINEAR,
+	.capabilities = AST_FORMAT_SLINEAR_LE,
 	.requester = modem_request,
 	.send_digit = modem_digit,
 	.call = modem_call,
Index: channels/chan_modem_aopen.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_modem_aopen.c,v
retrieving revision 1.13
diff -u -r1.13 chan_modem_aopen.c
--- channels/chan_modem_aopen.c	24 Jun 2004 13:27:44 -0000	1.13
+++ channels/chan_modem_aopen.c	25 Mar 2005 11:32:21 -0000
@@ -316,7 +316,7 @@
 			return f;
 		/* If we get here, we have a complete voice frame */
 		p->fr.frametype = AST_FRAME_VOICE;
-		p->fr.subclass = AST_FORMAT_SLINEAR;
+		p->fr.subclass = AST_FORMAT_SLINEAR_LE;
 		p->fr.samples = 240;
 		p->fr.data = p->obuf;
 		p->fr.datalen = p->obuflen;
@@ -436,7 +436,7 @@
 {
 	"AOpen",
 	aopen_idents,
-	AST_FORMAT_SLINEAR,
+	AST_FORMAT_SLINEAR_LE,
 	0,		/* Not full duplex */
 	aopen_incusecnt,	/* incusecnt */
 	aopen_decusecnt,	/* decusecnt */
Index: channels/chan_modem_bestdata.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_modem_bestdata.c,v
retrieving revision 1.14
diff -u -r1.14 chan_modem_bestdata.c
--- channels/chan_modem_bestdata.c	25 Feb 2005 17:32:37 -0000	1.14
+++ channels/chan_modem_bestdata.c	25 Mar 2005 11:32:21 -0000
@@ -365,7 +365,7 @@
 		if (f) return f;
 		/* If we get here, we have a complete voice frame */
 		p->fr.frametype = AST_FRAME_VOICE;
-		p->fr.subclass = AST_FORMAT_SLINEAR;
+		p->fr.subclass = AST_FORMAT_SLINEAR_LE;
 		p->fr.samples = 240;
 		p->fr.data = p->obuf;
 		p->fr.datalen = p->obuflen;
@@ -548,7 +548,7 @@
 {
 	"BestData",
 	bestdata_idents,
-	AST_FORMAT_SLINEAR,
+	AST_FORMAT_SLINEAR_LE,
 	0,		/* Not full duplex */
 	bestdata_incusecnt,	/* incusecnt */
 	bestdata_decusecnt,	/* decusecnt */
Index: channels/chan_modem_i4l.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_modem_i4l.c,v
retrieving revision 1.23
diff -u -r1.23 chan_modem_i4l.c
--- channels/chan_modem_i4l.c	24 Jan 2005 21:43:35 -0000	1.23
+++ channels/chan_modem_i4l.c	25 Mar 2005 11:32:21 -0000
@@ -435,7 +436,7 @@
 
 		/* If we get here, we have a complete voice frame */
 		p->fr.frametype = AST_FRAME_VOICE;
-		p->fr.subclass = AST_FORMAT_SLINEAR;
+		p->fr.subclass = AST_FORMAT_SLINEAR_LE;
 		p->fr.samples = 240;
 		p->fr.data = p->obuf;
 		p->fr.datalen = p->obuflen;
@@ -475,8 +499,8 @@
 		ast_log(LOG_WARNING, "Don't know how to handle %d type frames\n", f->frametype);
 		return -1;
 	}
-	if (f->subclass != AST_FORMAT_SLINEAR) {
-		ast_log(LOG_WARNING, "Don't know how to handle anything but signed linear frames\n");
+	if (f->subclass != AST_FORMAT_SLINEAR_LE) {
+		ast_log(LOG_WARNING, "Don't know how to handle anything but little-endian signed linear frames\n");
 		return -1;
 	}
 	for (x=0;x<f->datalen/2;x++) {
@@ -651,7 +675,7 @@
 {
 	"i4l",
 	i4l_idents,
-	AST_FORMAT_SLINEAR,
+	AST_FORMAT_SLINEAR_LE,
 	0,		/* Not full duplex */
 	i4l_incusecnt,	/* incusecnt */
 	i4l_decusecnt,	/* decusecnt */
Index: channels/chan_phone.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_phone.c,v
retrieving revision 1.45
diff -u -r1.45 chan_phone.c
--- channels/chan_phone.c	4 Mar 2005 06:47:24 -0000	1.45
+++ channels/chan_phone.c	25 Mar 2005 11:32:21 -0000
@@ -77,7 +77,7 @@
 
 static int silencesupression = 0;
 
-static int prefformat = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW;
+static int prefformat = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW;
 
 AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
@@ -144,7 +144,7 @@
 static const struct ast_channel_tech phone_tech = {
 	.type = type,
 	.description = tdesc,
-	.capabilities = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW,
+	.capabilities = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW,
 	.requester = phone_request,
 	.send_digit = phone_digit,
 	.call = phone_call,
@@ -341,10 +341,10 @@
 				return -1;
 			}
 		}
-	} else if (ast->rawreadformat == AST_FORMAT_SLINEAR) {
+	} else if (ast->rawreadformat == AST_FORMAT_SLINEAR_LE) {
 		ioctl(p->fd, PHONE_REC_STOP);
-		if (p->lastinput != AST_FORMAT_SLINEAR) {
-			p->lastinput = AST_FORMAT_SLINEAR;
+		if (p->lastinput != AST_FORMAT_SLINEAR_LE) {
+			p->lastinput = AST_FORMAT_SLINEAR_LE;
 			if (ioctl(p->fd, PHONE_REC_CODEC, LINEAR16)) {
 				ast_log(LOG_WARNING, "Failed to set codec to signed linear 16\n");
 				return -1;
@@ -591,7 +591,7 @@
 		return 0;
 	}
 	if (!(frame->subclass &
-		(AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW)) && 
+		(AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW)) && 
 	    p->mode != MODE_FXS) {
 		ast_log(LOG_WARNING, "Cannot handle frames in %d format\n", frame->subclass);
 		return -1;
@@ -631,8 +631,8 @@
 			return -1;
 		}
 		maxfr = 24;
-	} else if (frame->subclass == AST_FORMAT_SLINEAR) {
-		if (p->lastformat != AST_FORMAT_SLINEAR) {
+	} else if (frame->subclass == AST_FORMAT_SLINEAR_LE) {
+		if (p->lastformat != AST_FORMAT_SLINEAR_LE) {
 			ioctl(p->fd, PHONE_PLAY_STOP);
 			ioctl(p->fd, PHONE_REC_STOP);
 			if (ioctl(p->fd, PHONE_PLAY_CODEC, LINEAR16)) {
@@ -643,8 +643,8 @@
 				ast_log(LOG_WARNING, "Unable to set 16-bit linear mode\n");
 				return -1;
 			}
-			p->lastformat = AST_FORMAT_SLINEAR;
-			p->lastinput = AST_FORMAT_SLINEAR;
+			p->lastformat = AST_FORMAT_SLINEAR_LE;
+			p->lastinput = AST_FORMAT_SLINEAR_LE;
 			codecset = 1;
 			/* Reset output buffer */
 			p->obuflen = 0;
@@ -764,12 +764,12 @@
 				tmp->nativeformats =
 				tmp->rawreadformat =
 				tmp->rawwriteformat =
-				AST_FORMAT_SLINEAR;
+				AST_FORMAT_SLINEAR_LE;
 			else {
 				tmp->nativeformats =
 				tmp->rawreadformat =
 				tmp->rawwriteformat =
-				prefformat & ~AST_FORMAT_SLINEAR;
+				prefformat & ~AST_FORMAT_SLINEAR_LE;
 			}
 		}
 		else {
@@ -1149,7 +1149,7 @@
 	p = iflist;
 	while(p) {
 		if (p->mode == MODE_FXS ||
-		    format & (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW)) {
+		    format & (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW)) {
 		    size_t length = strlen(p->dev + 5);
     		if (strncmp(name, p->dev + 5, length) == 0 &&
     		    !isalnum(name[length])) {
@@ -1166,7 +1166,7 @@
 	restart_monitor();
 	if (tmp == NULL) {
 		oldformat = format;
-		format &= (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW);
+		format &= (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW);
 		if (!format) {
 			ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", oldformat);
 			return NULL;
@@ -1317,8 +1317,8 @@
 				prefformat = AST_FORMAT_G723_1;
 			} else if (!strcasecmp(v->value, "slinear")) {
 				if (mode == MODE_FXS)
-				    prefformat |= AST_FORMAT_SLINEAR;
-				else prefformat = AST_FORMAT_SLINEAR;
+				    prefformat |= AST_FORMAT_SLINEAR_LE;
+				else prefformat = AST_FORMAT_SLINEAR_LE;
 			} else if (!strcasecmp(v->value, "ulaw")) {
 				prefformat = AST_FORMAT_ULAW;
 			} else
Index: channels/chan_zap.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_zap.c,v
retrieving revision 1.420
diff -u -r1.420 chan_zap.c
--- channels/chan_zap.c	23 Mar 2005 21:12:01 -0000	1.420
+++ channels/chan_zap.c	25 Mar 2005 11:32:24 -0000
@@ -630,7 +630,7 @@
 static const struct ast_channel_tech zap_tech = {
 	.type = type,
 	.description = tdesc,
-	.capabilities = AST_FORMAT_SLINEAR | AST_FORMAT_ULAW,
+	.capabilities = AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW,
 	.requester = zt_request,
 	.send_digit = zt_digit,
 	.send_text = zt_sendtext,
@@ -4119,7 +4119,7 @@
 		return &p->subs[index].f;
 	}	
 	
-	if (ast->rawreadformat == AST_FORMAT_SLINEAR) {
+	if (ast->rawreadformat == AST_FORMAT_SLINEAR_LE) {
 		if (!p->subs[index].linear) {
 			p->subs[index].linear = 1;
 			res = zt_setlinear(p->subs[index].zfd, p->subs[index].linear);
@@ -4380,7 +4380,7 @@
 			ast_log(LOG_WARNING, "Don't know what to do with frame type '%d'\n", frame->frametype);
 		return 0;
 	}
-	if ((frame->subclass != AST_FORMAT_SLINEAR) && 
+	if ((frame->subclass != AST_FORMAT_SLINEAR_LE) && 
 	    (frame->subclass != AST_FORMAT_ULAW) &&
 	    (frame->subclass != AST_FORMAT_ALAW)) {
 		ast_log(LOG_WARNING, "Cannot handle frames in %d format\n", frame->subclass);
@@ -4409,7 +4409,7 @@
 		return 0;
 	}
 
-	if (frame->subclass == AST_FORMAT_SLINEAR) {
+	if (frame->subclass == AST_FORMAT_SLINEAR_LE) {
 		if (!p->subs[index].linear) {
 			p->subs[index].linear = 1;
 			res = zt_setlinear(p->subs[index].zfd, p->subs[index].linear);
@@ -4679,7 +4679,7 @@
 		} while (x < 3);
 		tmp->type = type;
 		tmp->fds[0] = i->subs[index].zfd;
-		tmp->nativeformats = AST_FORMAT_SLINEAR | deflaw;
+		tmp->nativeformats = AST_FORMAT_SLINEAR_LE | deflaw;
 		/* Start out assuming ulaw since it's smaller :) */
 		tmp->rawreadformat = deflaw;
 		tmp->readformat = deflaw;
@@ -7059,7 +7059,7 @@
 	end = ifend;
 	/* We do signed linear */
 	oldformat = format;
-	format &= (AST_FORMAT_SLINEAR | AST_FORMAT_ULAW);
+	format &= (AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW);
 	if (!format) {
 		ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", oldformat);
 		return NULL;


-- 
dwmw2




More information about the asterisk-dev mailing list