[asterisk-commits] dlee: branch dlee/record-controls r395240 - in /team/dlee/record-controls: ma...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jul 23 23:49:48 CDT 2013


Author: dlee
Date: Tue Jul 23 23:49:46 2013
New Revision: 395240

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395240
Log:
Hacked together recording control frame stuffz

Modified:
    team/dlee/record-controls/main/app.c
    team/dlee/record-controls/res/res_stasis_http_recordings.c
    team/dlee/record-controls/rest-api/api-docs/recordings.json

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=395240&r1=395239&r2=395240
==============================================================================
--- team/dlee/record-controls/main/app.c (original)
+++ team/dlee/record-controls/main/app.c Tue Jul 23 23:49:46 2013
@@ -1144,6 +1144,34 @@
 	return d;
 }
 
+static struct ast_frame *make_silence(const struct ast_frame *orig)
+{
+	struct ast_frame *silence;
+	size_t size;
+	size_t datalen;
+
+	if (!orig) {
+		return NULL;
+	}
+
+	datalen = sizeof(short) * orig->samples;
+	size = sizeof(*silence) + datalen;
+	silence = ast_calloc(1, size);
+	if (!silence) {
+		return NULL;
+	}
+
+	silence->mallocd = AST_MALLOCD_HDR;
+	silence->frametype = AST_FRAME_VOICE;
+	silence->data.ptr = (void *)(silence + 1);
+	silence->samples = orig->samples;
+	silence->datalen = datalen;
+
+	ast_format_set(&silence->subclass.format, AST_FORMAT_SLINEAR, 0);
+
+	return silence;
+}
+
 static int global_silence_threshold = 128;
 static int global_maxsilence = 0;
 
@@ -1183,6 +1211,7 @@
 	int totalsilence = 0;
 	int dspsilence = 0;
 	int olddspsilence = 0;
+	int pausedsilence = 0;
 	struct ast_format rfmt;
 	struct ast_silence_generator *silgen = NULL;
 	char prependfile[PATH_MAX];
@@ -1295,7 +1324,10 @@
 		/* Loop forever, writing the packets we read to the writer(s), until
 		   we read a digit or get a hangup */
 		struct ast_frame *f;
