[asterisk-commits] dlee: branch dlee/record-controls r395285 - /team/dlee/record-controls/main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jul 24 14:09:50 CDT 2013


Author: dlee
Date: Wed Jul 24 14:09:49 2013
New Revision: 395285

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395285
Log:
Mute slin frames.

Modified:
    team/dlee/record-controls/main/app.c

Modified: team/dlee/record-controls/main/app.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record-controls/main/app.c?view=diff&rev=395285&r1=395284&r2=395285
==============================================================================
--- team/dlee/record-controls/main/app.c (original)
+++ team/dlee/record-controls/main/app.c Wed Jul 24 14:09:49 2013
@@ -1149,12 +1149,28 @@
 	struct ast_frame *silence;
 	size_t size;
 	size_t datalen;
+	size_t samples = 0;
+	struct ast_frame *next;
 
 	if (!orig) {
 		return NULL;
 	}
 
-	datalen = sizeof(short) * orig->samples;
+	if (orig->subclass.format.id != AST_FORMAT_SLINEAR) {
+		ast_log(LOG_WARNING, "Attempting to silence non-slin frame\n");
+		return NULL;
+	}
+
+	for (next = AST_LIST_NEXT(orig, frame_list);
+		 orig;
+		 orig = next, next = orig ? AST_LIST_NEXT(orig, frame_list) : NULL) {
+		samples += orig->samples;
+	}
+
+	ast_verb(4, "Silencing %zd samples\n", samples);
+
+
+	datalen = sizeof(short) * samples;
 	size = sizeof(*silence) + datalen;
 	silence = ast_calloc(1, size);
 	if (!silence) {
@@ -1164,12 +1180,18 @@
 	silence->mallocd = AST_MALLOCD_HDR;
 	silence->frametype = AST_FRAME_VOICE;
 	silence->data.ptr = (void *)(silence + 1);
-	silence->samples = orig->samples;
+	silence->samples = samples;
 	silence->datalen = datalen;
 
 	ast_format_set(&silence->subclass.format, AST_FORMAT_SLINEAR, 0);
 
 	return silence;
+}
+
+static int set_read_to_slin(struct ast_channel *chan, struct ast_format *orig_format)
+{
+	ast_format_copy(orig_format, ast_channel_readformat(chan));
+	return ast_set_read_format_by_id(chan, AST_FORMAT_SLINEAR);
 }
 
 static int global_silence_threshold = 128;
@@ -1302,8 +1324,7 @@
 			return -1;
 		}
 		ast_dsp_set_threshold(sildet, silencethreshold);
-		ast_format_copy(&rfmt, ast_channel_readformat(chan));
-		res = ast_set_read_format_by_id(chan, AST_FORMAT_SLINEAR);
+		res = set_read_to_slin(chan, &rfmt);
 		if (res < 0) {
 			ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
 			ast_dsp_free(sildet);
@@ -1445,6 +1466,18 @@
 					muted = !muted;
 					ast_verb(3, "Message %smuted by control\n",
 						muted ? "" : "un");
+					/* We can only silence slin frames, so
+					 * set the mode, if we haven't already
+					 * for sildet
+					 */
+					if (muted && !rfmt.id) {
+						ast_verb(3, "Setting read format to linear mode\n");
+						res = set_read_to_slin(chan, &rfmt);
+						if (res < 0) {
+							ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
+							running = 0;
+						}
+					}
 					break;
 				}
 			}




More information about the asterisk-commits mailing list