int main(int argc, char *argv[]) { teletone_generation_session_t ts; struct ttmp tmp; if (argc < 3) { fprintf(stderr, "Arg Error! <file> <tones>\n"); exit(-1); } if ((tmp.fd = open(argv[1], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR)) < 0) { fprintf(stderr, "File Error! [%s]\n", strerror(errno)); exit(-1); } teletone_init_session(&ts, 0, teletone_handler, &tmp); ts.rate = 8000; ts.debug = 1; ts.debug_stream = stdout; teletone_run(&ts, argv[2]); close(tmp.fd); return 0; }
static JSBool teletone_construct(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { JSObject *session_obj; struct teletone_obj *tto = NULL; struct js_session *jss = NULL; switch_memory_pool_t *pool; char *timer_name = NULL; switch_codec_implementation_t read_impl = { 0 }; if (argc > 0) { if (JS_ValueToObject(cx, argv[0], &session_obj)) { if (!(jss = JS_GetPrivate(cx, session_obj))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Find Session [1]\n"); return JS_FALSE; } } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Find Session [2]\n"); return JS_FALSE; } } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing Session Arg\n"); return JS_FALSE; } if (argc > 1) { timer_name = JS_GetStringBytes(JS_ValueToString(cx, argv[1])); } switch_core_new_memory_pool(&pool); if (!(tto = switch_core_alloc(pool, sizeof(*tto)))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error\n"); return JS_FALSE; } switch_core_session_get_read_impl(jss->session, &read_impl); if (switch_core_codec_init(&tto->codec, "L16", NULL, read_impl.actual_samples_per_second, read_impl.microseconds_per_packet / 1000, read_impl.number_of_channels, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, pool) == SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activated\n"); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Raw Codec Activation Failed\n"); return JS_FALSE; } if (timer_name) { unsigned int ms = read_impl.microseconds_per_packet / 1000; if (switch_core_timer_init(&tto->timer_base, timer_name, ms, (read_impl.samples_per_second / 50) * read_impl.number_of_channels, pool) == SWITCH_STATUS_SUCCESS) { tto->timer = &tto->timer_base; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Timer INIT Success %u\n", ms); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Timer INIT Failed\n"); } } switch_buffer_create_dynamic(&tto->audio_buffer, JS_BLOCK_SIZE, JS_BUFFER_SIZE, 0); tto->pool = pool; tto->obj = obj; tto->cx = cx; tto->session = jss->session; teletone_init_session(&tto->ts, 0, teletone_handler, tto); JS_SetPrivate(cx, obj, tto); return JS_TRUE; }
static switch_status_t tone_stream_file_open(switch_file_handle_t *handle, const char *path) { switch_buffer_t *audio_buffer = NULL; teletone_generation_session_t ts; char *tonespec; int loops = 0; char *tmp; int fd = -1; char buf[1024] = ""; size_t len; memset(&ts, 0, sizeof(ts)); tonespec = switch_core_strdup(handle->memory_pool, path); switch_buffer_create_dynamic(&audio_buffer, 1024, 1024, 0); switch_assert(audio_buffer); if ((tmp = (char *)switch_stristr(";loops=", tonespec))) { *tmp = '\0'; tmp += 7; if (tmp) { loops = atoi(tmp); switch_buffer_set_loops(audio_buffer, loops); } } if (handle->params) { if ((tmp = switch_event_get_header(handle->params, "loops"))) { loops = atoi(tmp); switch_buffer_set_loops(audio_buffer, loops); } } if (!handle->samplerate) { handle->samplerate = 8000; } handle->channels = 1; teletone_init_session(&ts, 0, teletone_handler, audio_buffer); ts.rate = handle->samplerate; ts.channels = 1; if (!strncasecmp(tonespec, "path=", 5)) { tmp = tonespec + 5; if ((fd = open(tmp, O_RDONLY)) < 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to open [%s]\n", tmp); return SWITCH_STATUS_FALSE; } while ((len = switch_fd_read_line(fd, buf, sizeof(buf)))) { teletone_run(&ts, buf); } close(fd); fd = -1; } else { teletone_run(&ts, tonespec); } teletone_destroy_session(&ts); handle->private_info = audio_buffer; return SWITCH_STATUS_SUCCESS; }