[Freeswitch-svn] [commit] r5379 - in freeswitch/trunk/src: . include mod/applications/mod_commands mod/applications/mod_dptools

Freeswitch SVN anthm at freeswitch.org
Fri Jun 15 22:25:40 EDT 2007


Author: anthm
Date: Fri Jun 15 22:25:40 2007
New Revision: 5379

Modified:
   freeswitch/trunk/src/include/switch_ivr.h
   freeswitch/trunk/src/include/switch_types.h
   freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
   freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
   freeswitch/trunk/src/switch_event.c
   freeswitch/trunk/src/switch_ivr_async.c

Log:
upgrade fax_detect to tone_detect

Modified: freeswitch/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_ivr.h	(original)
+++ freeswitch/trunk/src/include/switch_ivr.h	Fri Jun 15 22:25:40 2007
@@ -233,18 +233,27 @@
 SWITCH_DECLARE(void) switch_ivr_session_echo(switch_core_session_t *session);
 
 /*!
-  \brief Stop looking for FAX CNG
+  \brief Stop looking for TONES
   \param session the session to stop looking
   \return SWITCH_STATUS_SUCCESS if all is well
 */
-SWITCH_DECLARE(switch_status_t) switch_ivr_stop_fax_detect_session(switch_core_session_t *session);
+SWITCH_DECLARE(switch_status_t) switch_ivr_stop_tone_detect_session(switch_core_session_t *session);
 
 /*!
-  \brief Start looking for FAX CNG
+  \brief Start looking for TONES
   \param session the session to start looking
+  \param key the name of the tone.
+  \param tone_spec comma sep list of tone freqs
+  \param flags one or both of 'r' and 'w'
+  \param timeout timeout
+  \param app optional application to execute when tone is found
+  \param data optional data for appliaction
   \return SWITCH_STATUS_SUCCESS if all is well
 */
-SWITCH_DECLARE(switch_status_t) switch_ivr_fax_detect_session(switch_core_session_t *session);
+SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_session_t *session, 
+															   const char *key, const char *tone_spec,
+															   const char *flags, time_t timeout,
+															   const char *app, const char *data);
 
 
 

Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h	(original)
+++ freeswitch/trunk/src/include/switch_types.h	Fri Jun 15 22:25:40 2007
@@ -852,7 +852,7 @@
 	SWITCH_EVENT_CODEC				- Codec Change
 	SWITCH_EVENT_BACKGROUND_JOB		- Background Job
 	SWITCH_EVENT_DETECTED_SPEECH	- Detected Speech
-	SWITCH_EVENT_DETECTED_FAX       - Detected Fax CNG Tone
+	SWITCH_EVENT_DETECTED_TONE      - Detected Tone
 	SWITCH_EVENT_PRIVATE_COMMAND	- A private command event 
 	SWITCH_EVENT_HEARTBEAT			- Machine is alive
 	SWITCH_EVENT_TRAP				- Error Trap
@@ -902,7 +902,7 @@
 	SWITCH_EVENT_CODEC,
 	SWITCH_EVENT_BACKGROUND_JOB,
 	SWITCH_EVENT_DETECTED_SPEECH,
-	SWITCH_EVENT_DETECTED_FAX,
+	SWITCH_EVENT_DETECTED_TONE,
 	SWITCH_EVENT_PRIVATE_COMMAND,
 	SWITCH_EVENT_HEARTBEAT,
 	SWITCH_EVENT_TRAP,

Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c	Fri Jun 15 22:25:40 2007
@@ -276,6 +276,51 @@
 	return SWITCH_STATUS_SUCCESS;
 }
 
