[Freeswitch-svn] [commit] r10643 - freeswitch/trunk/src/mod/applications/mod_vmd

FreeSWITCH SVN ericdc at freeswitch.org
Sun Dec 7 11:57:06 PST 2008


Author: ericdc
Date: Sun Dec  7 14:57:03 2008
New Revision: 10643

Log:
Added extra credits. Adjusted indentation.


Modified:
   freeswitch/trunk/src/mod/applications/mod_vmd/mod_vmd.c

Modified: freeswitch/trunk/src/mod/applications/mod_vmd/mod_vmd.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_vmd/mod_vmd.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_vmd/mod_vmd.c	Sun Dec  7 14:57:03 2008
@@ -21,6 +21,16 @@
  * 
  * Eric des Courtis <eric.des.courtis at benbria.com>
  *
+ * Special thanks to the following companies for their help:
+ * 	- JohnnyVoIP
+ * 	- Magor Communications Corporation
+ *
+ * Special thanks to the following people for their help:
+ * 	- The FreeSWITCH Team
+ * 	- Matt Battig
+ * 	- Dean Swan
+ * 	- Lucas Cornelisse
+ * 	- Kevin Green
  *
  * mod_vmd.c -- Voicemail Detection Module
  *
@@ -108,24 +118,24 @@
 SWITCH_STANDARD_APP(vmd_start_function);
 
 /* Type that holds state information about the beep */
-typedef enum vmd_state{
+typedef enum vmd_state {
     BEEP_DETECTED, BEEP_NOT_DETECTED
 } vmd_state_t;
 
 /* Type that holds data for 5 points of discreet energy separation */
-typedef struct vmd_point{
+typedef struct vmd_point {
     double freq;
     double ampl;
 } vmd_point_t;
 
 /* Type that holds codec information */
-typedef struct vmd_codec_info{
+typedef struct vmd_codec_info {
     int rate;
     int channels;
 } vmd_codec_info_t;
 
 /* Type that holds session information pertinent to the vmd module */
-typedef struct vmd_session_info{
+typedef struct vmd_session_info {
     /* State of the session */
     vmd_state_t state;
     /* Snapshot of DESA samples */
@@ -143,12 +153,12 @@
     switch_size_t timestamp;
 } vmd_session_info_t;
 
-static switch_bool_t process_data(vmd_session_info_t *vmd_info, switch_frame_t *frame);
-static switch_bool_t vmd_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type);
+static switch_bool_t process_data(vmd_session_info_t * vmd_info, switch_frame_t * frame);
+static switch_bool_t vmd_callback(switch_media_bug_t * bug, void *user_data, switch_abc_type_t type);
 static double freq_estimator(double *x);
 static double ampl_estimator(double *x);
-static void convert_pts(int16_t *i_pts, double *d_pts, int16_t max);
-static void find_beep(vmd_session_info_t *vmd_info, switch_frame_t *frame);
+static void convert_pts(int16_t * i_pts, double *d_pts, int16_t max);
+static void find_beep(vmd_session_info_t * vmd_info, switch_frame_t * frame);
 static double median(double *m, int n);
 
 /*
@@ -156,62 +166,59 @@
 #define PRINT2(a, b) do{ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, a, b); }while(0)
 */
 
-static switch_bool_t vmd_callback(switch_media_bug_t *bug, 
-								  void *user_data,
-								  switch_abc_type_t type)
-{
-	vmd_session_info_t *vmd_info;
-	switch_codec_t *read_codec;
-	switch_frame_t *frame;
-
-	vmd_info = (vmd_session_info_t *)user_data;
-	if(vmd_info == NULL) {
-		return SWITCH_FALSE;
-	}
-
-	switch(type){
-
-	case SWITCH_ABC_TYPE_INIT:
-		read_codec = switch_core_session_get_read_codec(vmd_info->session);
-		vmd_info->vmd_codec.rate = read_codec->implementation->samples_per_second;
-		vmd_info->vmd_codec.channels = read_codec->implementation->number_of_channels;
-		break;
-
-	case SWITCH_ABC_TYPE_READ_PING:
-	case SWITCH_ABC_TYPE_CLOSE:
-	case SWITCH_ABC_TYPE_READ:
-	case SWITCH_ABC_TYPE_WRITE:
-		break;
-
-	case SWITCH_ABC_TYPE_READ_REPLACE:
-		frame = switch_core_media_bug_get_read_replace_frame(bug);
-		return process_data(vmd_info, frame);
-
-	case SWITCH_ABC_TYPE_WRITE_REPLACE:
-		break;
-	}
-
-	return SWITCH_TRUE;
-}
-
-static switch_bool_t process_data(vmd_session_info_t *vmd_info, 
-								  switch_frame_t *frame)
-{
-	uint32_t i;
-	unsigned int j;
-	double pts[P];
-	int16_t *data;
-	int16_t max;
-	switch_ssize_t len;
-
-	len = frame->samples * sizeof(int16_t);
-	data = (int16_t *)frame->data;
-
-	for(max = (int16_t)abs(data[0]), i = 1; i < frame->samples; i++) {
-		if ((int16_t)abs(data[i]) > max) {
-			max = (int16_t)abs(data[i]);
-		}
-	}
+static switch_bool_t vmd_callback(switch_media_bug_t * bug, void *user_data, switch_abc_type_t type)
+{
+    vmd_session_info_t *vmd_info;
+    switch_codec_t *read_codec;
+    switch_frame_t *frame;
+
+    vmd_info = (vmd_session_info_t *) user_data;
+    if (vmd_info == NULL) {
+        return SWITCH_FALSE;
+    }
+
+    switch (type) {
+
+    case SWITCH_ABC_TYPE_INIT:
+        read_codec = switch_core_session_get_read_codec(vmd_info->session);
+        vmd_info->vmd_codec.rate = read_codec->implementation->samples_per_second;
+        vmd_info->vmd_codec.channels = read_codec->implementation->number_of_channels;
+        break;
+
+    case SWITCH_ABC_TYPE_READ_PING:
+    case SWITCH_ABC_TYPE_CLOSE:
+    case SWITCH_ABC_TYPE_READ:
+    case SWITCH_ABC_TYPE_WRITE:
+        break;
+
+    case SWITCH_ABC_TYPE_READ_REPLACE:
+        frame = switch_core_media_bug_get_read_replace_frame(bug);
+        return process_data(vmd_info, frame);
+
+    case SWITCH_ABC_TYPE_WRITE_REPLACE:
+        break;
+    }
+
+    return SWITCH_TRUE;
+}
+
+static switch_bool_t process_data(vmd_session_info_t * vmd_info, switch_frame_t * frame)
+{
+    uint32_t i;
+    unsigned int j;
+    double pts[P];
+    int16_t *data;
+    int16_t max;
+    switch_ssize_t len;
+
+    len = frame->samples * sizeof(int16_t);
+    data = (int16_t *) frame->data;
+
+    for (max = (int16_t) abs(data[0]), i = 1; i < frame->samples; i++) {
+        if ((int16_t) abs(data[i]) > max) {
+            max = (int16_t) abs(data[i]);
+        }
+    }
 
 /*
     if(vmd_info->data_len != len){
@@ -234,189 +241,184 @@
     }
 */
 
-    for(i = 0, j = vmd_info->pos; i < frame->samples; j++, j %= POINTS, i += 5) {
-	/*	convert_pts(vmd_info->data + i, pts); */
-		convert_pts(data + i, pts, max);
-		vmd_info->points[j].freq = TO_HZ(freq_estimator(pts));
-		vmd_info->points[j].ampl = ampl_estimator(pts);
-		vmd_info->pos = j % POINTS;
-		find_beep(vmd_info, frame);
+    for (i = 0, j = vmd_info->pos; i < frame->samples; j++, j %= POINTS, i += 5) {
+        /*      convert_pts(vmd_info->data + i, pts); */
+        convert_pts(data + i, pts, max);
+        vmd_info->points[j].freq = TO_HZ(freq_estimator(pts));
+        vmd_info->points[j].ampl = ampl_estimator(pts);
+        vmd_info->pos = j % POINTS;
+        find_beep(vmd_info, frame);
     }
 
     return SWITCH_TRUE;
 }
 
-static void find_beep(vmd_session_info_t *vmd_info, switch_frame_t *frame)
+static void find_beep(vmd_session_info_t * vmd_info, switch_frame_t * frame)
 {
-	int i;
-	int c;
-	double m[POINTS];
-	double med;
-	unsigned int j = (vmd_info->pos + 1) % POINTS;
-	unsigned int k = j;
-	switch_event_t *event;
-	switch_status_t status;
-	switch_event_t *event_copy;
-	switch_channel_t *channel = switch_core_session_get_channel(vmd_info->session); 
-
-	switch(vmd_info->state){
-	case BEEP_DETECTED:
-		for(c = 0, i = 0; i < POINTS; j++, j %= POINTS, i++){
-			vmd_info->timestamp++;
-			if (vmd_info->points[j].freq < TOLERANCE_T(vmd_info->beep_freq) &&
-				vmd_info->points[j].freq > TOLERANCE_B(vmd_info->beep_freq)) {
-					c++;
-					vmd_info->beep_freq = (vmd_info->beep_freq * 0.95) + (vmd_info->points[j].freq * 0.05);
-			}
-		}
-
-		if (c < (POINTS - MAX_CHIRP)) {
-			vmd_info->state = BEEP_NOT_DETECTED;
-			if (vmd_info->timestamp < MIN_TIME) {
-				break;
-			}
-
-			status = switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, VMD_EVENT_BEEP);
-			if (status != SWITCH_STATUS_SUCCESS) {
-				return;
-			}
-
-			switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Beep-Status", "stop");
-			switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Beep-Time", "%d", (int)vmd_info->timestamp / POINTS);
-			switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Unique-ID",
-				"%s", switch_core_session_get_uuid(vmd_info->session));
-			switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Frequency", "%6.4lf", vmd_info->beep_freq);
-			switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "vmd");
-
-			if ((switch_event_dup(&event_copy, event)) != SWITCH_STATUS_SUCCESS) {
-				return;
-			}
-
-			switch_core_session_queue_event(vmd_info->session, &event);
-			switch_event_fire(&event_copy);
-
-			switch_log_printf(
-				SWITCH_CHANNEL_LOG,
-				SWITCH_LOG_INFO,
-				"<<< VMD - Beep Detected >>>\n"
-				);
-			switch_channel_set_variable(channel, "vmd_detect", "TRUE");
-
-			vmd_info->timestamp = 0;
-		}
-
-		break;
-
-	case BEEP_NOT_DETECTED:
-
-		for(i = 0; i < POINTS; k++, k %= POINTS, i++){
-			m[i] = vmd_info->points[k].freq;
-			if (ISNAN(m[i])) {
-				m[i] = 0.0;
-			}
-		}
-
-		med = median(m, POINTS);
-		if (ISNAN(med)){
-			for(i = 0; i < POINTS; i++){
-				if (!ISNAN(m[i])){
-					med = m[i];
-					break;
-				}
-			}
-		}
-
-		for(c = 0, i = 0; i < POINTS; j++, j %= POINTS, i++){
-			if (vmd_info->points[j].freq < TOLERANCE_T(med) &&
-				vmd_info->points[j].freq > TOLERANCE_B(med)){
-					if (vmd_info->points[j].ampl > MIN_AMPL &&
-						vmd_info->points[j].freq > MIN_FREQ &&
-						vmd_info->points[j].freq < MAX_FREQ){
-							c++;
-					}
-			}
-		}
-
-		if(c >= VALID){
-			vmd_info->state = BEEP_DETECTED;
-			vmd_info->beep_freq = med;
-			vmd_info->timestamp = 0;
-		}
+    int i;
+    int c;
+    double m[POINTS];
+    double med;
+    unsigned int j = (vmd_info->pos + 1) % POINTS;
+    unsigned int k = j;
+    switch_event_t *event;
+    switch_status_t status;
+    switch_event_t *event_copy;
+    switch_channel_t *channel = switch_core_session_get_channel(vmd_info->session);
+
+    switch (vmd_info->state) {
+    case BEEP_DETECTED:
+        for (c = 0, i = 0; i < POINTS; j++, j %= POINTS, i++) {
+            vmd_info->timestamp++;
+            if (vmd_info->points[j].freq < TOLERANCE_T(vmd_info->beep_freq) &&
+                vmd_info->points[j].freq > TOLERANCE_B(vmd_info->beep_freq)) {
+                c++;
+                vmd_info->beep_freq = (vmd_info->beep_freq * 0.95) + (vmd_info->points[j].freq * 0.05);
+            }
+        }
+
+        if (c < (POINTS - MAX_CHIRP)) {
+            vmd_info->state = BEEP_NOT_DETECTED;
+            if (vmd_info->timestamp < MIN_TIME) {
+                break;
+            }
+
+            status = switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, VMD_EVENT_BEEP);
+            if (status != SWITCH_STATUS_SUCCESS) {
+                return;
+            }
+
+            switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Beep-Status", "stop");
+            switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Beep-Time", "%d", (int) vmd_info->timestamp / POINTS);
+            switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Unique-ID", "%s", switch_core_session_get_uuid(vmd_info->session));
+            switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Frequency", "%6.4lf", vmd_info->beep_freq);
+            switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "vmd");
+
+            if ((switch_event_dup(&event_copy, event)) != SWITCH_STATUS_SUCCESS) {
+                return;
+            }
 
-		break;
-	}
+            switch_core_session_queue_event(vmd_info->session, &event);
+            switch_event_fire(&event_copy);
+
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "<<< VMD - Beep Detected >>>\n");
+            switch_channel_set_variable(channel, "vmd_detect", "TRUE");
+
+            vmd_info->timestamp = 0;
+        }
+
+        break;
+
+    case BEEP_NOT_DETECTED:
+
+        for (i = 0; i < POINTS; k++, k %= POINTS, i++) {
+            m[i] = vmd_info->points[k].freq;
+            if (ISNAN(m[i])) {
+                m[i] = 0.0;
+            }
+        }
+
+        med = median(m, POINTS);
+        if (ISNAN(med)) {
+            for (i = 0; i < POINTS; i++) {
+                if (!ISNAN(m[i])) {
+                    med = m[i];
+                    break;
+                }
+            }
+        }
+
+        for (c = 0, i = 0; i < POINTS; j++, j %= POINTS, i++) {
+            if (vmd_info->points[j].freq < TOLERANCE_T(med) && vmd_info->points[j].freq > TOLERANCE_B(med)) {
+                if (vmd_info->points[j].ampl > MIN_AMPL &&
+                    vmd_info->points[j].freq > MIN_FREQ && vmd_info->points[j].freq < MAX_FREQ) {
+                    c++;
+                }
+            }
+        }
+
+        if (c >= VALID) {
+            vmd_info->state = BEEP_DETECTED;
+            vmd_info->beep_freq = med;
+            vmd_info->timestamp = 0;
+        }
+
+        break;
+    }
 }
 
 /* Find the median of an array of doubles */
 static double median(double *m, int n)
 {
-	int i;
-	int less;
-	int greater;
-	int equal;
-	double min;
-	double max;
-	double guess;
-	double maxltguess;
-	double mingtguess;
-
-	min = max = m[0] ;
-
-	for (i = 1; i < n; i++) {
-		if(m[i] < min) min = m[i];
-		if(m[i] > max) max = m[i];
-	}
-
-	for(;;) {
-		guess = ( min + max ) / 2;
-		less = 0;
-		greater = 0;
-		equal = 0;
-		maxltguess = min;
-		mingtguess = max;
-
-		for(i = 0; i < n; i++) {
-			if (m[i] < guess) {
-				less++;
-				if(m[i] > maxltguess) {
-					maxltguess = m[i];
-				}
-			} else if (m[i] > guess) {
-				greater++;
-				if(m[i] < mingtguess) {
-					mingtguess = m[i];
-				}
-			} else {
-				equal++;
-			}
-		}
-
-		if (less <= ( n + 1 ) / 2 && greater <= ( n + 1 ) / 2) {
-			break;
-		} else if (less > greater) {
-			max = maxltguess;
-		} else {
-			min = mingtguess;
-		}
-	}
-
-	if (less >= ( n + 1 ) / 2) {
-		return maxltguess;
-	} else if (less + equal >= ( n + 1 ) / 2) {
-		return guess;
-	}
+    int i;
+    int less;
+    int greater;
+    int equal;
+    double min;
+    double max;
+    double guess;
+    double maxltguess;
+    double mingtguess;
+
+    min = max = m[0];
+
+    for (i = 1; i < n; i++) {
+        if (m[i] < min)
+            min = m[i];
+        if (m[i] > max)
+            max = m[i];
+    }
+
+    for (;;) {
+        guess = (min + max) / 2;
+        less = 0;
+        greater = 0;
+        equal = 0;
+        maxltguess = min;
+        mingtguess = max;
+
+        for (i = 0; i < n; i++) {
+            if (m[i] < guess) {
+                less++;
+                if (m[i] > maxltguess) {
+                    maxltguess = m[i];
+                }
+            } else if (m[i] > guess) {
+                greater++;
+                if (m[i] < mingtguess) {
+                    mingtguess = m[i];
+                }
+            } else {
+                equal++;
+            }
+        }
+
+        if (less <= (n + 1) / 2 && greater <= (n + 1) / 2) {
+            break;
+        } else if (less > greater) {
+            max = maxltguess;
+        } else {
+            min = mingtguess;
+        }
+    }
+
+    if (less >= (n + 1) / 2) {
+        return maxltguess;
+    } else if (less + equal >= (n + 1) / 2) {
+        return guess;
+    }
 
-	return mingtguess;
+    return mingtguess;
 }
 
 /* Convert many points for Signed L16 to relative floating point */
-static void convert_pts(int16_t *i_pts, double *d_pts, int16_t max)
+static void convert_pts(int16_t * i_pts, double *d_pts, int16_t max)
 {
     int i;
-	for(i = 0; i < P; i++) {
-		/* Signed L16 to relative floating point conversion */
-		d_pts[i] = ((((double)(i_pts[i]) + (double)max) / (double)(2 * max)) - 0.5) * 2.0;
-	}
+    for (i = 0; i < P; i++) {
+        /* Signed L16 to relative floating point conversion */
+        d_pts[i] = ((((double) (i_pts[i]) + (double) max) / (double) (2 * max)) - 0.5) * 2.0;
+    }
 }
 
 /* Amplitude estimator for DESA-2 */
@@ -427,22 +429,18 @@
     freq_sq = freq_estimator(x);
     freq_sq *= freq_sq;
 
-    return sqrt( PSI(x) / sin(freq_sq) ); 
+    return sqrt(PSI(x) / sin(freq_sq));
 }
 
 /* The DESA-2 algorithm */
 double freq_estimator(double *x)
 {
-    return 0.5 * acos(
-	(((x[2] * x[2]) - (x[0] * x[4]))
-	-
-	( (x[1] * x[1]) - (x[0] * x[2]))
-	-
-	( (x[3] * x[3]) - (x[2] * x[4])))
-	/
-	(2.0 * ((x[2] * x[2]) - (x[1] * x[3])))
- 
-    );
+    return 0.5 * acos((((x[2] * x[2]) - (x[0] * x[4]))
+                       - ((x[1] * x[1]) - (x[0] * x[2]))
+                       - ((x[3] * x[3]) - (x[2] * x[4])))
+                      / (2.0 * ((x[2] * x[2]) - (x[1] * x[3])))
+
+        );
 }
 
 
@@ -451,20 +449,13 @@
     switch_application_interface_t *app_interface;
     switch_api_interface_t *api_interface;
     /* connect my internal structure to the blank pointer passed to me */
-    *module_interface = 
-	switch_loadable_module_create_module_interface(pool, modname);
-    
-    switch_log_printf(
-	SWITCH_CHANNEL_LOG, 
-	SWITCH_LOG_NOTICE, 
-	"Voicemail detection enabled\n"
-    );
-
-    SWITCH_ADD_APP(app_interface, "vmd", "Detect beeps", "Detect voicemail beeps", 
-	vmd_start_function, "[start] [stop]", SAF_NONE);
-    
-    SWITCH_ADD_API(api_interface, "vmd", "Detected voicemail beeps", 
-	vmd_api_main, VMD_SYNTAX);
+    *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Voicemail detection enabled\n");
+
+    SWITCH_ADD_APP(app_interface, "vmd", "Detect beeps", "Detect voicemail beeps", vmd_start_function, "[start] [stop]", SAF_NONE);
+
+    SWITCH_ADD_API(api_interface, "vmd", "Detected voicemail beeps", vmd_api_main, VMD_SYNTAX);
 
     /* indicate that the module should continue to be loaded */
     return SWITCH_STATUS_SUCCESS;