-		for (;;) {
+		int paused = 0;
+		int muted = 0;
+		int running = 1;
+		while (running) {
 			if (!(res = ast_waitfor(chan, 2000))) {
 				ast_debug(1, "One waitfor failed, trying another\n");
 				/* Try one more time in case of masq */
@@ -1314,11 +1346,27 @@
 			}
 			if (f->frametype == AST_FRAME_VOICE) {
 				/* write each format */
-				for (x = 0; x < fmtcnt; x++) {
-					if (prepend && !others[x]) {
-						break;
+				if (paused) {
+					/* It's all good */
+					res = 0;
+				} else {
+					RAII_VAR(struct ast_frame *, silence, NULL, ast_frame_dtor);
+					struct ast_frame *orig = f;
+
+					if (muted) {
+						silence = make_silence(orig);
+						if (!silence) {
+							break;
+						}
+						f = silence;
 					}
-					res = ast_writestream(others[x], f);
+					for (x = 0; x < fmtcnt; x++) {
+						if (prepend && !others[x]) {
+							break;
+						}
+						res = ast_writestream(others[x], f);
+					}
+					f = orig;
 				}
 
 				/* Silence Detection */
@@ -1329,6 +1377,17 @@
 						totalsilence += olddspsilence;
 					}
 					olddspsilence = dspsilence;
+
+					if (paused) {
+						/* record how much silence there was while we are paused */
+						pausedsilence = dspsilence;
+					} else if (dspsilence > pausedsilence) {
+						/* ignore the paused silence */
+						dspsilence -= pausedsilence;
+					} else {
+						/* we're not paused, and dspsilence is less than paused silence. reset pausedsilence */
+						pausedsilence = 0;
+					}
 
 					if (dspsilence > maxsilence) {
 						/* Ended happily with silence */
@@ -1361,9 +1420,31 @@
 					break;
 				}
 				if (strchr(canceldtmf, f->subclass.integer)) {
-					ast_verb(3, "User cancelled message by pressing %c\n", f->subclass.integer);
+					ast_verb(3, "User canceled message by pressing %c\n", f->subclass.integer);
 					res = f->subclass.integer;
 					outmsg = 0;
+					break;
+				}
+			} else if (f->frametype == AST_FRAME_CONTROL) {
+				switch (f->subclass.integer) {
+				case AST_CONTROL_RECORD_CANCEL:
+					ast_verb(3, "Message canceled by control\n");
+					running = 0;
+					outmsg = 0; /* cancels the recording */
+					break;
+				case AST_CONTROL_RECORD_STOP:
+					ast_verb(3, "Message ended by control\n");
+					running = 0;
+					break;
+				case AST_CONTROL_RECORD_SUSPEND:
+					paused = !paused;
+					ast_verb(3, "Message %spaused by control\n",
+						paused ? "" : "un");
+					break;
+				case AST_CONTROL_RECORD_MUTE:
+					muted = !muted;
+					ast_verb(3, "Message %smuted by control\n",
+						muted ? "" : "un");
 					break;
 				}
 			}

Modified: team/dlee/record-controls/res/res_stasis_http_recordings.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record-controls/res/res_stasis_http_recordings.c?view=diff&rev=395240&r1=395239&r2=395240
==============================================================================
--- team/dlee/record-controls/res/res_stasis_http_recordings.c (original)
+++ team/dlee/record-controls/res/res_stasis_http_recordings.c Tue Jul 23 23:49:46 2013
@@ -283,6 +283,7 @@
 		break;
 	case 500: /* Internal Server Error */
 	case 501: /* Not Implemented */
+	case 404: /* Recording not found */
 		is_valid = 1;
 		break;
 	default:
@@ -337,6 +338,7 @@
 		break;
 	case 500: /* Internal Server Error */
 	case 501: /* Not Implemented */
+	case 404: /* Recording not found */
 		is_valid = 1;
 		break;
 	default:
@@ -391,6 +393,7 @@
 		break;
 	case 500: /* Internal Server Error */
 	case 501: /* Not Implemented */
+	case 404: /* Recording not found */
 		is_valid = 1;
 		break;
 	default:
@@ -445,6 +448,8 @@
 		break;
 	case 500: /* Internal Server Error */
 	case 501: /* Not Implemented */
+	case 404: /* Recording not found */
+	case 409: /* Recording not in session */
 		is_valid = 1;
 		break;
 	default:
@@ -499,6 +504,8 @@
 		break;
 	case 500: /* Internal Server Error */
 	case 501: /* Not Implemented */
+	case 404: /* Recording not found */
+	case 409: /* Recording not in session */
 		is_valid = 1;
 		break;
 	default:
@@ -553,6 +560,8 @@
 		break;
 	case 500: /* Internal Server Error */
 	case 501: /* Not Implemented */
+	case 404: /* Recording not found */
+	case 409: /* Recording not in session */
 		is_valid = 1;
 		break;
 	default:
@@ -607,6 +616,8 @@
 		break;
 	case 500: /* Internal Server Error */
 	case 501: /* Not Implemented */
+	case 404: /* Recording not found */
+	case 409: /* Recording not in session */
 		is_valid = 1;
 		break;
 	default:

Modified: team/dlee/record-controls/rest-api/api-docs/recordings.json
URL: http://svnview.digium.com/svn/asterisk/team/dlee/record-controls/rest-api/api-docs/recordings.json?view=diff&rev=395240&r1=395239&r2=395240
==============================================================================
--- team/dlee/record-controls/rest-api/api-docs/recordings.json (original)
+++ team/dlee/record-controls/rest-api/api-docs/recordings.json Tue Jul 23 23:49:46 2013
@@ -87,6 +87,12 @@
 							"allowMultiple": false,
 							"dataType": "string"
 						}
+					],
+					"errorResponses": [
+						{
+							"code": 404,
+							"reason": "Recording not found"
+						}
 					]
 				},
 				{
@@ -103,6 +109,12 @@
 							"allowMultiple": false,
 							"dataType": "string"
 						}
+					],
+					"errorResponses": [
+						{
+							"code": 404,
+							"reason": "Recording not found"
+						}
 					]
 				}
 			]
@@ -123,6 +135,12 @@
 							"required": true,
 							"allowMultiple": false,
 							"dataType": "string"
+						}
+					],
+					"errorResponses": [
+						{
+							"code": 404,
+							"reason": "Recording not found"
 						}
 					]
 				}
@@ -146,6 +164,16 @@
 							"allowMultiple": false,
 							"dataType": "string"
 						}
+					],
+					"errorResponses": [
+						{
+							"code": 404,
+							"reason": "Recording not found"
+						},
+						{
+							"code": 409,
+							"reason": "Recording not in session"
+						}
 					]
 				}
 			]
@@ -166,6 +194,16 @@
 							"required": true,
 							"allowMultiple": false,
 							"dataType": "string"
+						}
+					],
+					"errorResponses": [
+						{
+							"code": 404,
+							"reason": "Recording not found"
+						},
+						{
+							"code": 409,
+							"reason": "Recording not in session"
 						}
 					]
 				}
@@ -189,6 +227,16 @@
 							"allowMultiple": false,
 							"dataType": "string"
 						}
+					],
+					"errorResponses": [
+						{
+							"code": 404,
+							"reason": "Recording not found"
+						},
+						{
+							"code": 409,
+							"reason": "Recording not in session"
+						}
 					]
 				}
 			]
@@ -209,6 +257,16 @@
 							"required": true,
 							"allowMultiple": false,
 							"dataType": "string"
+						}
+					],
+					"errorResponses": [
+						{
+							"code": 404,
+							"reason": "Recording not found"
+						},
+						{
+							"code": 409,
+							"reason": "Recording not in session"
 						}
 					]
 				}




More information about the asterisk-commits mailing list