Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv12746

Modified Files:
        app.c asterisk.c channel.c 
Log Message:
optionally send silence during recording (issue #5135)


Index: app.c
===================================================================
RCS file: /usr/cvsroot/asterisk/app.c,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -d -r1.80 -r1.81
--- app.c       30 Oct 2005 06:58:17 -0000      1.80
+++ app.c       1 Nov 2005 17:22:25 -0000       1.81
@@ -560,6 +560,7 @@
        int dspsilence = 0;
        int gotsilence = 0;             /* did we timeout for silence? */
        int rfmt=0;
+       struct ast_silence_generator *silgen = NULL;
 
        if (silencethreshold < 0)
                silencethreshold = global_silence_threshold;
@@ -615,8 +616,6 @@
        if (path)
                ast_unlock_path(path);
 
-
-       
        if (maxsilence > 0) {
                sildet = ast_dsp_new(); /* Create the silence detector */
                if (!sildet) {
@@ -632,9 +631,13 @@
                        return -1;
                }
        }
+
        /* Request a video update */
        ast_indicate(chan, AST_CONTROL_VIDUPDATE);
 
+       if (option_transmit_silence_during_record)
+               silgen = ast_channel_start_silence_generator(chan);
+
        if (x == fmtcnt) {
        /* Loop forever, writing the packets we read to the writer(s), until
           we read a # or get a hangup */
@@ -735,6 +738,9 @@
                ast_log(LOG_WARNING, "Error creating writestream '%s', format 
'%s'\n", recordfile, sfmt[x]);
        }
 
+       if (silgen)
+               ast_channel_stop_silence_generator(chan, silgen);
+
        *duration = end - start;
 
        for (x=0;x<fmtcnt;x++) {

Index: asterisk.c
===================================================================
RCS file: /usr/cvsroot/asterisk/asterisk.c,v
retrieving revision 1.187
retrieving revision 1.188
diff -u -d -r1.187 -r1.188
--- asterisk.c  31 Oct 2005 21:25:21 -0000      1.187
+++ asterisk.c  1 Nov 2005 17:22:25 -0000       1.188
@@ -142,6 +142,7 @@
 int option_overrideconfig = 0;
 int option_reconnect = 0;
 int option_transcode_slin = 1;
+int option_transmit_silence_during_record = 0;
 int option_maxcalls = 0;
 double option_maxload = 0.0;
 int option_dontwarn = 0;
@@ -1869,6 +1870,9 @@
                /* Build transcode paths via SLINEAR, instead of directly */
                } else if (!strcasecmp(v->name, "transcode_via_sln")) {
                        option_transcode_slin = ast_true(v->value);
+               /* Transmit SLINEAR silence while a channel is being recorded */
+               } else if (!strcasecmp(v->name, 
"transmit_silence_during_record")) {
+                       option_transmit_silence_during_record = 
ast_true(v->value);
                } else if (!strcasecmp(v->name, "maxcalls")) {
                        if ((sscanf(v->value, "%d", &option_maxcalls) != 1) || 
(option_maxcalls < 0)) {
                                option_maxcalls = 0;

Index: channel.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channel.c,v
retrieving revision 1.254
retrieving revision 1.255
diff -u -d -r1.254 -r1.255
--- channel.c   31 Oct 2005 15:34:11 -0000      1.254
+++ channel.c   1 Nov 2005 17:22:25 -0000       1.255
@@ -3921,3 +3921,100 @@
 
        return result;
 }
+
+static void *silence_generator_alloc(struct ast_channel *chan, void *data)
+{
+       /* just store the data pointer in the channel structure */
+       return data;
+}
+
+static void silence_generator_release(struct ast_channel *chan, void *data)
+{
+       /* nothing to do */
+}
+
+static short normal_silence_buf[160] = { 0, };
+static struct ast_frame normal_silence_frame = {
+       .frametype = AST_FRAME_VOICE,
+       .subclass = AST_FORMAT_SLINEAR,
+       .data = normal_silence_buf,
+       .samples = 160,
+       .datalen = sizeof(normal_silence_buf),
+};
+
+static int silence_generator_generate(struct ast_channel *chan, void *data, 
int len, int samples) 
+{
+       if (samples == 160) {
+               if (ast_write(chan, &normal_silence_frame))
+                       return -1;
+       } else {
+               short buf[samples];
+               int x;
+               struct ast_frame frame = {
+                       .frametype = AST_FRAME_VOICE,
+                       .subclass = AST_FORMAT_SLINEAR,
+                       .data = normal_silence_buf,
+                       .samples = samples,
+                       .datalen = sizeof(buf),
+               };
+
+               for (x = 0; x < samples; x++)
+                       buf[x] = 0;
+
+               if (ast_write(chan, &frame))
+                       return -1;
+       }
+
+       return 0;
+}
+
+static struct ast_generator silence_generator = {
+       .alloc = silence_generator_alloc,
+       .release = silence_generator_release,
+       .generate = silence_generator_generate, 
+};
+
+struct ast_silence_generator {
+       int old_write_format;
+};
+
+struct ast_silence_generator *ast_channel_start_silence_generator(struct 
ast_channel *chan)
+{
+       struct ast_silence_generator *state;
+
+       if (!(state = calloc(1, sizeof(*state)))) {
+               ast_log(LOG_WARNING, "Could not allocate state structure\n");
+               return NULL;
+       }
+
+       state->old_write_format = chan->writeformat;
+
+       if (ast_set_write_format(chan, AST_FORMAT_SLINEAR) < 0) {
+               ast_log(LOG_ERROR, "Could not set write format to SLINEAR\n");
+               free(state);
+               return NULL;
+       }
+
+       ast_activate_generator(chan, &silence_generator, state);
+
+       if (option_debug)
+               ast_log(LOG_DEBUG, "Started silence generator on '%s'\n", 
chan->name);
+
+       return state;
+}
+
+void ast_channel_stop_silence_generator(struct ast_channel *chan, struct 
ast_silence_generator *state)
+{
+       if (!state)
+               return;
+
+       ast_deactivate_generator(chan);
+
+       if (option_debug)
+               ast_log(LOG_DEBUG, "Stopped silence generator on '%s'\n", 
chan->name);
+
+       if (ast_set_write_format(chan, state->old_write_format) < 0)
+               ast_log(LOG_ERROR, "Could not return write format to its 
original state\n");
+
+       free(state);
+}

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to