@@ -473,84 +464,64 @@
 /* Same as api function see it for comments */
 SWITCH_STANDARD_APP(vmd_start_function)
 {
-	switch_media_bug_t *bug;
-	switch_status_t status;
-	switch_channel_t *channel;
-	vmd_session_info_t *vmd_info;
-	int i;
-
-	if (session == NULL) return;
-
-	channel = switch_core_session_get_channel(session);
-
-	/* Is this channel already set? */
-	bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_vmd_");
-	/* If yes */
-	if (bug != NULL){
-		/* If we have a stop remove audio bug */
-		if(strcasecmp(data, "stop") == 0){
-			switch_channel_set_private(channel, "_vmd_", NULL);
-			switch_core_media_bug_remove(session, &bug);
-			return;
-		}
-
-		/* We have already started */
-		switch_log_printf(
-			SWITCH_CHANNEL_LOG, 
-			SWITCH_LOG_WARNING, 
-			"Cannot run 2 at once on the same channel!\n"
-			);
-
-		return;
-	}
-
-	vmd_info = (vmd_session_info_t *)switch_core_session_alloc(
-		session, 
-		sizeof(vmd_session_info_t)
-		);
-
-	vmd_info->state = BEEP_NOT_DETECTED;
-	vmd_info->session = session;
-	vmd_info->pos = 0;
-	/*
-	vmd_info->data = NULL;
-	vmd_info->data_len = 0;
-	*/
-	for(i = 0; i < POINTS; i++){
-		vmd_info->points[i].freq = 0.0;
-		vmd_info->points[i].ampl = 0.0;
-	}
-
-	status = switch_core_media_bug_add(
-		session, 
-		vmd_callback, 
-		vmd_info,
-		0, 
-		SMBF_READ_REPLACE, 
-		&bug
-		);
-
-	if(status != SWITCH_STATUS_SUCCESS){
-		switch_log_printf(
-			SWITCH_CHANNEL_LOG,
-			SWITCH_LOG_ERROR,
-			"Failure hooking to stream\n"
-			);
-		return;
-	}
+    switch_media_bug_t *bug;
+    switch_status_t status;
+    switch_channel_t *channel;
+    vmd_session_info_t *vmd_info;
+    int i;
+
+    if (session == NULL)
+        return;
+
+    channel = switch_core_session_get_channel(session);
+
+    /* Is this channel already set? */
+    bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_vmd_");
+    /* If yes */
+    if (bug != NULL) {
+        /* If we have a stop remove audio bug */
+        if (strcasecmp(data, "stop") == 0) {
+            switch_channel_set_private(channel, "_vmd_", NULL);
+            switch_core_media_bug_remove(session, &bug);
+            return;
+        }
+
+        /* We have already started */
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot run 2 at once on the same channel!\n");
+
+        return;
+    }
 
-	switch_channel_set_private(channel, "_vmd_", bug);
+    vmd_info = (vmd_session_info_t *) switch_core_session_alloc(session, sizeof(vmd_session_info_t)
+        );
+
+    vmd_info->state = BEEP_NOT_DETECTED;
+    vmd_info->session = session;
+    vmd_info->pos = 0;
+    /*
+       vmd_info->data = NULL;
+       vmd_info->data_len = 0;
+     */
+    for (i = 0; i < POINTS; i++) {
+        vmd_info->points[i].freq = 0.0;
+        vmd_info->points[i].ampl = 0.0;
+    }
+
+    status = switch_core_media_bug_add(session, vmd_callback, vmd_info, 0, SMBF_READ_REPLACE, &bug);
+
+    if (status != SWITCH_STATUS_SUCCESS) {
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failure hooking to stream\n");
+        return;
+    }
+
+    switch_channel_set_private(channel, "_vmd_", bug);
 
 }
 
 /* Called when the system shuts down */
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_vmd_shutdown)
 {
-    switch_log_printf(
-	SWITCH_CHANNEL_LOG, 
-	SWITCH_LOG_NOTICE, 
-	"Voicemail detection disabled\n"
-    );
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Voicemail detection disabled\n");
 
     return SWITCH_STATUS_SUCCESS;
 }
@@ -568,11 +539,11 @@
     char *uuid;
     char *command;
     int i;
-    
+
     /* No command? Display usage */
-    if(cmd == NULL){
-	stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);
-	return SWITCH_STATUS_SUCCESS;
+    if (cmd == NULL) {
+        stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);
+        return SWITCH_STATUS_SUCCESS;
     }
 
     /* Duplicated contents of original string */
@@ -582,23 +553,23 @@
 
     /* If we don't have the expected number of parameters 
      * display usage */
-    if (argc != VMD_PARAMS){
-		stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);
-		switch_safe_free(ccmd);
-		return SWITCH_STATUS_SUCCESS;
+    if (argc != VMD_PARAMS) {
+        stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);
+        switch_safe_free(ccmd);
+        return SWITCH_STATUS_SUCCESS;
     }
 
     uuid = argv[0];
     command = argv[1];
-     
+
     /* using uuid locate a reference to the FreeSWITCH session */
     vmd_session = switch_core_session_locate(uuid);
 
     /* If the session was not found exit */
     if (vmd_session == NULL) {
-		switch_safe_free(ccmd);
-		stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);	
-		return SWITCH_STATUS_FALSE;
+        switch_safe_free(ccmd);
+        stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);
+        return SWITCH_STATUS_FALSE;
     }
 
     /* Get current channel of the session to tag the session
@@ -608,9 +579,9 @@
     /* Is this channel already set? */
     bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_vmd_");
     /* If yes */
