]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
adding more fun stuff
authorBrian West <brian@freeswitch.org>
Thu, 10 Jul 2008 00:55:18 +0000 (00:55 +0000)
committerBrian West <brian@freeswitch.org>
Thu, 10 Jul 2008 00:55:18 +0000 (00:55 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8975 d0543943-73ff-0310-b7d9-9358b9ac24b2

conf/autoload_configs/pocketsphinx.conf.xml [new file with mode: 0644]
src/mod/applications/mod_enum/mod_enum.c
src/mod/asr_tts/mod_pocketsphinx/mod_pocketsphinx.c

diff --git a/conf/autoload_configs/pocketsphinx.conf.xml b/conf/autoload_configs/pocketsphinx.conf.xml
new file mode 100644 (file)
index 0000000..7f4016b
--- /dev/null
@@ -0,0 +1,8 @@
+<configuration name="pocketsphinx.conf" description="PocketSphinx ASR Configuration">
+  <settings>
+    <param name="threshold" value="400"/>
+    <param name="silence-hits" value="35"/>
+    <param name="listen-hits" value="5"/>
+    <param name="auto-reload" value="true"/>
+  </settings>
+</configuration>
index f8c505eb7c4df520000b85dbc0ad461a765c623c..945896a39b246c5d26621f2a15364c54b1fbedb9 100644 (file)
@@ -742,7 +742,6 @@ static void do_load(void)
        globals.timeout = 10;
        load_config();
        switch_mutex_unlock(MUTEX);
-       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "ENUM Reloaded\n");
 
 }
 
@@ -811,11 +810,11 @@ SWITCH_STANDARD_API(enum_function)
        return SWITCH_STATUS_SUCCESS;
 }
 
-
 static void event_handler(switch_event_t *event)
 {
        if (globals.auto_reload) {
                do_load();
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "ENUM Reloaded\n");
        }
 }
 
index 23276c75f83523bf576add1df938a614b56b3285..9afe3372696eaf35f26581fee5ac454213fa38c0 100644 (file)
@@ -38,8 +38,15 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_pocketsphinx_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_pocketsphinx_shutdown);
 SWITCH_MODULE_DEFINITION(mod_pocketsphinx, mod_pocketsphinx_load, mod_pocketsphinx_shutdown, NULL);
 
+static switch_mutex_t *MUTEX = NULL;
+static switch_event_node_t *NODE = NULL;
+
 static struct {
        char *model;
+       uint32_t thresh;
+    uint32_t silence_hits;
+       uint32_t listen_hits;
+       int auto_reload;
 } globals;
 
 typedef enum {
@@ -84,10 +91,10 @@ static switch_status_t pocketsphinx_asr_open(switch_asr_handle_t *ah, const char
        ah->codec = switch_core_strdup(ah->memory_pool, codec); 
 
        
-       ps->thresh = 400;
-       ps->silence_hits = 35;
+       ps->thresh = globals.thresh;
+       ps->silence_hits = globals.silence_hits;
+       ps->listen_hits = globals.listen_hits;
        ps->org_silence_hits = ps->silence_hits;
-       ps->listen_hits = 5;
 
        return SWITCH_STATUS_SUCCESS;
 }
@@ -386,9 +393,74 @@ static switch_status_t pocketsphinx_asr_get_results(switch_asr_handle_t *ah, cha
        return status;
 }
 
+static switch_status_t load_config(void)
+{
+       char *cf = "pocketsphinx.conf";
+       switch_xml_t cfg, xml = NULL, param, settings;
+       switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+       /* Set defaults */
+       globals.thresh = 400;
+       globals.silence_hits = 35;
+       globals.listen_hits = 5;
+
+       if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
+               status = SWITCH_STATUS_FALSE;
+               goto done;
+       }
+
+       if ((settings = switch_xml_child(cfg, "settings"))) {
+               for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+                       char *var = (char *) switch_xml_attr_soft(param, "name");
+                       char *val = (char *) switch_xml_attr_soft(param, "value");
+                       if (!strcasecmp(var, "threshold")) {
+                               globals.thresh = atoi(val);
+                       } else if (!strcasecmp(var, "silence-hits")) {
+                               globals.silence_hits = atoi(val);
+                       } else if (!strcasecmp(var, "listen-hits")) {
+                               globals.listen_hits = atoi(val);
+                       } else if (!strcasecmp(var, "auto-reload")) {
+                               globals.auto_reload = switch_true(val);
+                       }
+               }
+       }
+ done:
+       if (xml) {
+               switch_xml_free(xml);
+       }
+
+       return status;
+}
+
+static void do_load(void)
+{
+       switch_mutex_lock(MUTEX);
+       memset(&globals, 0, sizeof(globals));
+       load_config();
+       switch_mutex_unlock(MUTEX);
+}
+
+static void event_handler(switch_event_t *event)
+{
+       if (globals.auto_reload) {
+               do_load();
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "PocketSphinx Reloaded\n");
+       }
+}
+
 SWITCH_MODULE_LOAD_FUNCTION(mod_pocketsphinx_load)
 {
        switch_asr_interface_t *asr_interface;
+
+       switch_mutex_init(&MUTEX, SWITCH_MUTEX_NESTED, pool);\
+
+       if ((switch_event_bind_removable(modname, SWITCH_EVENT_RELOADXML, NULL, event_handler, NULL, &NODE) != SWITCH_STATUS_SUCCESS)) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n");
+       }
+
+       do_load();
+
        /* connect my internal structure to the blank pointer passed to me */
        *module_interface = switch_loadable_module_create_module_interface(pool, modname);
 
@@ -413,6 +485,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_pocketsphinx_load)
 
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_pocketsphinx_shutdown)
 {
+       switch_event_unbind(&NODE);
        return SWITCH_STATUS_UNLOAD;
 }