[Freeswitch-svn] [commit] r5606 - freeswitch/trunk/src/mod/asr_tts/mod_openmrcp

Freeswitch SVN greenlizard at freeswitch.org
Fri Aug 17 17:52:42 EDT 2007


Author: greenlizard
Date: Fri Aug 17 17:52:42 2007
New Revision: 5606

Modified:
   freeswitch/trunk/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c

Log:
throw errors when configuration is invalid.  check for null point in asr_feed to prevent segfault when testing against certain asr servers.

Modified: freeswitch/trunk/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c
==============================================================================
--- freeswitch/trunk/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c	(original)
+++ freeswitch/trunk/src/mod/asr_tts/mod_openmrcp/mod_openmrcp.c	Fri Aug 17 17:52:42 2007
@@ -24,6 +24,7 @@
  * Contributor(s):
  * 
  * Traun Leyden <tleyden at branchcut.com>
+ * Arsen Chaloyan <achaloyan at yahoo.com>
  *
  * Module which acts as an MRCP client to an MRCP speech recognition
  * server.  In other words it bridges freeswitch to an external speech
@@ -404,19 +405,6 @@
 	
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "asr_open called, codec: %s, rate: %d\n", codec, rate);
 
-	/*! 
-	  NOTE: According to the current FS media bugs design, the media bug can only feed audio
-	  data in SLIN (L16) format.  So we dont need to worry about other codecs.
-
-	  NOTE: forcing MRCP to use 20 as the CODEC_FRAME_TIME_BASE effectively ensures
-	  that it matches with 16-bit audio at 8kz with 320 byte frames.  in testing, leaving
-	  CODEC_FRAME_TIME_BASE at 10 and using pop (instead of trypop) in 
-	  openmrcp_recognizer_read_frame() actually produces clean audio, however it causes 
-      other problems as the full channel/session cleanup never completes in openmrcp, most 
-	  likely due to a thread being blocked on a pop call from audio queue.  but with trypop 
-	  (to avoid the cleanup problem), it only produces clean audio when CODEC_FRAME_TIME_BASE 
-	  is set to 20. 
-	 */
 	if (strcmp(codec,"L16")) {
 		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Sorry, only L16 codec supported\n");
 		return SWITCH_STATUS_GENERR;		
@@ -501,6 +489,9 @@
 	media_frame.codec_frame.size = 160;
 	media_frame.codec_frame.buffer = data;
 	while(len >= media_frame.codec_frame.size) {
+		if (!audio_sink) {
+			return SWITCH_STATUS_GENERR;
+		}
 		audio_sink->method_set->write_frame(audio_sink,&media_frame);
 		
 		len -= (unsigned int)media_frame.codec_frame.size;
@@ -653,7 +644,6 @@
 	mrcp_generic_header_t *generic_header;
 	mrcp_message_t *mrcp_message;
 
-	//buffer = (switch_byte_t *) switch_core_alloc(asr_session->pool, sizeof(switch_byte_t)*len);
 	char *text2speak;
 	const char xml_head[] = 
 		"<?xml version=\"1.0\"?>\r\n"
@@ -899,6 +889,9 @@
 			}
 		}
 	}
+	else {
+		goto error;
+	}
 	if ((profiles = switch_xml_child(cfg, "profiles"))) {
 		for (xprofile = switch_xml_child(profiles, "profile"); xprofile; xprofile = xprofile->next) {
 			const char *profile_name = switch_xml_attr_soft(xprofile, "name");
@@ -963,10 +956,18 @@
 			}
 		}
 	}
+	else {
+		goto error;
+	}
 
 	switch_xml_free(xml);
-
 	return SWITCH_STATUS_SUCCESS;
+
+ error:
+	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to load module configuration\n");
+	switch_xml_free(xml);
+	return SWITCH_STATUS_TERM;
+
 }
 
 static switch_status_t openmrcp_profile_run(openmrcp_profile_t *profile)
@@ -1015,7 +1016,9 @@
 	switch_core_hash_init(&openmrcp_module.profile_hash,openmrcp_module.pool);
 
 	/* read config */
-	do_config();
+	if (do_config() != SWITCH_STATUS_SUCCESS) {
+		return SWITCH_STATUS_FALSE;
+	}
 
 	/* run default asr/tts profiles */
 	if(openmrcp_module.asr_profile) {
@@ -1036,7 +1039,9 @@
 	mrcp_global_init();
 	
 	/* initialize openmrcp */
-	openmrcp_init();
+	if (openmrcp_init() != SWITCH_STATUS_SUCCESS) {
+		return SWITCH_STATUS_FALSE;		
+	}
 
 	/* indicate that the module should continue to be loaded */
 	return SWITCH_STATUS_SUCCESS;



More information about the Freeswitch-svn mailing list