-    if (bug != NULL){
+    if (bug != NULL) {
         /* If we have a stop remove audio bug */
-        if(strcasecmp(command, "stop") == 0) {
+        if (strcasecmp(command, "stop") == 0) {
             switch_channel_set_private(channel, "_vmd_", NULL);
             switch_core_media_bug_remove(vmd_session, &bug);
             switch_safe_free(ccmd);
@@ -618,30 +589,24 @@
             return SWITCH_STATUS_SUCCESS;
         }
 
-	/* We have already started */
-	switch_log_printf(
-	    SWITCH_CHANNEL_LOG, 
-	    SWITCH_LOG_WARNING, 
-	    "Cannot run 2 at once on the same channel!\n"
-	);
-	
-	switch_safe_free(ccmd);
-	return SWITCH_STATUS_FALSE;
+        /* We have already started */
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot run 2 at once on the same channel!\n");
+
+        switch_safe_free(ccmd);
+        return SWITCH_STATUS_FALSE;
     }
 
     /* If we don't see the expected start exit */
-    if(strcasecmp(command, "start") != 0) {
-		switch_safe_free(ccmd);	
-		stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);
-		return SWITCH_STATUS_FALSE;
+    if (strcasecmp(command, "start") != 0) {
+        switch_safe_free(ccmd);
+        stream->write_function(stream, "-USAGE: %s\n", VMD_SYNTAX);
+        return SWITCH_STATUS_FALSE;
     }
 
     /* Allocate memory attached to this FreeSWITCH session for
      * use in the callback routine and to store state information */
-    vmd_info = (vmd_session_info_t *)switch_core_session_alloc(
-	vmd_session, 
-	sizeof(vmd_session_info_t)
-    );
+    vmd_info = (vmd_session_info_t *) switch_core_session_alloc(vmd_session, sizeof(vmd_session_info_t)
+        );
 
     /* Set initial values and states */
     vmd_info->state = BEEP_NOT_DETECTED;
@@ -652,40 +617,29 @@
     vmd_info->data_len = 0;
 */
 
-    for(i = 0; i < POINTS; i++) {
-		vmd_info->points[i].freq = 0.0;
-		vmd_info->points[i].ampl = 0.0;
+    for (i = 0; i < POINTS; i++) {
+        vmd_info->points[i].freq = 0.0;
+        vmd_info->points[i].ampl = 0.0;
     }
 
     /* Add a media bug that allows me to intercept the 
      * reading leg of the audio stream */
-    status = switch_core_media_bug_add(
-	vmd_session, 
-	vmd_callback, 
-	vmd_info,
-	0, 
-	SMBF_READ_REPLACE, 
-	&bug
-    );
+    status = switch_core_media_bug_add(vmd_session, vmd_callback, vmd_info, 0, SMBF_READ_REPLACE, &bug);
 
     /* If adding a media bug fails exit */
     if (status != SWITCH_STATUS_SUCCESS) {
-		switch_log_printf(
-			SWITCH_CHANNEL_LOG, 
-			SWITCH_LOG_ERROR, 
-			"Failure hooking to stream\n"
-	);
-    
-	switch_safe_free(ccmd);
-	return SWITCH_STATUS_FALSE;
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failure hooking to stream\n");
+
+        switch_safe_free(ccmd);
+        return SWITCH_STATUS_FALSE;
     }
 
     /* Set the vmd tag to detect an existing vmd media bug */
     switch_channel_set_private(channel, "_vmd_", bug);
-    
+
     /* Everything went according to plan! Notify the user */
-    stream->write_function(stream, "+OK\n"); 
- 
+    stream->write_function(stream, "+OK\n");
+
     switch_safe_free(ccmd);
     return SWITCH_STATUS_SUCCESS;
 }
@@ -701,4 +655,3 @@
  * For VIM:
  * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
  */
-



More information about the Freeswitch-svn mailing list