+SWITCH_STANDARD_API(tone_detect_session_function)
+{
+	char *argv[6] = { 0 };
+	int argc;
+	char *mydata = NULL;
+	time_t to = 0;
+	switch_core_session_t *rsession;
+	
+	mydata = switch_core_session_strdup(session, cmd);
+	if ((argc = switch_separate_string(mydata, ' ', argv, sizeof(argv) / sizeof(argv[0]))) < 3) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "INVALID ARGS!\n");
+	}
+
+	if (!(rsession = switch_core_session_locate(argv[0]))) {
+		stream->write_function(stream, "-Error Cannot locate session!\n");
+		return SWITCH_STATUS_SUCCESS;
+	}
+
+	if (argv[4]) {
+		uint32_t mto;
+		if (*argv[2] == '+') {
+			if ((mto = atoi(argv[3]+1)) > 0) {
+				to = time(NULL) + mto;
+			} else {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "INVALID Timeout!\n");
+				goto done;
+			}
+		} else {
+			if ((to = atoi(argv[3])) < time(NULL)) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "INVALID Timeout!\n");
+				to = 0;
+				goto done;
+			}
+		}
+	}
+
+	switch_ivr_tone_detect_session(rsession, argv[1], argv[2], argv[3], to, argv[5], argv[6]);
+	stream->write_function(stream, "Enabling tone detection '%s' '%s' '%s'\n", argv[1], argv[2], argv[3]);
+
+ done:
+
+	switch_core_session_rwunlock(rsession);
+
+	return SWITCH_STATUS_SUCCESS;
+}
 
 SWITCH_STANDARD_API(sched_transfer_function)
 {
@@ -1385,13 +1430,22 @@
 	/*.next */ &reload_api_interface
 };
 
+static switch_api_interface_t tone_detect_session_interface = {
+	/*.interface_name */ "tone_Detect",
+	/*.desc */ "Start Tone Detection on a channel",
+	/*.function */ tone_detect_session_function,
+	/*.syntax */
+	"<uuid> <key> <tone_spec> [<flags> <timeout> <app> <args>]",
+	/*.next */ &kill_api_interface
+};
+
 static switch_api_interface_t originate_api_interface = {
 	/*.interface_name */ "originate",
 	/*.desc */ "Originate a Call",
 	/*.function */ originate_function,
 	/*.syntax */
 	"<call url> <exten>|&<application_name>(<app_args>) [<dialplan>] [<context>] [<cid_name>] [<cid_num>] [<timeout_sec>]",
-	/*.next */ &kill_api_interface
+	/*.next */ &tone_detect_session_interface
 };
 
 static switch_loadable_module_interface_t commands_module_interface = {

Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	(original)
+++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c	Fri Jun 15 22:25:40 2007
@@ -664,20 +664,45 @@
 
 static void fax_detect_session_function(switch_core_session_t *session, char *data)
 {
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Enabling fax detection\n");
-	switch_ivr_fax_detect_session(session);
+	switch_ivr_tone_detect_session(session, "fax", "1100.0", "r", 0, NULL, NULL);
 }
 
-static void system_session_function(switch_core_session_t *session, char *data)
+static void tone_detect_session_function(switch_core_session_t *session, char *data)
 {
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Executing command: %s\n",data);
-    system(data);
+	char *argv[6] = { 0 };
+	int argc;
+	char *mydata = NULL;
+	time_t to = 0;
+
+	mydata = switch_core_session_strdup(session, data);
+	if ((argc = switch_separate_string(mydata, ' ', argv, sizeof(argv) / sizeof(argv[0]))) < 2) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "INVALID ARGS!\n");
+	}
+	if (argv[3]) {
+		uint32_t mto;
+		if (*argv[2] == '+') {
+			if ((mto = atoi(argv[2]+1)) > 0) {
+				to = time(NULL) + mto;
+			} else {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "INVALID Timeout!\n");
+			}
+		} else {
+			if ((to = atoi(argv[2])) < time(NULL)) {
+				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "INVALID Timeout!\n");
+				to = 0;
+			}
+		}
+	}
+
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Enabling tone detection '%s' '%s'\n", argv[0], argv[1]);
+	
+	switch_ivr_tone_detect_session(session, argv[0], argv[1], argv[2], to, argv[4], argv[5]);
 }
 
 static void stop_fax_detect_session_function(switch_core_session_t *session, char *data)
 {
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Disabling fax detection\n");
-	switch_ivr_stop_fax_detect_session(session);
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Disabling tone detection\n");
+	switch_ivr_stop_tone_detect_session(session);
 }
 
 static void echo_function(switch_core_session_t *session, char *data)
@@ -1018,15 +1043,6 @@
 	/*.next */ &dptools_api_interface
 };
 
-static switch_application_interface_t system_application_interface = {
-    /*.interface_name */ "system",
-    /*.application_function */ system_session_function,
-    /* long_desc */ "Execute a system command",
-    /* short_desc */ "Execute a system command",
-    /* syntax */ "<command>",
-    /* flags */ SAF_NONE,
-    /*.next */ NULL
-};
 
 static switch_application_interface_t bridge_application_interface = {
 	/*.interface_name */ "bridge",
@@ -1034,8 +1050,7 @@
 	/* long_desc */ "Bridge the audio between two sessions",
 	/* short_desc */ "Bridge Audio",
 	/* syntax */ "<channel_url>",
-	/* flags */ SAF_SUPPORT_NOMEDIA,
-	/* next */ &system_application_interface
+	/* flags */ SAF_SUPPORT_NOMEDIA
 };
 
 static switch_application_interface_t speak_application_interface = {
@@ -1129,6 +1144,17 @@
 	/*.next */ &park_application_interface
 };
 
+
+static switch_application_interface_t tone_detect_application_interface = {
+	/*.interface_name */ "tone_detect",
+	/*.application_function */ tone_detect_session_function,
+	/* long_desc */ "Detect tones",
+	/* short_desc */ "Detect tones",
+	/* syntax */ "",
+	/* flags */ SAF_NONE,
+	/*.next */ &echo_application_interface
+};
+
 static switch_application_interface_t fax_detect_application_interface = {
 	/*.interface_name */ "fax_detect",
 	/*.application_function */ fax_detect_session_function,
@@ -1136,14 +1162,14 @@
 	/* short_desc */ "Detect faxes",
 	/* syntax */ "",
 	/* flags */ SAF_NONE,
-	/*.next */ &echo_application_interface
+	/*.next */ &tone_detect_application_interface
 };
 
-static switch_application_interface_t stop_fax_detect_application_interface = {
-	/*.interface_name */ "stop_fax_detect",
+static switch_application_interface_t stop_tone_detect_application_interface = {
+	/*.interface_name */ "stop_tone_detect",
 	/*.application_function */ stop_fax_detect_session_function,
-	/* long_desc */ "Stop detecting fax send tones",
-	/* short_desc */ "stop detecting faxes",
+	/* long_desc */ "Stop detecting tones",
+	/* short_desc */ "stop detecting tones",
 	/* syntax */ "",
 	/* flags */ SAF_NONE,
 	/* next */ &fax_detect_application_interface
@@ -1156,7 +1182,7 @@
 	/* short_desc */ "Detect dtmf",
 	/* syntax */ "",
 	/* flags */ SAF_NONE,
-	/* next */ &stop_fax_detect_application_interface
+	/* next */ &stop_tone_detect_application_interface
 };
 
 static switch_application_interface_t stop_dtmf_application_interface = {

Modified: freeswitch/trunk/src/switch_event.c
==============================================================================
--- freeswitch/trunk/src/switch_event.c	(original)
+++ freeswitch/trunk/src/switch_event.c	Fri Jun 15 22:25:40 2007
@@ -133,7 +133,7 @@
 	"CODEC",
 	"BACKGROUND_JOB",
 	"DETECTED_SPEECH",
-	"DETECTED_FAX",
+	"DETECTED_TONE",
 	"PRIVATE_COMMAND",
 	"HEARTBEAT",
 	"TRAP",

Modified: freeswitch/trunk/src/switch_ivr_async.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_async.c	(original)
+++ freeswitch/trunk/src/switch_ivr_async.c	Fri Jun 15 22:25:40 2007
@@ -138,18 +138,18 @@
 			if (dh->mux) {
 				int16_t buf[1024];
 				int16_t *fp = frame->data;
-				int x;
+				uint32_t x;
 				
 				switch_core_file_read(&dh->fh, buf, &len);
 				
-				for(x = 0; x < len; x++) {
+				for(x = 0; x < (uint32_t) len; x++) {
 					int32_t mixed = fp[x] + buf[x];
 					switch_normalize_to_16bit(mixed);
 					fp[x] = (int16_t) mixed;
 				}
 			} else {
 				switch_core_file_read(&dh->fh, frame->data, &len);
-				frame->samples = len;
+				frame->samples = (uint32_t) len;
 				frame->datalen = frame->samples * 2;
 			}
 			switch_core_media_bug_set_write_replace_frame(bug, frame);
@@ -477,117 +477,211 @@
 }
 
 
+#define MAX_TONES 16
 typedef struct {
-  switch_core_session_t *session;
-  teletone_multi_tone_t mt;
-} switch_fax_detect_t;
-
-static switch_bool_t fax_detect_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
-{
-  switch_fax_detect_t *pvt = (switch_fax_detect_t *) user_data;
-  uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
-  switch_frame_t frame = { 0 };
-  //  switch_channel_t *channel = switch_core_session_get_channel(pvt->session);
-
-  //  assert(channel != NULL);
-  frame.data = data;
-  frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
-
-  switch (type) {
-  case SWITCH_ABC_TYPE_INIT:
-    break;
-  case SWITCH_ABC_TYPE_CLOSE:
-    break;
-  case SWITCH_ABC_TYPE_READ:
-    if (switch_core_media_bug_read(bug, &frame) == SWITCH_STATUS_SUCCESS) {
-      if(teletone_multi_tone_detect(&pvt->mt, frame.data, frame.samples)) {
-	switch_event_t *event;
+	teletone_multi_tone_t mt;
+	char *app;
+	char *data;
+	char *key;
+	teletone_tone_map_t map;
+	int up;
+} switch_tone_detect_t;
 
-	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "FAX CNG DETECTED\n");
 
-	if (switch_event_create(&event, SWITCH_EVENT_DETECTED_FAX) == SWITCH_STATUS_SUCCESS) {
-	  switch_event_t *dup;
+typedef struct {
+	switch_tone_detect_t list[MAX_TONES+1];
+	int index;
+	switch_media_bug_t *bug;
+	switch_core_session_t *session;
+} switch_tone_container_t;
 
-	  switch_event_add_header(event, SWITCH_STACK_BOTTOM, "fax", "detected");
-	    
-	  if (switch_event_dup(&dup, event) == SWITCH_STATUS_SUCCESS) {
-	    switch_event_fire(&dup);
-	  }
-	    
+static switch_bool_t tone_detect_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type)
+{
+	switch_tone_container_t *cont = (switch_tone_container_t *) user_data;
+	switch_frame_t *frame = NULL;
+	int i = 0;
 
-	  if (switch_core_session_queue_event(pvt->session, &event) != SWITCH_STATUS_SUCCESS) {
-	    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Event queue failed!\n");
-	    switch_event_add_header(event, SWITCH_STACK_BOTTOM, "delivery-failure", "true");
-	    switch_event_fire(&event);
-	  }
+	switch (type) {
+	case SWITCH_ABC_TYPE_INIT:
+		break;
+	case SWITCH_ABC_TYPE_CLOSE:
+		break;
+	case SWITCH_ABC_TYPE_READ_REPLACE:
+		frame = switch_core_media_bug_get_read_replace_frame(bug);
+	case SWITCH_ABC_TYPE_WRITE_REPLACE:
+		{
+
+			if (!frame) {
+				frame = switch_core_media_bug_get_write_replace_frame(bug);
+			}
+			
+			for (i = 0 ; i < cont->index; cont++) {
+				if (cont->list[i].up && teletone_multi_tone_detect(&cont->list[i].mt, frame->data, frame->samples)) {
+					switch_event_t *event;
+					
+					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "TONE %s DETECTED\n", cont->list[i].key);
+
+					if (cont->list[i].app) {
+						if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
+							switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "execute");
+							switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-name", "%s", cont->list[i].app);
+							switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-arg", "%s", cont->list[i].data);
+							switch_event_add_header(event, SWITCH_STACK_BOTTOM, "lead-frames", "%d", 5);
+							switch_core_session_queue_private_event(cont->session, &event);
+						}
+					}
+
+					cont->list[cont->index].up = 0;
+
+					if (switch_event_create(&event, SWITCH_EVENT_DETECTED_TONE) == SWITCH_STATUS_SUCCESS) {
+						switch_event_t *dup;
+						switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Detected-Tone", "%s", cont->list[i].key);
+						
+						if (switch_event_dup(&dup, event) == SWITCH_STATUS_SUCCESS) {
+							switch_event_fire(&dup);
+						}
+	    
+						if (switch_core_session_queue_event(cont->session, &event) != SWITCH_STATUS_SUCCESS) {
+							switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Event queue failed!\n");
+							switch_event_add_header(event, SWITCH_STACK_BOTTOM, "delivery-failure", "true");
+							switch_event_fire(&event);
+						}
+					}
+				}
+			}
+		}
+		break;
+	case SWITCH_ABC_TYPE_WRITE:
+	default:
+		break;
 	}
-      }
-    }
-    break;
-  case SWITCH_ABC_TYPE_WRITE:
-  default:
-    break;
-  }
-  return SWITCH_TRUE;
+	return SWITCH_TRUE;
 }
 
-SWITCH_DECLARE(switch_status_t) switch_ivr_stop_fax_detect_session(switch_core_session_t *session)
+SWITCH_DECLARE(switch_status_t) switch_ivr_stop_tone_detect_session(switch_core_session_t *session)
 {
-  switch_media_bug_t *bug;
-  switch_channel_t *channel = switch_core_session_get_channel(session);
-
-  assert(channel != NULL);
-  if ((bug = switch_channel_get_private(channel, "fax"))) {
-    switch_channel_set_private(channel, "fax", NULL);
-    switch_core_media_bug_remove(session, &bug);
-    return SWITCH_STATUS_SUCCESS;
-  }
-
-  return SWITCH_STATUS_FALSE;
+	switch_channel_t *channel = switch_core_session_get_channel(session);
+	switch_tone_container_t *cont;
+	
+	assert(channel != NULL);
+	if ((cont = switch_channel_get_private(channel, "_tone_detect_"))) {
+		switch_channel_set_private(channel, "_tone_detect_", NULL);
+		switch_core_media_bug_remove(session, &cont->bug);
+		return SWITCH_STATUS_SUCCESS;
+	}
 
+	return SWITCH_STATUS_FALSE;
+	
 }
 
-SWITCH_DECLARE(switch_status_t) switch_ivr_fax_detect_session(switch_core_session_t *session)
+SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_session_t *session, 
+															   const char *key, const char *tone_spec,
+															   const char *flags, time_t timeout,
+															   const char *app, const char *data)
 {
   switch_channel_t *channel;
   switch_codec_t *read_codec;
-  switch_media_bug_t *bug;
   switch_status_t status;
-  switch_fax_detect_t *pvt;
-  teletone_tone_map_t *map;
-  int i;
+  switch_tone_container_t *cont = NULL;
+  char *p, *next;
+  int i = 0, ok = 0;
+
+  switch_media_bug_flag_t bflags = 0;
 
   channel = switch_core_session_get_channel(session);
   assert(channel != NULL);
 
-
   read_codec = switch_core_session_get_read_codec(session);
   assert(read_codec != NULL);
+  
+  if (switch_strlen_zero(key)) {
+	  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Key Specified!\n");
+	  return SWITCH_STATUS_FALSE;
+  }
+  
+  if ((cont = switch_channel_get_private(channel, "_tone_detect_"))) {
+	  if (cont->index >= MAX_TONES) {
+		  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Max Tones Reached!\n");
+		  return SWITCH_STATUS_FALSE;
+	  }
 
-  if (!(pvt = switch_core_session_alloc(session, sizeof(*pvt)))) {
-    return SWITCH_STATUS_MEMERR;
+	  for(i = 0; i < cont->index; i++) {
+		  if (!strcasecmp(key, cont->list[cont->index].key )) {
+			  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Renabling %s\n", key);
+			  cont->list[cont->index].up = 1;
+			  teletone_multi_tone_init(&cont->list[i].mt, &cont->list[i].map);
+			  return SWITCH_STATUS_SUCCESS;
+		  }
+	  }
   }
 
-  if (!(map = switch_core_session_alloc(session, sizeof(*map)))) {
-    return SWITCH_STATUS_MEMERR;
+  if (switch_strlen_zero(tone_spec)) {
+	  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Spec Specified!\n");
+	  return SWITCH_STATUS_FALSE;
   }
 
-  for(i=0;i<TELETONE_MAX_TONES;i++) {
-    map->freqs[i] = 1100.0;
+  if (!cont && !(cont = switch_core_session_alloc(session, sizeof(*cont)))) {
+	  return SWITCH_STATUS_MEMERR;
   }
-  pvt->mt.sample_rate = read_codec->implementation->samples_per_second;
-  pvt->session = session;
 
-  teletone_multi_tone_init(&pvt->mt, map);
+  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Adding tone spec %s index %d\n", tone_spec, cont->index);
 
-  switch_channel_answer(channel);
+  i = 0;
+  p = (char *) tone_spec;
+
+  do {
+	  teletone_process_t this;
+	  next = strchr(p, ',');
+	  while(*p == ' ') p++;
+	  if ((this = (teletone_process_t) atof(p))) {
+		  ok++;
+		  cont->list[cont->index].map.freqs[i++] = this;
+	  }
+	  if (next) {
+		  p = next + 1;
+	  }
+  } while (next);
+
+  if (!ok) {
+	  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid tone spec!\n");
+	  return SWITCH_STATUS_FALSE;
+
+  }
 
-  if ((status = switch_core_media_bug_add(session, fax_detect_callback, pvt, 0, SMBF_READ_STREAM, &bug)) != SWITCH_STATUS_SUCCESS) {
-    return status;
+  cont->list[cont->index].key = switch_core_session_strdup(session, key);
+
+  if (app) {
+	  cont->list[cont->index].app = switch_core_session_strdup(session, app);
+  }
+  
+  if (data) {
+	  cont->list[cont->index].data = switch_core_session_strdup(session, data);
   }
 
-  switch_channel_set_private(channel, "fax", bug);
+  cont->list[cont->index].up = 1;
+  cont->list[cont->index].mt.sample_rate = read_codec->implementation->samples_per_second;
+  teletone_multi_tone_init(&cont->list[cont->index].mt, &cont->list[cont->index].map);
+  cont->session = session;
+  
+  switch_channel_answer(channel);
+  
+  if (switch_strlen_zero(flags)) {
+	  bflags = SMBF_READ_REPLACE;
+  } else {
+	  if (strchr(flags, 'r')) {
+		  bflags |= SMBF_READ_REPLACE;
+	  } else if (strchr(flags, 'w')) {
+		  bflags |= SMBF_WRITE_REPLACE;
+	  }
+  }
+
+  if ((status = switch_core_media_bug_add(session, tone_detect_callback, cont, timeout, bflags, &cont->bug)) != SWITCH_STATUS_SUCCESS) {
+	  return status;
+  }
 
+  switch_channel_set_private(channel, "_tone_detect_", cont);
+  cont->index++;
+  
   return SWITCH_STATUS_SUCCESS;
 }
 



More information about the Freeswitch-svn mailing list