]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add tone2wav
authorAnthony Minessale <anthm@freeswitch.org>
Tue, 14 Sep 2010 16:48:43 +0000 (11:48 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Tue, 14 Sep 2010 16:48:43 +0000 (11:48 -0500)
Makefile.am
libs/freetdm/src/libteletone_generate.c
libs/libteletone/src/libteletone_generate.c
src/include/switch_loadable_module.h
src/include/switch_types.h
src/switch_core.c
src/switch_loadable_module.c
src/switch_rtp.c
src/tone2wav.c [new file with mode: 0644]

index a26346277ac442ed4614715561fa32e1f0ca3245..077dfeccdfe6ef8d85ead27524a6d48f82a65af1 100644 (file)
@@ -267,7 +267,7 @@ src/include/switch_swigable_cpp.h: $(switch_srcdir)/src/include/switch_cpp.h
 ##
 ## Applications
 ##
-bin_PROGRAMS = freeswitch fs_cli fs_ivrd
+bin_PROGRAMS = freeswitch fs_cli fs_ivrd tone2wav
 
 ##
 ## fs_cli ()
@@ -281,6 +281,14 @@ fs_cli_CFLAGS += -DHAVE_EDITLINE -I$(switch_srcdir)/libs/libedit/src
 fs_cli_LDADD   = libs/libedit/src/.libs/libedit.a
 endif
 
+##
+## tone2wav ()
+##
+tone2wav_SOURCES = src/tone2wav.c
+tone2wav_CFLAGS  = $(AM_CFLAGS)
+tone2wav_LDFLAGS = $(AM_LDFLAGS) -lm
+tone2wav_LDADD   = libfreeswitch.la
+
 ##
 ## fs_ivrd ()
 ##
index 089268bc7b5d4d29889c41293a32b6f826c6ab7f..3abbebba2efaa69ed2c88e2524d5cd0e6e9eb578 100644 (file)
@@ -244,7 +244,7 @@ TELETONE_API(int) teletone_mux_tones(teletone_generation_session_t *ts, teletone
 
        if (ts->debug && ts->debug_stream) {
                if (map->freqs[0] <= 0) {
-                       fprintf(ts->debug_stream, "wait %d (%dms)\n", wait, wait / (ts->rate / 1000));
+                       fprintf(ts->debug_stream, "wait %d (%dms)\n", wait, wait / (ts->rate / 1000 / ts->channels ? ts->channels : 1));
                } else {
                        fprintf(ts->debug_stream, "Generate: (");
 
@@ -256,14 +256,14 @@ TELETONE_API(int) teletone_mux_tones(teletone_generation_session_t *ts, teletone
                                        ") [volume %0.2fdB; samples %d(%dms) x %d channel%s; wait %d(%dms); decay_factor %0.2fdB; decay_step %d(%dms); wrote %d bytes]\n",
                                        ts->volume,
                                        duration,
-                                       duration / (ts->rate / 1000), 
+                                       duration / (ts->rate / 1000 / ts->channels ? ts->channels : 1), 
                                        ts->channels,
                                        ts->channels == 1 ? "" : "s",
                                        wait,
-                                       wait / (ts->rate / 1000),
+                                       wait / (ts->rate / 1000 / ts->channels ? ts->channels : 1),
                                        ts->decay_factor,
                                        ts->decay_step,
-                                       ts->decay_step / (ts->rate / 1000),                                     
+                                       ts->decay_step / (ts->rate / 1000 / ts->channels ? ts->channels : 1),                                   
                                        ts->samples * 2);
                }
        }       
@@ -307,7 +307,7 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
                                        ts->rate = atoi(cur + 2);
                                        break;
                                case 'd':
-                                       ts->duration = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->duration = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        break;
                                case 'v':
                                        {
@@ -318,18 +318,18 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
                                        }
                                        break;
                                case '>':
-                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        ts->decay_direction = -1;
                                        break;
                                case '<':
-                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        ts->decay_direction = 1;
                                        break;
                                case '+':
                                        ts->decay_factor = (float)atof(cur + 2);
                                        break;
                                case 'w':
-                                       ts->wait = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->wait = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        break;
                                case 'l':
                                        ts->loops = atoi(cur + 2); 
@@ -369,10 +369,10 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
                                                                        *next++ = '\0';
                                                                }
                                                                if (i == 0) {
-                                                                       ts->tmp_duration = atoi(p) * (ts->rate / 1000);
+                                                                       ts->tmp_duration = atoi(p) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                                                        i++;
                                                                } else if (i == 1) {
-                                                                       ts->tmp_wait = atoi(p) * (ts->rate / 1000);
+                                                                       ts->tmp_wait = atoi(p) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                                                        i++;
                                                                } else {
                                                                        mymap.freqs[i++ - 2] = atof(p);
index 911e3c27971320f6a48257542eaa33ed615b49c2..1608f47bb771c785828f2016514a2c13696f1d9d 100644 (file)
@@ -355,7 +355,7 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
                                        ts->rate = atoi(cur + 2);
                                        break;
                                case 'd':
-                                       ts->duration = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->duration = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        break;
                                case 'v':
                                        {
@@ -366,18 +366,18 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
                                        }
                                        break;
                                case '>':
-                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        ts->decay_direction = -1;
                                        break;
                                case '<':
-                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->decay_step = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        ts->decay_direction = 1;
                                        break;
                                case '+':
                                        ts->decay_factor = (float)atof(cur + 2);
                                        break;
                                case 'w':
-                                       ts->wait = atoi(cur + 2) * (ts->rate / 1000);
+                                       ts->wait = atoi(cur + 2) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                        break;
                                case 'l':
                                        ts->loops = atoi(cur + 2); 
@@ -417,10 +417,10 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
                                                                        *next++ = '\0';
                                                                }
                                                                if (i == 0) {
-                                                                       ts->tmp_duration = atoi(p) * (ts->rate / 1000);
+                                                                       ts->tmp_duration = atoi(p) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                                                        i++;
                                                                } else if (i == 1) {
-                                                                       ts->tmp_wait = atoi(p) * (ts->rate / 1000);
+                                                                       ts->tmp_wait = atoi(p) * (ts->rate / 1000 / ts->channels ? ts->channels : 1);
                                                                        i++;
                                                                } else {
                                                                        mymap.freqs[i++ - 2] = atof(p);
index 68719062b74e984dc795e7c2544c9814a6d63793..37c752bd3e0e846c8806d22e0e72b7692e19053b 100644 (file)
@@ -92,7 +92,7 @@ SWITCH_BEGIN_EXTERN_C
   \brief Initilize the module backend and load all the modules
   \return SWITCH_STATUS_SUCCESS when complete
  */
-SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(void);
+SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autoload);
 
 /*!
   \brief Shutdown the module backend and call the shutdown routine in all loaded modules
index c3b649cb68880713ceb9087c92b6f52ee3a9b542..b0395bafdcd48526e3ce48e31f46d38f349c993d 100644 (file)
@@ -255,7 +255,8 @@ typedef enum {
        SCF_USE_CLOCK_RT = (1 << 10),
        SCF_VERBOSE_EVENTS = (1 << 11),
        SCF_USE_WIN32_MONOTONIC = (1 << 12),
-       SCF_AUTO_SCHEMAS = (1 << 13)
+       SCF_AUTO_SCHEMAS = (1 << 13),
+       SCF_MINIMAL = (1 << 14)
 } switch_core_flag_enum_t;
 typedef uint32_t switch_core_flag_t;
 
index 4bfc02e6550dea3c51f5ee48015d400fdfc10387..0a457238709d7eeed9cf709dcaa78e75e15cfb64 100644 (file)
@@ -1315,6 +1315,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
 
        switch_log_init(runtime.memory_pool, runtime.colorize_console);
 
+       if (flags & SCF_MINIMAL) return SWITCH_STATUS_SUCCESS;
+                                                                                                          
        runtime.tipping_point = 5000;
        runtime.timer_affinity = -1;
        
@@ -1594,7 +1596,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init_and_modload(switch_core_flag_t
 
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Bringing up environment.\n");
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Loading Modules.\n");
-       if (switch_loadable_module_init() != SWITCH_STATUS_SUCCESS) {
+       if (switch_loadable_module_init(SWITCH_TRUE) != SWITCH_STATUS_SUCCESS) {
                *err = "Cannot load modules";
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Error: %s\n", *err);
                return SWITCH_STATUS_GENERR;
@@ -1902,6 +1904,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_destroy(void)
        switch_scheduler_task_thread_stop();
 
        switch_rtp_shutdown();
+
        if (switch_test_flag((&runtime), SCF_USE_AUTO_NAT)) {
                switch_nat_shutdown();
        }
index bf636dd4c2c6ba190e0f5c3c4fac87a287aae53b..d23b4226e357b78fcc1c7c895aa4bf4133236949 100644 (file)
@@ -1218,7 +1218,7 @@ static void switch_loadable_module_path_init()
 }
 #endif
 
-SWITCH_DECLARE(switch_status_t) switch_loadable_module_init()
+SWITCH_DECLARE(switch_status_t) switch_loadable_module_init(switch_bool_t autoload)
 {
 
        apr_finfo_t finfo = { 0 };
@@ -1268,6 +1268,8 @@ SWITCH_DECLARE(switch_status_t) switch_loadable_module_init()
        switch_core_hash_init_nocase(&loadable_modules.dialplan_hash, loadable_modules.pool);
        switch_mutex_init(&loadable_modules.mutex, SWITCH_MUTEX_NESTED, loadable_modules.pool);
 
+       if (!autoload) return SWITCH_STATUS_SUCCESS;
+
        switch_loadable_module_load_module("", "CORE_SOFTTIMER_MODULE", SWITCH_FALSE, &err);
        switch_loadable_module_load_module("", "CORE_PCM_MODULE", SWITCH_FALSE, &err);
 
index 710415afdb9b61a62d13412e75a547e215b0bdd6..969309ec89f27bdae33308c7831a35e2b17fc346 100644 (file)
@@ -662,6 +662,10 @@ SWITCH_DECLARE(void) switch_rtp_shutdown(void)
        const void *var;
        void *val;
 
+       if (!global_init) {
+               return;
+       }
+
        switch_mutex_lock(port_lock);
 
        for (hi = switch_hash_first(NULL, alloc_hash); hi; hi = switch_hash_next(hi)) {
diff --git a/src/tone2wav.c b/src/tone2wav.c
new file mode 100644 (file)
index 0000000..bf51e3a
--- /dev/null
@@ -0,0 +1,193 @@
+/* 
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2010, Anthony Minessale II <anthm@freeswitch.org>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthm@freeswitch.org>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * 
+ * Anthony Minessale II <anthm@freeswitch.org>
+ * Michael Jerris <mike@jerris.com>
+ * Pawel Pierscionek <pawel@voiceworks.pl>
+ * Bret McDanel <trixter AT 0xdecafbad.com>
+ *
+ *
+ * tone2wav.c -- Generate a .wav from teletone spec
+ *
+ */
+
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 600
+#endif
+
+#ifndef WIN32
+#ifdef HAVE_SETRLIMIT
+#include <sys/resource.h>
+#endif
+#endif
+
+#include <switch.h>
+#include <switch_version.h>
+
+
+
+/* Picky compiler */
+#ifdef __ICC
+#pragma warning (disable:167)
+#endif
+
+
+static int teletone_handler(teletone_generation_session_t *ts, teletone_tone_map_t *map)
+{
+       switch_file_handle_t *fh = (switch_file_handle_t *) ts->user_data;
+       int wrote;
+       switch_size_t len;
+
+       wrote = teletone_mux_tones(ts, map);
+
+       len = wrote;
+       if (switch_core_file_write(fh, ts->buffer, &len) != SWITCH_STATUS_SUCCESS) {
+               return -1;
+       }
+
+       return 0;
+}
+
+#define fail() r = 255; goto end
+
+/* the main application entry point */
+int main(int argc, char *argv[])
+{
+       teletone_generation_session_t ts;
+       int file_flags = SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT;
+       int r = 0;
+       int rate = 8000;
+       char *file = NULL, *script = NULL;
+       switch_file_handle_t fh = { 0 };
+       const char *err = NULL;
+       switch_bool_t verbose = SWITCH_FALSE;
+       int i = 0, c = 1, help = 0;
+
+       for(i = 1; i < argc; i++) {
+               if (!strstr(argv[i], "-")) break;
+               
+               if (!strcmp(argv[i], "-v")) {
+                       verbose = SWITCH_TRUE;
+               }
+
+               if (!strcmp(argv[i], "-s")) {
+                       c = 2;
+               }
+
+               if (!strcmp(argv[i], "-h")) {
+                       help = 1;
+               }
+
+               if (!strncmp(argv[i], "-R", 2)) {
+                       char *p = argv[i] + 2;
+
+                       if (p) {
+                               int tmp = atoi(p);
+                               if (tmp > 0) {
+                                       rate = tmp;
+                               }
+                       }
+               }
+       }
+
+       if (argc - i != 2 || help) {
+               char *app = NULL;
+
+               if (!help) printf("Invalid input!\n");
+
+               if ((app = strrchr(argv[0], '/'))) {
+                       app++;
+               } else {
+                       app = argv[0];
+               }
+
+
+               printf("USAGE: %s [options] <file> <tones>\n", app);
+               printf("================================================================================\n");
+               printf("Options:\n"
+                          "-s\t\tStereo\n"
+                          "-h\t\tHelp\n"
+                          "-R<rate>\tSet Rate (8000,16000,32000,48000) etc.\n"
+                          "-v\t\tVerbose Logging\n"
+                          "<file>\t\tAny file supported by libsndfile\n"
+                          "<tones>\t\tA valid teletone script http://wiki.freeswitch.org/wiki/TGML"
+                          "\n\n\n"
+                          );
+               return 255;
+       }
+       
+       file = argv[i];
+       script = argv[i+1];
+
+       if (switch_core_init(SCF_MINIMAL, verbose, &err) != SWITCH_STATUS_SUCCESS) {
+               printf("Cannot init core [%s]\n", err);
+               fail();
+       }
+
+       switch_loadable_module_init(SWITCH_FALSE);
+
+       if (switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) "mod_sndfile", SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) {
+               printf("Cannot init mod_sndfile [%s]\n", err);
+               fail();
+       }
+       
+       if (switch_core_file_open(&fh, file, c, rate, file_flags, NULL) != SWITCH_STATUS_SUCCESS) {
+               printf("Cannot open file %s\n", file);
+               fail();
+       }
+       
+       teletone_init_session(&ts, 0, teletone_handler, &fh);
+       ts.rate = rate;
+       ts.channels = c;
+       ts.duration = 250 * (rate / 1000 / c);
+       ts.wait = 50 * (rate / 1000 / c);
+       if (verbose) {
+               ts.debug = 10;
+               ts.debug_stream = stdout;
+       }
+       teletone_run(&ts, script);
+       teletone_destroy_session(&ts);
+       switch_core_file_close(&fh);
+       
+       printf("File: %s generated.....\nPlease support:\n\nFreeSWITCH http://www.freeswitch.org\nClueCon http://www.cluecon.com\n", file);
+
+ end:
+
+       switch_core_destroy();
+
+       return r;
+
+}
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ */