Freeswitch-trunk
Threads by month
- ----- 2026 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
April 2009
- 19 participants
- 350 discussions
19 Apr '09
Author: gmaruzz
Date: Sun Apr 19 17:44:45 2009
New Revision: 13083
Log:
skypiax: great startup speedup in Windows (using only one Broadcast sendmessage for each interface hunting)
Modified:
freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c
Modified: freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c Sun Apr 19 17:44:45 2009
@@ -1007,6 +1007,7 @@
case SKYPECONTROLAPI_ATTACH_PENDING_AUTHORIZATION:
//DEBUGA_SKYPE ("\n\n\tIf I do not (almost) immediately connect to Skype API,\n\tplease give the Skype client authorization to be connected \n\tby Asterisk and to not ask you again.\n\n", SKYPIAX_P_LOG);
skypiax_sleep(5000);
+#if 0
if (!tech_pvt->SkypiaxHandles.currentuserhandle) {
SendMessage(HWND_BROADCAST,
tech_pvt->
@@ -1014,6 +1015,7 @@
(WPARAM) tech_pvt->SkypiaxHandles.win32_hInit_MainWindowHandle,
0);
}
+#endif
break;
case SKYPECONTROLAPI_ATTACH_REFUSED:
ERRORA("Skype client refused to be connected by Skypiax!\n", SKYPIAX_P_LOG);
@@ -1024,6 +1026,7 @@
case SKYPECONTROLAPI_ATTACH_API_AVAILABLE:
DEBUGA_SKYPE("Skype API available\n", SKYPIAX_P_LOG);
skypiax_sleep(5000);
+#if 0
if (!tech_pvt->SkypiaxHandles.currentuserhandle) {
SendMessage(HWND_BROADCAST,
tech_pvt->
@@ -1031,6 +1034,7 @@
(WPARAM) tech_pvt->SkypiaxHandles.win32_hInit_MainWindowHandle,
0);
}
+#endif
break;
default:
WARNINGA("GOT AN UNKNOWN SKYPE WINDOWS MSG\n", SKYPIAX_P_LOG);
@@ -1139,7 +1143,7 @@
tech_pvt->SkypiaxHandles.win32_uiGlobal_MsgID_SkypeControlAPIDiscover =
RegisterWindowMessage("SkypeControlAPIDiscover");
- skypiax_sleep(2000000);
+ skypiax_sleep(200000); //0,2 sec
if (tech_pvt->SkypiaxHandles.win32_uiGlobal_MsgID_SkypeControlAPIAttach != 0
&& tech_pvt->SkypiaxHandles.win32_uiGlobal_MsgID_SkypeControlAPIDiscover != 0) {
1
0
19 Apr '09
Author: coppice
Date: Sun Apr 19 06:46:26 2009
New Revision: 13082
Log:
Introduction of the skeleton of a media bug implementing a T.38 gateway, so the
related infrastructure work can take place around it.
Added:
freeswitch/trunk/src/mod/applications/mod_t38gateway/
freeswitch/trunk/src/mod/applications/mod_t38gateway/Makefile
freeswitch/trunk/src/mod/applications/mod_t38gateway/mod_t38gateway.2008.vcproj
freeswitch/trunk/src/mod/applications/mod_t38gateway/mod_t38gateway.c
freeswitch/trunk/src/mod/applications/mod_t38gateway/udptl.c
freeswitch/trunk/src/mod/applications/mod_t38gateway/udptl.h
Added: freeswitch/trunk/src/mod/applications/mod_t38gateway/Makefile
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_t38gateway/Makefile Sun Apr 19 06:46:26 2009
@@ -0,0 +1,6 @@
+BASE=../../../..
+
+LOCAL_SOURCES=udptl.c
+LOCAL_OBJS=udptl.o
+
+include $(BASE)/build/modmake.rules
Added: freeswitch/trunk/src/mod/applications/mod_t38gateway/mod_t38gateway.2008.vcproj
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_t38gateway/mod_t38gateway.2008.vcproj Sun Apr 19 06:46:26 2009
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="mod_t38gateway"
+ ProjectGUID="{14E4A972-9CFB-436D-B0A5-4943F3F80D47}"
+ RootNamespace="mod_t38gateway"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\..\w32\module_debug.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
+ UsePrecompiledHeader="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\..\w32\module_debug.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
+ UsePrecompiledHeader="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(SolutionDir)$(PlatformName)\$(ConfigurationName)/mod/$(ProjectName).dll"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\..\w32\module_release.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
+ UsePrecompiledHeader="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ ConfigurationType="2"
+ InheritedPropertySheets="..\..\..\..\w32\module_release.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\..\libs\spandsp\src\msvc";"$(InputDir)..\..\..\..\libs\spandsp\src";"$(InputDir)..\..\..\..\libs\tiff-3.8.2\libtiff""
+ UsePrecompiledHeader="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(SolutionDir)$(PlatformName)\$(ConfigurationName)/mod/$(ProjectName).dll"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath=".\mod_t38gateway.c"
+ >
+ </File>
+ <File
+ RelativePath=".\udptl.c"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
Added: freeswitch/trunk/src/mod/applications/mod_t38gateway/mod_t38gateway.c
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_t38gateway/mod_t38gateway.c Sun Apr 19 06:46:26 2009
@@ -0,0 +1,347 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2009, Steve Underwood <steveu(a)coppice.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.
+ *
+ * Contributor(s):
+ *
+ * Steve Underwood <steveu(a)coppice.org>
+ *
+ * mod_t38gateway.c -- A T.38 gateway
+ *
+ * This module uses the T.38 gateway engine of spandsp to create a T.38 gateway suitable for
+ * V.17, V.29, and V.27ter FAX operation.
+ *
+ */
+
+#include <switch.h>
+
+#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES
+#include <spandsp.h>
+#include <spandsp/version.h>
+
+#include "udptl.h"
+
+/*! Syntax of the API call. */
+#define T38GATEWAY_SYNTAX "<uuid> <command>"
+
+/*! Number of expected parameters in api call. */
+#define T38GATEWAY_PARAMS 2
+
+/*! FreeSWITCH CUSTOM event types. */
+#define T38GATEWAY_EVENT_CNG "t38gateway::cng"
+#define T38GATEWAY_EVENT_CED "t38gateway::ced"
+#define T38GATEWAY_EVENT_PAGE "t38gateway::page"
+
+/* Prototypes */
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_t38gateway_shutdown);
+SWITCH_STANDARD_API(t38gateway_api_main);
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_t38gateway_load);
+SWITCH_MODULE_DEFINITION(mod_t38gateway, mod_t38gateway_load, NULL, NULL);
+SWITCH_STANDARD_APP(t38gateway_start_function);
+
+/*! Type that holds codec information. */
+typedef struct {
+ /*! The sampling rate of the audio stream. */
+ int rate;
+ /*! The number of channels. */
+ int channels;
+} t38gateway_codec_info_t;
+
+/*! Type that holds session information pertinent to the t38gateway module. */
+typedef struct {
+ /*! Internal FreeSWITCH session. */
+ switch_core_session_t *session;
+ /*! Codec information for the session. */
+ t38gateway_codec_info_t t38gateway_codec;
+ t38_gateway_state_t *t38;
+ t38_core_state_t *t38_core;
+ udptl_state_t *udptl;
+} t38gateway_session_info_t;
+
+static int tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count)
+{
+ t38gateway_session_info_t *t;
+
+ t = (t38gateway_session_info_t *) user_data;
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int rx_packet_handler(void *user_data, const uint8_t *buf, int len, int seq_no)
+{
+ t38gateway_session_info_t *t;
+
+ t = (t38gateway_session_info_t *) user_data;
+ t38_core_rx_ifp_packet(t->t38_core, buf, len, seq_no);
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+/*! \brief The callback function that is called when new audio data becomes available
+ *
+ * @author Steve Underwood
+ * @param bug A reference to the media bug.
+ * @param user_data The session information for this call.
+ * @param type The switch callback type.
+ * @return The success or failure of the function.
+ */
+static switch_bool_t t38gateway_callback(switch_media_bug_t * bug, void *user_data, switch_abc_type_t type)
+{
+ t38gateway_session_info_t *t38gateway_info;
+ switch_codec_t *read_codec;
+ switch_frame_t *frame;
+ int16_t *amp;
+
+ t38gateway_info = (t38gateway_session_info_t *) user_data;
+ if (t38gateway_info == NULL) {
+ return SWITCH_FALSE;
+ }
+
+ switch (type) {
+ case SWITCH_ABC_TYPE_INIT:
+ read_codec = switch_core_session_get_read_codec(t38gateway_info->session);
+ t38gateway_info->t38gateway_codec.rate = read_codec->implementation->samples_per_second;
+ t38gateway_info->t38gateway_codec.channels = read_codec->implementation->number_of_channels;
+ break;
+ case SWITCH_ABC_TYPE_READ_PING:
+ case SWITCH_ABC_TYPE_CLOSE:
+ break;
+ case SWITCH_ABC_TYPE_READ:
+ frame = switch_core_media_bug_get_read_replace_frame(bug);
+ amp = (int16_t *) frame->data;
+ t38_gateway_rx(t38gateway_info->t38, amp, frame->samples);
+ break;
+ case SWITCH_ABC_TYPE_WRITE:
+ case SWITCH_ABC_TYPE_READ_REPLACE:
+ case SWITCH_ABC_TYPE_WRITE_REPLACE:
+ break;
+ }
+
+ return SWITCH_TRUE;
+}
+
+/*! \brief FreeSWITCH module loading function
+ *
+ * @author Steve Underwood
+ * @return Load success or failure.
+ */
+SWITCH_MODULE_LOAD_FUNCTION(mod_t38gateway_load)
+{
+ switch_application_interface_t *app_interface;
+ switch_api_interface_t *api_interface;
+ /* connect my internal structure to the blank pointer passed to me */
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "T.38 gateway enabled\n");
+
+ SWITCH_ADD_APP(app_interface, "t38gateway", "T.38 gateway", "T.38 gateway", t38gateway_start_function, "[start] [stop]", SAF_NONE);
+
+ SWITCH_ADD_API(api_interface, "t38gateway", "T.38 gateway", t38gateway_api_main, T38GATEWAY_SYNTAX);
+
+ /* indicate that the module should continue to be loaded */
+ return SWITCH_STATUS_SUCCESS;
+}
+
+/*! \brief FreeSWITCH application handler function.
+ * This handles calls made from applications such as LUA and the dialplan
+ *
+ * @author Steve Underwood
+ * @return Success or failure of the function.
+ */
+SWITCH_STANDARD_APP(t38gateway_start_function)
+{
+ switch_media_bug_t *bug;
+ switch_status_t status;
+ switch_channel_t *channel;
+ t38gateway_session_info_t *t38gateway_info;
+
+ if (session == NULL)
+ return;
+
+ channel = switch_core_session_get_channel(session);
+
+ /* Is this channel already set? */
+ bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_t38gateway_");
+ /* If yes */
+ if (bug != NULL) {
+ /* If we have a stop remove audio bug */
+ if (strcasecmp(data, "stop") == 0) {
+ switch_channel_set_private(channel, "_t38gateway_", NULL);
+ switch_core_media_bug_remove(session, &bug);
+ return;
+ }
+
+ /* We have already started */
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot run 2 at once on the same channel!\n");
+
+ return;
+ }
+
+ t38gateway_info = (t38gateway_session_info_t *) switch_core_session_alloc(session, sizeof(t38gateway_session_info_t));
+
+ t38gateway_info->session = session;
+ t38gateway_info->t38 = t38_gateway_init(NULL, tx_packet_handler, (void *) t38gateway_info);
+ t38gateway_info->t38_core = t38_gateway_get_t38_core_state(t38gateway_info->t38);
+ t38gateway_info->udptl = udptl_init(NULL, UDPTL_ERROR_CORRECTION_REDUNDANCY, 3, 3, rx_packet_handler, (void *) t38gateway_info);
+
+ status = switch_core_media_bug_add(session, t38gateway_callback, t38gateway_info, 0, SMBF_READ_STREAM, &bug);
+
+ if (status != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failure hooking to stream\n");
+ return;
+ }
+
+ switch_channel_set_private(channel, "_t38gateway_", bug);
+}
+
+/*! \brief Called when the module shuts down
+ *
+ * @author Steve Underwood
+ * @return The success or failure of the function.
+ */
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_t38gateway_shutdown)
+{
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "T.38 gateway disabled\n");
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+/*! \brief FreeSWITCH API handler function.
+ * This function handles API calls such as the ones from mod_event_socket and in some cases
+ * scripts such as LUA scripts.
+ *
+ * @author Steve Underwood
+ * @return The success or failure of the function.
+ */
+SWITCH_STANDARD_API(t38gateway_api_main)
+{
+ switch_core_session_t *t38gateway_session;
+ switch_media_bug_t *bug;
+ t38gateway_session_info_t *t38gateway_info;
+ switch_channel_t *channel;
+ switch_status_t status;
+ int argc;
+ char *argv[T38GATEWAY_PARAMS];
+ char *ccmd;
+ char *uuid;
+ char *command;
+
+ /* No command? Display usage */
+ if (cmd == NULL) {
+ stream->write_function(stream, "-USAGE: %s\n", T38GATEWAY_SYNTAX);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ /* Duplicated contents of original string */
+ ccmd = strdup(cmd);
+ /* Separate the arguments */
+ argc = switch_separate_string(ccmd, ' ', argv, T38GATEWAY_PARAMS);
+
+ /* If we don't have the expected number of parameters
+ * display usage */
+ if (argc != T38GATEWAY_PARAMS) {
+ stream->write_function(stream, "-USAGE: %s\n", T38GATEWAY_SYNTAX);
+ switch_safe_free(ccmd);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ uuid = argv[0];
+ command = argv[1];
+
+ /* using uuid locate a reference to the FreeSWITCH session */
+ t38gateway_session = switch_core_session_locate(uuid);
+
+ /* If the session was not found exit */
+ if (t38gateway_session == NULL) {
+ switch_safe_free(ccmd);
+ stream->write_function(stream, "-USAGE: %s\n", T38GATEWAY_SYNTAX);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ /* Get current channel of the session to tag the session
+ * This indicates that our module is present */
+ channel = switch_core_session_get_channel(t38gateway_session);
+
+ /* Is this channel already set? */
+ bug = (switch_media_bug_t *) switch_channel_get_private(channel, "_t38gateway_");
+ /* If yes */
+ if (bug != NULL) {
+ /* If we have a stop remove audio bug */
+ if (strcasecmp(command, "stop") == 0) {
+ switch_channel_set_private(channel, "_t38gateway_", NULL);
+ switch_core_media_bug_remove(t38gateway_session, &bug);
+ switch_safe_free(ccmd);
+ stream->write_function(stream, "+OK\n");
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ /* We have already started */
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Cannot run 2 at once on the same channel!\n");
+
+ switch_safe_free(ccmd);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ /* If we don't see the expected start exit */
+ if (strcasecmp(command, "start") != 0) {
+ switch_safe_free(ccmd);
+ stream->write_function(stream, "-USAGE: %s\n", T38GATEWAY_SYNTAX);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ /* Allocate memory attached to this FreeSWITCH session for
+ * use in the callback routine and to store state information */
+ t38gateway_info = (t38gateway_session_info_t *) switch_core_session_alloc(t38gateway_session, sizeof(t38gateway_session_info_t));
+
+ /* Set initial values and states */
+ t38gateway_info->session = t38gateway_session;
+ t38gateway_info->t38 = t38_gateway_init(NULL, tx_packet_handler, (void *) t38gateway_info);
+ t38gateway_info->t38_core = t38_gateway_get_t38_core_state(t38gateway_info->t38);
+ t38gateway_info->udptl = udptl_init(NULL, UDPTL_ERROR_CORRECTION_REDUNDANCY, 3, 3, rx_packet_handler, (void *) t38gateway_info);
+
+ /* Add a media bug that allows me to intercept the
+ * reading leg of the audio stream */
+ status = switch_core_media_bug_add(t38gateway_session, t38gateway_callback, t38gateway_info, 0, SMBF_READ_STREAM, &bug);
+
+ /* If adding a media bug fails exit */
+ if (status != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failure hooking to stream\n");
+
+ switch_safe_free(ccmd);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ /* Set the t38gateway tag to detect an existing t38gateway media bug */
+ switch_channel_set_private(channel, "_t38gateway_", bug);
+
+ /* Everything went according to plan! Notify the user */
+ stream->write_function(stream, "+OK\n");
+
+ switch_safe_free(ccmd);
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
+/* 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 expandtab:
+ */
Added: freeswitch/trunk/src/mod/applications/mod_t38gateway/udptl.c
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_t38gateway/udptl.c Sun Apr 19 06:46:26 2009
@@ -0,0 +1,596 @@
+//#define UDPTL_DEBUG
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2009, Steve Underwood <steveu(a)coppice.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.
+ *
+ * Contributor(s):
+ *
+ * Steve Underwood <steveu(a)coppice.org>
+ *
+ * udptl.c -- UDPTL handling for T.38
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <inttypes.h>
+#include <memory.h>
+
+#include "udptl.h"
+
+#define FALSE 0
+#define TRUE (!FALSE)
+
+static int decode_length(const uint8_t *buf, int limit, int *len, int *pvalue)
+{
+ if (*len >= limit)
+ return -1;
+ if ((buf[*len] & 0x80) == 0)
+ {
+ *pvalue = buf[(*len)++];
+ return 0;
+ }
+ if ((buf[*len] & 0x40) == 0)
+ {
+ if (*len >= limit - 1)
+ return -1;
+ *pvalue = (buf[(*len)++] & 0x3F) << 8;
+ *pvalue |= buf[(*len)++];
+ return 0;
+ }
+ *pvalue = (buf[(*len)++] & 0x3F) << 14;
+ /* Indicate we have a fragment */
+ return 1;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int decode_open_type(const uint8_t *buf, int limit, int *len, const uint8_t **p_object, int *p_num_octets)
+{
+ int octet_cnt;
+ int octet_idx;
+ int stat;
+ int i;
+ const uint8_t **pbuf;
+
+ for (octet_idx = 0, *p_num_octets = 0; ; octet_idx += octet_cnt)
+ {
+ if ((stat = decode_length(buf, limit, len, &octet_cnt)) < 0)
+ return -1;
+ if (octet_cnt > 0)
+ {
+ *p_num_octets += octet_cnt;
+
+ pbuf = &p_object[octet_idx];
+ i = 0;
+ /* Make sure the buffer contains at least the number of bits requested */
+ if ((*len + octet_cnt) > limit)
+ return -1;
+
+ *pbuf = &buf[*len];
+ *len += octet_cnt;
+ }
+ if (stat == 0)
+ break;
+ }
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int encode_length(uint8_t *buf, int *len, int value)
+{
+ int multiplier;
+
+ if (value < 0x80)
+ {
+ /* 1 octet */
+ buf[(*len)++] = value;
+ return value;
+ }
+ if (value < 0x4000)
+ {
+ /* 2 octets */
+ /* Set the first bit of the first octet */
+ buf[(*len)++] = ((0x8000 | value) >> 8) & 0xFF;
+ buf[(*len)++] = value & 0xFF;
+ return value;
+ }
+ /* Fragmentation */
+ multiplier = (value < 0x10000) ? (value >> 14) : 4;
+ /* Set the first 2 bits of the octet */
+ buf[(*len)++] = 0xC0 | multiplier;
+ return multiplier << 14;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int encode_open_type(uint8_t *buf, int *len, const uint8_t *data, int num_octets)
+{
+ int enclen;
+ int octet_idx;
+ uint8_t zero_byte;
+
+ /* If open type is of zero length, add a single zero byte (10.1) */
+ if (num_octets == 0)
+ {
+ zero_byte = 0;
+ data = &zero_byte;
+ num_octets = 1;
+ }
+ /* Encode the open type */
+ for (octet_idx = 0; ; num_octets -= enclen, octet_idx += enclen)
+ {
+ if ((enclen = encode_length(buf, len, num_octets)) < 0)
+ return -1;
+ if (enclen > 0)
+ {
+ memcpy(&buf[*len], &data[octet_idx], enclen);
+ *len += enclen;
+ }
+ if (enclen >= num_octets)
+ break;
+ }
+
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len)
+{
+ int stat;
+ int stat2;
+ int i;
+ int j;
+ int k;
+ int l;
+ int m;
+ int x;
+ int limit;
+ int which;
+ int ptr;
+ int count;
+ int total_count;
+ int seq_no;
+ const uint8_t *msg;
+ const uint8_t *data;
+ int msg_len;
+ int repaired[16];
+ const uint8_t *bufs[16];
+ int lengths[16];
+ int span;
+ int entries;
+
+ ptr = 0;
+ /* Decode seq_number */
+ if (ptr + 2 > len)
+ return -1;
+ seq_no = (buf[0] << 8) | buf[1];
+ ptr += 2;
+ /* Break out the primary packet */
+ if ((stat = decode_open_type(buf, len, &ptr, &msg, &msg_len)) != 0)
+ return -1;
+ /* Decode error_recovery */
+ if (ptr + 1 > len)
+ return -1;
+ /* Our buffers cannot tolerate overlength packets */
+ if (msg_len > LOCAL_FAX_MAX_DATAGRAM)
+ return -1;
+ /* Update any missed slots in the buffer */
+ for (i = s->rx_seq_no; seq_no > i; i++)
+ {
+ x = i & UDPTL_BUF_MASK;
+ s->rx[x].buf_len = -1;
+ s->rx[x].fec_len[0] = 0;
+ s->rx[x].fec_span = 0;
+ s->rx[x].fec_entries = 0;
+ }
+ /* Save the new packet. Pure redundancy mode won't use this, but some systems will switch
+ into FEC mode after sending some redundant packets. */
+ x = seq_no & UDPTL_BUF_MASK;
+ memcpy(s->rx[x].buf, msg, msg_len);
+ s->rx[x].buf_len = msg_len;
+ s->rx[x].fec_len[0] = 0;
+ s->rx[x].fec_span = 0;
+ s->rx[x].fec_entries = 0;
+ if ((buf[ptr++] & 0x80) == 0)
+ {
+ /* Secondary packet mode for error recovery */
+ /* We might have the packet we want, but we need to check through
+ the redundant stuff, and verify the integrity of the UDPTL.
+ This greatly reduces our chances of accepting garbage. */
+ total_count = 0;
+ do
+ {
+ if ((stat2 = decode_length(buf, len, &ptr, &count)) < 0)
+ return -1;
+ for (i = 0; i < count; i++)
+ {
+ if ((stat = decode_open_type(buf, len, &ptr, &bufs[total_count + i], &lengths[total_count + i])) != 0)
+ return -1;
+ }
+ total_count += count;
+ }
+ while (stat2 > 0);
+ /* We should now be exactly at the end of the packet. If not, this is a fault. */
+ if (ptr != len)
+ return -1;
+ if (seq_no > s->rx_seq_no)
+ {
+ /* We received a later packet than we expected, so we need to check if we can fill in the gap from the
+ secondary packets. */
+ /* Step through in reverse order, so we go oldest to newest */
+ for (i = total_count; i > 0; i--)
+ {
+ if (seq_no - i >= s->rx_seq_no)
+ {
+ /* This one wasn't seen before */
+ /* Decode the secondary packet */
+#if defined(UDPTL_DEBUG)
+ fprintf(stderr, "Secondary %d, len %d\n", seq_no - i, lengths[i - 1]);
+#endif
+ /* Save the new packet. Redundancy mode won't use this, but some systems will switch into
+ FEC mode after sending some redundant packets, and this may then be important. */
+ x = (seq_no - i) & UDPTL_BUF_MASK;
+ memcpy(s->rx[x].buf, bufs[i - 1], lengths[i - 1]);
+ s->rx[x].buf_len = lengths[i - 1];
+ s->rx[x].fec_len[0] = 0;
+ s->rx[x].fec_span = 0;
+ s->rx[x].fec_entries = 0;
+ if (s->rx_packet_handler(s->user_data, bufs[i - 1], lengths[i - 1], seq_no - i) < 0)
+ fprintf(stderr, "Bad IFP\n");
+ }
+ }
+ }
+ }
+ else
+ {
+ /* FEC mode for error recovery */
+
+ /* Decode the FEC packets */
+ /* The span is defined as an unconstrained integer, but will never be more
+ than a small value. */
+ if (ptr + 2 > len)
+ return -1;
+ if (buf[ptr++] != 1)
+ return -1;
+ span = buf[ptr++];
+
+ x = seq_no & UDPTL_BUF_MASK;
+
+ s->rx[x].fec_span = span;
+
+ memset(repaired, 0, sizeof(repaired));
+ repaired[x] = TRUE;
+
+ /* The number of entries is defined as a length, but will only ever be a small
+ value. Treat it as such. */
+ if (ptr + 1 > len)
+ return -1;
+ entries = buf[ptr++];
+ s->rx[x].fec_entries = entries;
+
+ /* Decode the elements */
+ for (i = 0; i < entries; i++)
+ {
+ if ((stat = decode_open_type(buf, len, &ptr, &data, &s->rx[x].fec_len[i])) != 0)
+ return -1;
+ if (s->rx[x].fec_len[i] > LOCAL_FAX_MAX_DATAGRAM)
+ return -1;
+
+ /* Save the new FEC data */
+ memcpy(s->rx[x].fec[i], data, s->rx[x].fec_len[i]);
+#if 0
+ fprintf(stderr, "FEC: ");
+ for (j = 0; j < s->rx[x].fec_len[i]; j++)
+ fprintf(stderr, "%02X ", data[j]);
+ fprintf(stderr, "\n");
+#endif
+ }
+ /* We should now be exactly at the end of the packet. If not, this is a fault. */
+ if (ptr != len)
+ return -1;
+ /* See if we can reconstruct anything which is missing */
+ /* TODO: this does not comprehensively hunt back and repair everything that is possible */
+ for (l = x; l != ((x - (16 - span*entries)) & UDPTL_BUF_MASK); l = (l - 1) & UDPTL_BUF_MASK)
+ {
+ if (s->rx[l].fec_len[0] <= 0)
+ continue;
+ for (m = 0; m < s->rx[l].fec_entries; m++)
+ {
+ limit = (l + m) & UDPTL_BUF_MASK;
+ for (which = -1, k = (limit - s->rx[l].fec_span*s->rx[l].fec_entries) & UDPTL_BUF_MASK; k != limit; k = (k + s->rx[l].fec_entries) & UDPTL_BUF_MASK)
+ {
+ if (s->rx[k].buf_len <= 0)
+ which = (which == -1) ? k : -2;
+ }
+ if (which >= 0)
+ {
+ /* Repairable */
+ for (j = 0; j < s->rx[l].fec_len[m]; j++)
+ {
+ s->rx[which].buf[j] = s->rx[l].fec[m][j];
+ for (k = (limit - s->rx[l].fec_span*s->rx[l].fec_entries) & UDPTL_BUF_MASK; k != limit; k = (k + s->rx[l].fec_entries) & UDPTL_BUF_MASK)
+ s->rx[which].buf[j] ^= (s->rx[k].buf_len > j) ? s->rx[k].buf[j] : 0;
+ }
+ s->rx[which].buf_len = s->rx[l].fec_len[m];
+ repaired[which] = TRUE;
+ }
+ }
+ }
+ /* Now play any new packets forwards in time */
+ for (l = (x + 1) & UDPTL_BUF_MASK, j = seq_no - UDPTL_BUF_MASK; l != x; l = (l + 1) & UDPTL_BUF_MASK, j++)
+ {
+ if (repaired[l])
+ {
+#if defined(UDPTL_DEBUG)
+ fprintf(stderr, "Fixed packet %d, len %d\n", j, l);
+#endif
+ if (s->rx_packet_handler(s->user_data, s->rx[l].buf, s->rx[l].buf_len, j) < 0)
+ fprintf(stderr, "Bad IFP\n");
+ }
+ }
+ }
+ /* If packets are received out of sequence, we may have already processed this packet from the error
+ recovery information in a packet already received. */
+ if (seq_no >= s->rx_seq_no)
+ {
+ /* Decode the primary packet */
+#if defined(UDPTL_DEBUG)
+ fprintf(stderr, "Primary packet %d, len %d\n", seq_no, msg_len);
+#endif
+ if (s->rx_packet_handler(s->user_data, msg, msg_len, seq_no) < 0)
+ fprintf(stderr, "Bad IFP\n");
+ }
+
+ s->rx_seq_no = (seq_no + 1) & 0xFFFF;
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_build_packet(udptl_state_t *s, uint8_t buf[], const uint8_t msg[], int msg_len)
+{
+ uint8_t fec[LOCAL_FAX_MAX_DATAGRAM];
+ int i;
+ int j;
+ int seq;
+ int entry;
+ int entries;
+ int span;
+ int m;
+ int len;
+ int limit;
+ int high_tide;
+
+ /* UDPTL cannot cope with zero length messages, and our buffering for redundancy limits their
+ maximum length. */
+ if (msg_len < 1 || msg_len > LOCAL_FAX_MAX_DATAGRAM)
+ return -1;
+ seq = s->tx_seq_no & 0xFFFF;
+
+ /* Map the sequence number to an entry in the circular buffer */
+ entry = seq & UDPTL_BUF_MASK;
+
+ /* We save the message in a circular buffer, for generating FEC or
+ redundancy sets later on. */
+ s->tx[entry].buf_len = msg_len;
+ memcpy(s->tx[entry].buf, msg, msg_len);
+
+ /* Build the UDPTL packet */
+
+ len = 0;
+ /* Encode the sequence number */
+ buf[len++] = (seq >> 8) & 0xFF;
+ buf[len++] = seq & 0xFF;
+
+ /* Encode the primary packet */
+ if (encode_open_type(buf, &len, msg, msg_len) < 0)
+ return -1;
+
+ /* Encode the appropriate type of error recovery information */
+ switch (s->error_correction_scheme)
+ {
+ case UDPTL_ERROR_CORRECTION_NONE:
+ /* Encode the error recovery type */
+ buf[len++] = 0x00;
+ /* The number of entries will always be zero, so it is pointless allowing
+ for the fragmented case here. */
+ if (encode_length(buf, &len, 0) < 0)
+ return -1;
+ break;
+ case UDPTL_ERROR_CORRECTION_REDUNDANCY:
+ /* Encode the error recovery type */
+ buf[len++] = 0x00;
+ if (s->tx_seq_no > s->error_correction_entries)
+ entries = s->error_correction_entries;
+ else
+ entries = s->tx_seq_no;
+ /* The number of entries will always be small, so it is pointless allowing
+ for the fragmented case here. */
+ if (encode_length(buf, &len, entries) < 0)
+ return -1;
+ /* Encode the elements */
+ for (i = 0; i < entries; i++)
+ {
+ j = (entry - i - 1) & UDPTL_BUF_MASK;
+ if (encode_open_type(buf, &len, s->tx[j].buf, s->tx[j].buf_len) < 0)
+ return -1;
+ }
+ break;
+ case UDPTL_ERROR_CORRECTION_FEC:
+ span = s->error_correction_span;
+ entries = s->error_correction_entries;
+ if (seq < s->error_correction_span*s->error_correction_entries)
+ {
+ /* In the initial stages, wind up the FEC smoothly */
+ entries = seq/s->error_correction_span;
+ if (seq < s->error_correction_span)
+ span = 0;
+ }
+ /* Encode the error recovery type */
+ buf[len++] = 0x80;
+ /* Span is defined as an inconstrained integer, which it dumb. It will only
+ ever be a small value. Treat it as such. */
+ buf[len++] = 1;
+ buf[len++] = span;
+ /* The number of entries is defined as a length, but will only ever be a small
+ value. Treat it as such. */
+ buf[len++] = entries;
+ for (m = 0; m < entries; m++)
+ {
+ /* Make an XOR'ed entry the maximum length */
+ limit = (entry + m) & UDPTL_BUF_MASK;
+ high_tide = 0;
+ for (i = (limit - span*entries) & UDPTL_BUF_MASK; i != limit; i = (i + entries) & UDPTL_BUF_MASK)
+ {
+ if (high_tide < s->tx[i].buf_len)
+ {
+ for (j = 0; j < high_tide; j++)
+ fec[j] ^= s->tx[i].buf[j];
+ for ( ; j < s->tx[i].buf_len; j++)
+ fec[j] = s->tx[i].buf[j];
+ high_tide = s->tx[i].buf_len;
+ }
+ else
+ {
+ for (j = 0; j < s->tx[i].buf_len; j++)
+ fec[j] ^= s->tx[i].buf[j];
+ }
+ }
+ if (encode_open_type(buf, &len, fec, high_tide) < 0)
+ return -1;
+ }
+ break;
+ }
+
+ if (s->verbose)
+ fprintf(stderr, "\n");
+ s->tx_seq_no++;
+ return len;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_set_error_correction(udptl_state_t *s,
+ int ec_scheme,
+ int span,
+ int entries)
+{
+ switch (ec_scheme)
+ {
+ case UDPTL_ERROR_CORRECTION_FEC:
+ case UDPTL_ERROR_CORRECTION_REDUNDANCY:
+ case UDPTL_ERROR_CORRECTION_NONE:
+ s->error_correction_scheme = ec_scheme;
+ break;
+ case -1:
+ /* Just don't change the scheme */
+ break;
+ default:
+ return -1;
+ }
+ if (span >= 0)
+ s->error_correction_span = span;
+ if (entries >= 0)
+ s->error_correction_entries = entries;
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_get_error_correction(udptl_state_t *s,
+ int *ec_scheme,
+ int *span,
+ int *entries)
+{
+ if (ec_scheme)
+ *ec_scheme = s->error_correction_scheme;
+ if (span)
+ *span = s->error_correction_span;
+ if (entries)
+ *entries = s->error_correction_entries;
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_set_local_max_datagram(udptl_state_t *s, int max_datagram)
+{
+ s->local_max_datagram_size = max_datagram;
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_get_local_max_datagram(udptl_state_t *s)
+{
+ return s->local_max_datagram_size;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_set_far_max_datagram(udptl_state_t *s, int max_datagram)
+{
+ s->far_max_datagram_size = max_datagram;
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_get_far_max_datagram(udptl_state_t *s)
+{
+ return s->far_max_datagram_size;
+}
+/*- End of function --------------------------------------------------------*/
+
+udptl_state_t *udptl_init(udptl_state_t *s,
+ int ec_scheme,
+ int span,
+ int entries,
+ udptl_rx_packet_handler_t rx_packet_handler,
+ void *user_data)
+{
+ int i;
+
+ if (rx_packet_handler == NULL)
+ return NULL;
+
+ if (s == NULL)
+ {
+ if ((s = (udptl_state_t *) malloc(sizeof(*s))) == NULL)
+ return NULL;
+ }
+ memset(s, 0, sizeof(*s));
+
+ s->error_correction_scheme = ec_scheme;
+ s->error_correction_span = span;
+ s->error_correction_entries = entries;
+
+ s->far_max_datagram_size = LOCAL_FAX_MAX_DATAGRAM;
+ s->local_max_datagram_size = LOCAL_FAX_MAX_DATAGRAM;
+
+ memset(&s->rx, 0, sizeof(s->rx));
+ memset(&s->tx, 0, sizeof(s->tx));
+ for (i = 0; i <= UDPTL_BUF_MASK; i++)
+ {
+ s->rx[i].buf_len = -1;
+ s->tx[i].buf_len = -1;
+ }
+
+ s->rx_packet_handler = rx_packet_handler;
+ s->user_data = user_data;
+
+ return s;
+}
+/*- End of function --------------------------------------------------------*/
+
+int udptl_release(udptl_state_t *s)
+{
+ return 0;
+}
+/*- End of function --------------------------------------------------------*/
+/*- End of file ------------------------------------------------------------*/
Added: freeswitch/trunk/src/mod/applications/mod_t38gateway/udptl.h
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_t38gateway/udptl.h Sun Apr 19 06:46:26 2009
@@ -0,0 +1,170 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2009, Steve Underwood <steveu(a)coppice.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.
+ *
+ * Contributor(s):
+ *
+ * Steve Underwood <steveu(a)coppice.org>
+ *
+ * udptl.h -- UDPTL handling for T.38
+ *
+ */
+
+#if !defined(_UDPTL_H_)
+#define _UDPTL_H_
+
+#define LOCAL_FAX_MAX_DATAGRAM 400
+#define LOCAL_FAX_MAX_FEC_PACKETS 5
+
+#define UDPTL_BUF_MASK 15
+
+typedef int (udptl_rx_packet_handler_t)(void *user_data, const uint8_t msg[], int len, int seq_no);
+
+typedef struct
+{
+ int buf_len;
+ uint8_t buf[LOCAL_FAX_MAX_DATAGRAM];
+} udptl_fec_tx_buffer_t;
+
+typedef struct
+{
+ int buf_len;
+ uint8_t buf[LOCAL_FAX_MAX_DATAGRAM];
+ int fec_len[LOCAL_FAX_MAX_FEC_PACKETS];
+ uint8_t fec[LOCAL_FAX_MAX_FEC_PACKETS][LOCAL_FAX_MAX_DATAGRAM];
+ int fec_span;
+ int fec_entries;
+} udptl_fec_rx_buffer_t;
+
+struct udptl_state_s
+{
+ udptl_rx_packet_handler_t *rx_packet_handler;
+ void *user_data;
+
+ /*! This option indicates the error correction scheme used in transmitted UDPTL
+ packets. */
+ int error_correction_scheme;
+
+ /*! This option indicates the number of error correction entries transmitted in
+ UDPTL packets. */
+ int error_correction_entries;
+
+ /*! This option indicates the span of the error correction entries in transmitted
+ UDPTL packets (FEC only). */
+ int error_correction_span;
+
+ /*! This option indicates the maximum size of a datagram that can be accepted by
+ the remote device. */
+ int far_max_datagram_size;
+
+ /*! This option indicates the maximum size of a datagram that we are prepared to
+ accept. */
+ int local_max_datagram_size;
+
+ int verbose;
+
+ int tx_seq_no;
+ int rx_seq_no;
+ int rx_expected_seq_no;
+
+ udptl_fec_tx_buffer_t tx[UDPTL_BUF_MASK + 1];
+ udptl_fec_rx_buffer_t rx[UDPTL_BUF_MASK + 1];
+};
+
+enum
+{
+ UDPTL_ERROR_CORRECTION_NONE,
+ UDPTL_ERROR_CORRECTION_FEC,
+ UDPTL_ERROR_CORRECTION_REDUNDANCY
+};
+
+typedef struct udptl_state_s udptl_state_t;
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+/*! \brief Process an arriving UDPTL packet.
+ \param s The UDPTL context.
+ \param buf The UDPTL packet buffer.
+ \param len The length of the packet.
+ \return 0 for OK. */
+int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len);
+
+/*! \brief Construct a UDPTL packet, ready for transmission.
+ \param s The UDPTL context.
+ \param buf The UDPTL packet buffer.
+ \param msg The primary packet.
+ \param len The length of the primary packet.
+ \return The length of the constructed UDPTL packet. */
+int udptl_build_packet(udptl_state_t *s, uint8_t buf[], const uint8_t msg[], int msg_len);
+
+/*! \brief Change the error correction settings of a UDPTL context.
+ \param s The UDPTL context.
+ \param ec_scheme One of the optional error correction schemes.
+ \param span The packet span over which error correction should be applied.
+ \param entries The number of error correction entries to include in packets.
+ \return 0 for OK. */
+int udptl_set_error_correction(udptl_state_t *s,
+ int ec_scheme,
+ int span,
+ int entries);
+
+/*! \brief Check the error correction settings of a UDPTL context.
+ \param s The UDPTL context.
+ \param ec_scheme One of the optional error correction schemes.
+ \param span The packet span over which error correction is being applied.
+ \param entries The number of error correction being included in packets.
+ \return 0 for OK. */
+int udptl_get_error_correction(udptl_state_t *s,
+ int *ec_scheme,
+ int *span,
+ int *entries);
+
+int udptl_set_local_max_datagram(udptl_state_t *s, int max_datagram);
+
+int udptl_get_local_max_datagram(udptl_state_t *s);
+
+int udptl_set_far_max_datagram(udptl_state_t *s, int max_datagram);
+
+int udptl_get_far_max_datagram(udptl_state_t *s);
+
+/*! \brief Initialise a UDPTL context.
+ \param s The UDPTL context.
+ \param ec_scheme One of the optional error correction schemes.
+ \param span The packet span over which error correction should be applied.
+ \param entries The number of error correction entries to include in packets.
+ \param rx_packet_handler The callback function, used to report arriving IFP packets.
+ \param user_data An opaque pointer supplied to rx_packet_handler.
+ \return A pointer to the UDPTL context, or NULL if there was a problem. */
+udptl_state_t *udptl_init(udptl_state_t *s,
+ int ec_scheme,
+ int span,
+ int entries,
+ udptl_rx_packet_handler_t rx_packet_handler,
+ void *user_data);
+
+/*! \brief Release a UDPTL context.
+ \param s The UDPTL context.
+ \return 0 for OK. */
+int udptl_release(udptl_state_t *s);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
+/*- End of file ------------------------------------------------------------*/
1
0
17 Apr '09
Author: stkn
Date: Fri Apr 17 15:21:35 2009
New Revision: 13080
Log:
Libtool build fix for mod_perl: use LIBTOOL_LIB_EXTEN to make libtool-2.2 happy and CXXLINK since we are linking a C++ lib
Modified:
freeswitch/trunk/src/mod/languages/mod_perl/Makefile
Modified: freeswitch/trunk/src/mod/languages/mod_perl/Makefile
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_perl/Makefile (original)
+++ freeswitch/trunk/src/mod/languages/mod_perl/Makefile Fri Apr 17 15:21:35 2009
@@ -23,10 +23,10 @@
orig: mod_perl_wrap.cpp
patch -R -s -p0 -i hack.diff
-freeswitch.$(DYNAMIC_LIB_EXTEN): $(LOCAL_OBJS) $(LOCAL_LIBADD)
- $(LINK) $(SOLINK) -o freeswitch.$(DYNAMIC_LIB_EXTEN) $(LOCAL_OBJS) $(LOCAL_LIBADD) $(LDFLAGS)
+freeswitch.$(LIBTOOL_LIB_EXTEN): $(LOCAL_OBJS) $(LOCAL_LIBADD)
+ $(CXXLINK) $(SOLINK) -o freeswitch.$(LIBTOOL_LIB_EXTEN) $(LOCAL_OBJS) $(LOCAL_LIBADD) $(LDFLAGS)
-local_all: freeswitch.$(DYNAMIC_LIB_EXTEN)
+local_all: freeswitch.$(LIBTOOL_LIB_EXTEN)
.perlok:
@(${PERL} -V | grep -i usemultiplicity=define >/dev/null && echo Phew, You have the right perl.) \
@@ -34,9 +34,9 @@
@touch .perlok
local_clean:
- rm -fr *~ .perlok freeswitch.$(DYNAMIC_LIB_EXTEN)
+ rm -fr *~ .perlok .libs freeswitch.$(LIBTOOL_LIB_EXTEN) 2>/dev/null
depend_install:
mkdir -p $(DESTDIR)$(PREFIX)/perl
- $(LTINSTALL) freeswitch.$(DYNAMIC_LIB_EXTEN) freeswitch.pm $(DESTDIR)$(PREFIX)/perl
+ $(LTINSTALL) freeswitch.$(LIBTOOL_LIB_EXTEN) freeswitch.pm $(DESTDIR)$(PREFIX)/perl
if [ ! -f $(DESTDIR)$(PREFIX)/perl/freeswitch.pm ] ; then $(LTINSTALL) freeswitch.pm $(DESTDIR)$(PREFIX)/perl ; fi
1
0
Author: brian
Date: Fri Apr 17 11:00:08 2009
New Revision: 13079
Log:
adding sendevent example for esl perl
Added:
freeswitch/trunk/libs/esl/perl/sendevent.pl
Added: freeswitch/trunk/libs/esl/perl/sendevent.pl
==============================================================================
--- (empty file)
+++ freeswitch/trunk/libs/esl/perl/sendevent.pl Fri Apr 17 11:00:08 2009
@@ -0,0 +1,22 @@
+#!/usr/bin/perl
+
+require ESL;
+
+my $con = ESL::ESLconnection->new("localhost", "8021", "ClueCon");
+my $e = ESL::ESLevent->new("MESSAGE_WAITING");
+
+#my $e = $con->sendEvent("MESSAGE_WAITING");
+
+$e->addHeader("MWI-Messages-Waiting", "no");
+$e->addHeader("MWI-Message-Account", 'sip:1002@dev.bkw.org');
+$e->addHeader("MWI-Voice-Message", "0/0 (0/0)");
+$con->sendEvent($e);
+
+sleep 3;
+my $ee = ESL::ESLevent->new("MESSAGE_WAITING");
+
+$ee->addHeader("MWI-Messages-Waiting", "yes");
+$ee->addHeader("MWI-Message-Account", 'sip:1002@dev.bkw.org');
+$ee->addHeader("MWI-Voice-Message", "1/1 (1/1)");
+$con->sendEvent($ee);
+
1
0
Author: brian
Date: Fri Apr 17 10:59:25 2009
New Revision: 13078
Log:
don't double encode events when sending them
Modified:
freeswitch/trunk/libs/esl/src/esl.c
Modified: freeswitch/trunk/libs/esl/src/esl.c
==============================================================================
--- freeswitch/trunk/libs/esl/src/esl.c (original)
+++ freeswitch/trunk/libs/esl/src/esl.c Fri Apr 17 10:59:25 2009
@@ -433,7 +433,7 @@
return ESL_FAIL;
}
- esl_event_serialize(event, &txt, ESL_TRUE);
+ esl_event_serialize(event, &txt, ESL_FALSE);
esl_log(ESL_LOG_DEBUG, "SEND EVENT\n%s\n", txt);
1
0
[commit] r13077 - in freeswitch/trunk/src/mod/languages/mod_managed: . managed
by FreeSWITCH SVN 17 Apr '09
by FreeSWITCH SVN 17 Apr '09
17 Apr '09
Author: brian
Date: Fri Apr 17 09:06:17 2009
New Revision: 13077
Log:
swigall
Modified:
freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx
freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs
Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx (original)
+++ freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx Fri Apr 17 09:06:17 2009
@@ -905,6 +905,17 @@
}
+SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE_get() {
+ char * jresult ;
+ char *result = 0 ;
+
+ result = (char *) "bridge_hangup_cause";
+
+ jresult = SWIG_csharp_string_callback((const char *)result);
+ return jresult;
+}
+
+
SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_READ_TERMINATOR_USED_VARIABLE_get() {
char * jresult ;
char *result = 0 ;
@@ -23545,11 +23556,13 @@
}
-SWIGEXPORT void SWIGSTDCALL CSharp_rtp_flush_read_buffer(void * jarg1) {
+SWIGEXPORT void SWIGSTDCALL CSharp_rtp_flush_read_buffer(void * jarg1, int jarg2) {
switch_rtp_t *arg1 = (switch_rtp_t *) 0 ;
+ switch_rtp_flush_t arg2 ;
arg1 = (switch_rtp_t *)jarg1;
- rtp_flush_read_buffer(arg1);
+ arg2 = (switch_rtp_flush_t)jarg2;
+ rtp_flush_read_buffer(arg1,arg2);
}
Modified: freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs (original)
+++ freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs Fri Apr 17 09:06:17 2009
@@ -3604,8 +3604,8 @@
return ret;
}
- public static void rtp_flush_read_buffer(SWIGTYPE_p_switch_rtp rtp_session) {
- freeswitchPINVOKE.rtp_flush_read_buffer(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session));
+ public static void rtp_flush_read_buffer(SWIGTYPE_p_switch_rtp rtp_session, switch_rtp_flush_t flush) {
+ freeswitchPINVOKE.rtp_flush_read_buffer(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), (int)flush);
}
public static switch_status_t switch_rtp_enable_vad(SWIGTYPE_p_switch_rtp rtp_session, SWIGTYPE_p_switch_core_session session, switch_codec codec, uint flags) {
@@ -4176,6 +4176,7 @@
public static readonly int SWITCH_MAX_DTMF_DURATION = freeswitchPINVOKE.SWITCH_MAX_DTMF_DURATION_get();
public static readonly string SWITCH_PATH_SEPARATOR = freeswitchPINVOKE.SWITCH_PATH_SEPARATOR_get();
public static readonly string SWITCH_URL_SEPARATOR = freeswitchPINVOKE.SWITCH_URL_SEPARATOR_get();
+ public static readonly string SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE = freeswitchPINVOKE.SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE_get();
public static readonly string SWITCH_READ_TERMINATOR_USED_VARIABLE = freeswitchPINVOKE.SWITCH_READ_TERMINATOR_USED_VARIABLE_get();
public static readonly string SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE = freeswitchPINVOKE.SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE_get();
public static readonly string SWITCH_CURRENT_APPLICATION_VARIABLE = freeswitchPINVOKE.SWITCH_CURRENT_APPLICATION_VARIABLE_get();
@@ -4653,6 +4654,9 @@
[DllImport("mod_managed", EntryPoint="CSharp_SWITCH_URL_SEPARATOR_get")]
public static extern string SWITCH_URL_SEPARATOR_get();
+ [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE_get")]
+ public static extern string SWITCH_BRIDGE_HANGUP_CAUSE_VARIABLE_get();
+
[DllImport("mod_managed", EntryPoint="CSharp_SWITCH_READ_TERMINATOR_USED_VARIABLE_get")]
public static extern string SWITCH_READ_TERMINATOR_USED_VARIABLE_get();
@@ -9979,7 +9983,7 @@
public static extern int switch_rtp_zerocopy_read_frame(HandleRef jarg1, HandleRef jarg2, uint jarg3);
[DllImport("mod_managed", EntryPoint="CSharp_rtp_flush_read_buffer")]
- public static extern void rtp_flush_read_buffer(HandleRef jarg1);
+ public static extern void rtp_flush_read_buffer(HandleRef jarg1, int jarg2);
[DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_enable_vad")]
public static extern int switch_rtp_enable_vad(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, uint jarg4);
@@ -23376,7 +23380,25 @@
SWITCH_RTP_FLAG_PROXY_MEDIA = (1 << 18),
SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19),
SWITCH_RTP_FLAG_FLUSH = (1 << 20),
- SWITCH_RTP_FLAG_AUTOFLUSH = (1 << 21)
+ SWITCH_RTP_FLAG_AUTOFLUSH = (1 << 21),
+ SWITCH_RTP_FLAG_STICKY_FLUSH = (1 << 22)
+}
+
+}
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org)
+ * Version 1.3.35
+ *
+ * Do not make changes to this file unless you know what you are doing--modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+namespace FreeSWITCH.Native {
+
+public enum switch_rtp_flush_t {
+ SWITCH_RTP_FLUSH_ONCE,
+ SWITCH_RTP_FLUSH_STICK,
+ SWITCH_RTP_FLUSH_UNSTICK
}
}
1
0
[commit] r13076 - freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory
by FreeSWITCH SVN 17 Apr '09
by FreeSWITCH SVN 17 Apr '09
17 Apr '09
Author: nmartin
Date: Fri Apr 17 07:32:07 2009
New Revision: 13076
Log:
spelling
Modified:
freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README
Modified: freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README
==============================================================================
--- freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README (original)
+++ freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README Fri Apr 17 07:32:07 2009
@@ -51,7 +51,7 @@
drop dial_by_name_directpry.js in scripts/
-in the dial plan, execute the dial by name directpry like:
+in the dial plan, execute the dial by name directory like:
<extension name="dial_by_name">
<condition field="destination_number" expression="^6000$">
1
0
Author: buklov
Date: Fri Apr 17 00:27:30 2009
New Revision: 13075
Log:
fix
Modified:
freeswitch/trunk/docs/phrase/phrase_ru.xml
Modified: freeswitch/trunk/docs/phrase/phrase_ru.xml
==============================================================================
--- freeswitch/trunk/docs/phrase/phrase_ru.xml (original)
+++ freeswitch/trunk/docs/phrase/phrase_ru.xml Fri Apr 17 00:27:30 2009
@@ -306,7 +306,7 @@
<prompt phrase="Миллионное" filename="h-millionn.wav"/>
<prompt phrase="Миллионных" filename="h-millionxxx.wav"/>
<prompt phrase="Точка" filename="dot.wav"/>
- <prompt phrase="Точка" filename="period.wav"/>
<--period -->
+ <prompt phrase="Точка" filename="period.wav"/>
<!--period -->
<prompt phrase="Точка" filename="point.wav"/>
<prompt phrase="Решётка" filename="pound.wav"/>
<prompt phrase="Звёздочка" filename="star.wav"/>
@@ -450,7 +450,7 @@
<ivr>
<prompt phrase="Номер счета" filename="ivr-account_number.wav"/>
<!-- Account number -->
<prompt phrase="Соединение с вызывающим абонентом" filename="ivr-connect_to_caller.wav"/>
<!--Connect to caller -->
- <prompt phrase="если вам известен добавочный номер вызываемого абонента, пожалуйста введите его сейчас" filename="ivr-enter_ext_pound.wav"/>
<!-- If you know your party's extension, please enter it now -->
+ <prompt phrase="Если вам известен добавочный номер вызываемого абонента, пожалуйста введите его сейчас" filename="ivr-enter_ext_pound.wav"/>
<!-- If you know your party's extension, please enter it now -->
<prompt phrase="Пожалуйста, введите добавочный номер абонента завершив нажатием на клавишу решётка" filename="ivr-enter_ext.wav"/>
<!-- Please enter an extension followed by the pound sign-->
<prompt phrase="Для этого абонента" filename="ivr-for_this_person.wav"/>
<!-- For this person -->
<prompt phrase="Пожалуйста, оставайтесь на линии, идет соединение" filename="ivr-hold_connect_call.wav"/>
<!-- Please hold while I connect your call -->
1
0
Author: buklov
Date: Fri Apr 17 00:18:33 2009
New Revision: 13074
Log:
fix
Modified:
freeswitch/trunk/docs/phrase/phrase_ru.xml
Modified: freeswitch/trunk/docs/phrase/phrase_ru.xml
==============================================================================
--- freeswitch/trunk/docs/phrase/phrase_ru.xml (original)
+++ freeswitch/trunk/docs/phrase/phrase_ru.xml Fri Apr 17 00:18:33 2009
@@ -1,523 +1,523 @@
<language>
<ru>
<ascii>
- <prompt phrase="Пробел " filename= "32.wav"/>
<!-- -->
- <prompt phrase="Решётка" filename= "35.wav"/>
- <prompt phrase="Звездочка " filename= "42.wav"/>
- <prompt phrase="Точка " filename= "46.wav"/>
- <prompt phrase="A " filename= "97.wav"/>
- <prompt phrase="B " filename= "98.wav"/>
- <prompt phrase="C " filename= "99.wav"/>
- <prompt phrase="D " filename= "100.wav"/>
- <prompt phrase="E " filename= "101.wav"/>
- <prompt phrase="F " filename= "102.wav"/>
- <prompt phrase="G " filename= "103.wav"/>
- <prompt phrase="H " filename= "104.wav"/>
- <prompt phrase="I " filename= "105.wav"/>
- <prompt phrase="J " filename= "106.wav"/>
- <prompt phrase="K " filename= "107.wav"/>
- <prompt phrase="L " filename= "108.wav"/>
- <prompt phrase="M " filename= "109.wav"/>
- <prompt phrase="N " filename= "110.wav"/>
- <prompt phrase="O " filename= "111.wav"/>
- <prompt phrase="P " filename= "112.wav"/>
- <prompt phrase="Q " filename= "112.wav"/>
- <prompt phrase="R " filename= "114.wav"/>
- <prompt phrase="S " filename= "115.wav"/>
- <prompt phrase="T " filename= "116.wav"/>
- <prompt phrase="U " filename= "117.wav"/>
- <prompt phrase="V " filename= "118.wav"/>
- <prompt phrase="W " filename= "119.wav"/>
- <prompt phrase="X " filename= "120.wav"/>
- <prompt phrase="Y " filename= "121.wav"/>
- <prompt phrase="Z " filename= "122.wav"/>
+ <prompt phrase="Пробел" filename="32.wav"/>
<!-- -->
+ <prompt phrase="Решётка" filename="35.wav"/>
+ <prompt phrase="Звездочка" filename="42.wav"/>
+ <prompt phrase="Точка" filename="46.wav"/>
+ <prompt phrase="A" filename="97.wav"/>
+ <prompt phrase="B" filename="98.wav"/>
+ <prompt phrase="C" filename="99.wav"/>
+ <prompt phrase="D" filename="100.wav"/>
+ <prompt phrase="E" filename="101.wav"/>
+ <prompt phrase="F" filename="102.wav"/>
+ <prompt phrase="G" filename="103.wav"/>
+ <prompt phrase="H" filename="104.wav"/>
+ <prompt phrase="I" filename="105.wav"/>
+ <prompt phrase="J" filename="106.wav"/>
+ <prompt phrase="K" filename="107.wav"/>
+ <prompt phrase="L" filename="108.wav"/>
+ <prompt phrase="M" filename="109.wav"/>
+ <prompt phrase="N" filename="110.wav"/>
+ <prompt phrase="O" filename="111.wav"/>
+ <prompt phrase="P" filename="112.wav"/>
+ <prompt phrase="Q" filename="113.wav"/>
+ <prompt phrase="R" filename="114.wav"/>
+ <prompt phrase="S" filename="115.wav"/>
+ <prompt phrase="T" filename="116.wav"/>
+ <prompt phrase="U" filename="117.wav"/>
+ <prompt phrase="V" filename="118.wav"/>
+ <prompt phrase="W" filename="119.wav"/>
+ <prompt phrase="X" filename="120.wav"/>
+ <prompt phrase="Y" filename="121.wav"/>
+ <prompt phrase="Z" filename="122.wav"/>
</ascii>
<phonetic>
- <prompt phrase="Пробел " filename= "32.wav"/>
- <prompt phrase="Точка " filename= "46.wav"/>
- <prompt phrase="Alpha " filename= "97.wav"/>
- <prompt phrase="Bravo " filename= "98.wav"/>
- <prompt phrase="Charlie " filename= "99.wav"/>
- <prompt phrase="Delta " filename= "100.wav"/>
- <prompt phrase="Echo " filename= "101.wav"/>
- <prompt phrase="Foxtrot " filename= "102.wav"/>
- <prompt phrase="Golf " filename= "103.wav"/>
- <prompt phrase="Hotel " filename= "104.wav"/>
- <prompt phrase="India " filename= "105.wav"/>
- <prompt phrase="Juliet " filename= "106.wav"/>
- <prompt phrase="Kilo " filename= "107.wav"/>
- <prompt phrase="Lima " filename= "108.wav"/>
- <prompt phrase="Mike " filename= "109.wav"/>
- <prompt phrase="November " filename= "110.wav"/>
- <prompt phrase="Oscar " filename= "111.wav"/>
- <prompt phrase="Papa " filename= "112.wav"/>
- <prompt phrase="Quebec " filename= "113.wav"/>
- <prompt phrase="Romeo " filename= "114.wav"/>
- <prompt phrase="Sierra " filename= "115.wav"/>
- <prompt phrase="Tango " filename= "116.wav"/>
- <prompt phrase="Unifor " filename= "117.wav"/>
- <prompt phrase="Victor " filename= "118.wav"/>
- <prompt phrase="Whiskey " filename= "119.wav"/>
- <prompt phrase="Xray " filename= "120.wav"/>
- <prompt phrase="Yankee " filename= "121.wav"/>
- <prompt phrase="Zulu " filename= "122.wav"/>
+ <prompt phrase="Пробел" filename="32.wav"/>
+ <prompt phrase="Точка" filename="46.wav"/>
+ <prompt phrase="Alpha" filename="97.wav"/>
+ <prompt phrase="Bravo" filename="98.wav"/>
+ <prompt phrase="Charlie" filename="99.wav"/>
+ <prompt phrase="Delta" filename="100.wav"/>
+ <prompt phrase="Echo" filename="101.wav"/>
+ <prompt phrase="Foxtrot" filename="102.wav"/>
+ <prompt phrase="Golf" filename="103.wav"/>
+ <prompt phrase="Hotel" filename="104.wav"/>
+ <prompt phrase="India" filename="105.wav"/>
+ <prompt phrase="Juliet" filename="106.wav"/>
+ <prompt phrase="Kilo" filename="107.wav"/>
+ <prompt phrase="Lima" filename="108.wav"/>
+ <prompt phrase="Mike" filename="109.wav"/>
+ <prompt phrase="November" filename="110.wav"/>
+ <prompt phrase="Oscar" filename="111.wav"/>
+ <prompt phrase="Papa" filename="112.wav"/>
+ <prompt phrase="Quebec" filename="113.wav"/>
+ <prompt phrase="Romeo" filename="114.wav"/>
+ <prompt phrase="Sierra" filename="115.wav"/>
+ <prompt phrase="Tango" filename="116.wav"/>
+ <prompt phrase="Unifor" filename="117.wav"/>
+ <prompt phrase="Victor" filename="118.wav"/>
+ <prompt phrase="Whiskey" filename="119.wav"/>
+ <prompt phrase="Xray" filename="120.wav"/>
+ <prompt phrase="Yankee" filename="121.wav"/>
+ <prompt phrase="Zulu" filename="122.wav"/>
</phonetic>
<digits>
- <prompt phrase="ноль " filename= "0.wav"/>
- <prompt phrase="нулевая" filename= "h-0f.wav"/>
- <prompt phrase="нулевой" filename= "h-0m.wav"/>
- <prompt phrase="Нулевое" filename= "h-0n.wav"/>
- <prompt phrase="нулевого" filename= "h-0x.wav"/>
- <prompt phrase="Один " filename= "1.wav"/>
- <prompt phrase="Одна " filename= "1f.wav"/>
- <prompt phrase="Одно " filename= "1n.wav"/>
- <prompt phrase="Одного" filename= "1x.wav"/>
- <prompt phrase="Первого " filename= "h-1x.wav"/>
- <prompt phrase="Первый " filename= "h-1m.wav"/>
- <prompt phrase="Первое" filename= "h-1n.wav"/>
- <prompt phrase="Первая" filename= "h-1f.wav"/>
- <prompt phrase="Одна" filename= "h-1xx.wav"/>
- <prompt phrase="Два " filename= "2.wav"/>
- <prompt phrase="Две " filename= "2f.wav"/>
- <prompt phrase="Два " filename= "2n.wav"/>
- <prompt phrase="Двух" filename= "h-2xx.wav"/>
- <prompt phrase="Второе" filename= "h-2n.wav"/>
- <prompt phrase="Второго " filename= "h-2x.wav"/>
- <prompt phrase="Второй " filename= "h-2m.wav"/>
- <prompt phrase="Вторая" filename= "h-2f.wav"/>
- <prompt phrase="Три " filename= "3.wav"/>
- <prompt phrase="Третьего " filename= "h-3x.wav"/>
- <prompt phrase="Третий " filename= "h-3m.wav"/>
- <prompt phrase="Третья" filename= "h-3f.wav"/>
- <prompt phrase="третье" filename= "h-3n.wav"/>
- <prompt phrase="Трёх" filename= "h-3xx.wav"/>
- <prompt phrase="Четыре " filename= "4.wav"/>
- <prompt phrase="Четвёртая" filename= "h-4f.wav"/>
- <prompt phrase="Четвёртого " filename= "h-4x.wav"/>
- <prompt phrase="Четвёртый " filename= "h-4m.wav"/>
- <prompt phrase="Четвёртое" filename= "h-4n.wav"/>
- <prompt phrase="Четырёх" filename= "h-4xx.wav"/>
- <prompt phrase="Пять" filename= "5.wav"/>
- <prompt phrase="Пятая" filename= "h-5f.wav"/>
- <prompt phrase="Пятого" filename= "h-5x.wav"/>
- <prompt phrase="Пятый " filename= "h-5m.wav"/>
- <prompt phrase="Пятое" filename= "h-5n.wav"/>
- <prompt phrase="Пяти" filename= "h-5xx.wav"/>
- <prompt phrase="Шесть" filename= "6.wav"/>
- <prompt phrase="Шестая" filename= "h-6f.wav"/>
- <prompt phrase="Шестого" filename= "h-6x.wav"/>
- <prompt phrase="Шестой" filename= "h-6m.wav"/>
- <prompt phrase="Шестое" filename= "h-6n.wav"/>
- <prompt phrase="Шести" filename= "h-6xx.wav"/>
- <prompt phrase="Семь" filename= "7.wav"/>
- <prompt phrase="Седьмая" filename= "h-7f.wav"/>
- <prompt phrase="Седьмого" filename= "h-7x.wav"/>
- <prompt phrase="Седьмой" filename= "h-7m.wav"/>
- <prompt phrase="Седьмое" filename= "h-7n.wav"/>
- <prompt phrase="Семи" filename= "h-7xx.wav"/>
- <prompt phrase="Восемь" filename= "8.wav"/>
- <prompt phrase="Восьмая" filename= "h-8f.wav"/>
- <prompt phrase="Восьмого" filename= "h-8x.wav"/>
- <prompt phrase="Восьмой" filename= "h-8m.wav"/>
- <prompt phrase="Восьмое" filename= "h-8n.wav"/>
- <prompt phrase="Восьми" filename= "h-8xx.wav"/>
- <prompt phrase="Девять" filename= "9.wav"/>
- <prompt phrase="Девятая" filename= "h-9f.wav"/>
- <prompt phrase="Девятого" filename= "h-9x.wav"/>
- <prompt phrase="Девятый" filename= "h-9m.wav"/>
- <prompt phrase="Девятое" filename= "h-9n.wav"/>
- <prompt phrase="Девяти" filename= "h-9xx.wav"/>
- <prompt phrase="Десять" filename= "10.wav"/>
- <prompt phrase="Десятая" filename= "h-10f.wav"/>
- <prompt phrase="Десятого" filename= "h-10x.wav"/>
- <prompt phrase="Десятый" filename= "h-10m.wav"/>
- <prompt phrase="Десятое" filename= "h-10n.wav"/>
- <prompt phrase="Десяти" filename= "h-10xx.wav"/>
- <prompt phrase="Одинадцать" filename= "11.wav"/>
- <prompt phrase="Одинадцатая" filename= "h-11f.wav"/>
- <prompt phrase="Одинадцатого" filename= "h-11x.wav"/>
- <prompt phrase="Одинадцатый" filename= "h-11m.wav"/>
- <prompt phrase="Одинадцатое" filename= "h-11n.wav"/>
- <prompt phrase="Одинадцати" filename= "h-11xx.wav"/>
- <prompt phrase="Двенадцать" filename= "12.wav"/>
- <prompt phrase="Двенадцатая" filename= "h-12f.wav"/>
- <prompt phrase="Двенадцатого" filename= "h-12x.wav"/>
- <prompt phrase="Двенадцатый" filename= "h-12m.wav"/>
- <prompt phrase="Двенадцатое" filename= "h-12n.wav"/>
- <prompt phrase="Двенадцати" filename= "h-12xx.wav"/>
- <prompt phrase="Тринадцать" filename= "13.wav"/>
- <prompt phrase="Тринадцатая" filename= "h-13f.wav"/>
- <prompt phrase="Тринадцатого" filename= "h-13x.wav"/>
- <prompt phrase="Тринадцатый" filename= "h-13m.wav"/>
- <prompt phrase="Тринадцатое" filename= "h-13n.wav"/>
- <prompt phrase="Тринадцати" filename= "h-13xx.wav"/>
- <prompt phrase="Четырнадцать" filename= "14.wav"/>
- <prompt phrase="Четырнадцатая" filename= "h-14f.wav"/>
- <prompt phrase="Четырнадцатого" filename= "h-14x.wav"/>
- <prompt phrase="Четырнадцатый" filename= "h-14m.wav"/>
- <prompt phrase="Четырнадцатое" filename= "h-14n.wav"/>
- <prompt phrase="Четырнадцати" filename= "h-14xx.wav"/>
- <prompt phrase="Пятнадцать" filename= "15.wav"/>
- <prompt phrase="Пятнадцатая" filename= "h-15f.wav"/>
- <prompt phrase="Пятнадцатого" filename= "h-15x.wav"/>
- <prompt phrase="Пятнадцатый" filename= "h-15m.wav"/>
- <prompt phrase="Пятнадцатое" filename= "h-15n.wav"/>
- <prompt phrase="Пятнадцати" filename= "h-15xx.wav"/>
- <prompt phrase="Шестнадцать" filename= "16.wav"/>
- <prompt phrase="Шестнадцатая" filename= "h-16f.wav"/>
- <prompt phrase="Шестнадцатого" filename= "h-16x.wav"/>
- <prompt phrase="Шестнадцатый" filename= "h-16m.wav"/>
- <prompt phrase="Шестнадцатое" filename= "h-16n.wav"/>
- <prompt phrase="Шестнадцати" filename= "h-16xx.wav"/>
- <prompt phrase="Семнадцать" filename= "17.wav"/>
- <prompt phrase="Семнадцатая" filename= "h-17f.wav"/>
- <prompt phrase="Семнадцатого" filename= "h-17x.wav"/>
- <prompt phrase="Семнадцатый" filename= "h-17m.wav"/>
- <prompt phrase="Семнадцатое" filename= "h-17n.wav"/>
- <prompt phrase="Семнадцати" filename= "h-17xx.wav"/>
- <prompt phrase="Восемнадцать" filename= "18.wav"/>
- <prompt phrase="Восемнадцатая" filename= "h-18f.wav"/>
- <prompt phrase="Восемнадцатого" filename= "h-18x.wav"/>
- <prompt phrase="Восемнадцатый" filename= "h-18m.wav"/>
- <prompt phrase="Восемнадцатое" filename= "h-18n.wav"/>
- <prompt phrase="Восемнадцати" filename= "h-18xx.wav"/>
- <prompt phrase="Девятнадцать" filename= "19.wav"/>
- <prompt phrase="Девятнадцатая" filename= "h-19f.wav"/>
- <prompt phrase="Девятнадцатого" filename= "h-19x.wav"/>
- <prompt phrase="Девятнадцатый" filename= "h-19m.wav"/>
- <prompt phrase="Девятнадцатое" filename= "h-19n.wav"/>
- <prompt phrase="Девятнадцати" filename= "h-19xx.wav"/>
- <prompt phrase="Двадцать" filename= "20.wav"/>
- <prompt phrase="Двадцатая" filename= "h-20f.wav"/>
- <prompt phrase="Двадцатого" filename= "h-20x.wav"/>
- <prompt phrase="Двадцатый" filename= "h-20m.wav"/>
- <prompt phrase="Двадцатое" filename= "h-20n.wav"/>
- <prompt phrase="Двадцати" filename= "h-20xx.wav"/>
- <prompt phrase="Тридцать" filename= "30.wav"/>
- <prompt phrase="Тридцатая" filename= "h-30f.wav"/>
- <prompt phrase="Тридцатого" filename= "h-30x.wav"/>
- <prompt phrase="Тридцатый" filename= "h-30m.wav"/>
- <prompt phrase="Тридцатое" filename= "h-30n.wav"/>
- <prompt phrase="Тридцати" filename= "h-30xx.wav"/>
- <prompt phrase="Сорок" filename= "40.wav"/>
- <prompt phrase="Сороковая" filename= "h-40f.wav"/>
- <prompt phrase="Сорокового" filename= "h-40x.wav"/>
- <prompt phrase="Сороковой" filename= "h-40m.wav"/>
- <prompt phrase="Сороковое" filename= "h-40n.wav"/>
- <prompt phrase="Сорока" filename= "h-40xx.wav"/>
- <prompt phrase="Пятьдесят" filename= "50.wav"/>
- <prompt phrase="Пятидесятая" filename= "h-50f.wav"/>
- <prompt phrase="Пятидесятого" filename= "h-50x.wav"/>
- <prompt phrase="Пятидесятый" filename= "h-50m.wav"/>
- <prompt phrase="Пятидесятое" filename= "h-50n.wav"/>
- <prompt phrase="Пятидесяти" filename= "h-50xx.wav"/>
- <prompt phrase="Шестьдесят" filename= "60.wav"/>
- <prompt phrase="Шестидесятая" filename= "h-60f.wav"/>
- <prompt phrase="Шестидесятого" filename= "h-60x.wav"/>
- <prompt phrase="Шестидесятый" filename= "h-60m.wav"/>
- <prompt phrase="Шестидесятое" filename= "h-60n.wav"/>
- <prompt phrase="Шестидесяти" filename= "h-60xx.wav"/>
- <prompt phrase="Семьдесят" filename= "70.wav"/>
- <prompt phrase="Семидесятая" filename= "h-70f.wav"/>
- <prompt phrase="Семидесятого" filename= "h-70x.wav"/>
- <prompt phrase="Семидесятый" filename= "h-70m.wav"/>
- <prompt phrase="Семидесятое" filename= "h-70n.wav"/>
- <prompt phrase="Семидесяти" filename= "h-70xx.wav"/>
- <prompt phrase="Восемьдесят" filename= "80.wav"/>
- <prompt phrase="Восьмидесятая" filename= "h-80f.wav"/>
- <prompt phrase="Восемидесятого" filename= "h-80x.wav"/>
- <prompt phrase="Восемидесятый" filename= "h-80m.wav"/>
- <prompt phrase="Восьмидесятое" filename= "h-80n.wav"/>
- <prompt phrase="Восьмидесяти" filename= "h-80xx.wav"/>
- <prompt phrase="Девяносто" filename= "90.wav"/>
- <prompt phrase="Девяностая" filename= "h-90f.wav"/>
- <prompt phrase="Девяностого" filename= "h-90x.wav"/>
- <prompt phrase="Девяностый" filename= "h-90m.wav"/>
- <prompt phrase="Девяностое" filename= "h-90n.wav"/>
- <prompt phrase="Девяноста" filename= "h-90xx.wav"/>
- <prompt phrase="Сто" filename= "100.wav"/>
- <prompt phrase="Сотая" filename= "h-100f.wav"/>
- <prompt phrase="Сотого" filename= "h-100x.wav"/>
- <prompt phrase="Сотый" filename= "h-100m.wav"/>
- <prompt phrase="Сотое" filename= "h-100n.wav"/>
- <prompt phrase="Ста" filename= "h-100xx.wav"/>
- <prompt phrase="Двести" filename= "200.wav"/>
- <prompt phrase="Двухсотая" filename= "h-200f.wav"/>
- <prompt phrase="Двухсотого" filename= "h-200x.wav"/>
- <prompt phrase="Двухсотый" filename= "h-200m.wav"/>
- <prompt phrase="Двухсотое" filename= "h-200n.wav"/>
- <prompt phrase="Двухсот" filename= "h-200xx.wav"/>
- <prompt phrase="Триста" filename= "300.wav"/>
- <prompt phrase="Трёхсотая" filename= "h-300f.wav"/>
- <prompt phrase="Трёхсотого" filename= "h-300x.wav"/>
- <prompt phrase="Трёхсотый" filename= "h-300m.wav"/>
- <prompt phrase="Трёхсотое" filename= "h-300n.wav"/>
- <prompt phrase="Трёхсот" filename= "h-300xx.wav"/>
- <prompt phrase="Четыреста" filename= "400.wav"/>
- <prompt phrase="Четырёхсотая" filename= "h-400f.wav"/>
- <prompt phrase="Четырёхсотого" filename= "h-400x.wav"/>
- <prompt phrase="Четырёхсотый" filename= "h-400m.wav"/>
- <prompt phrase="Четырёхсотое" filename= "h-400n.wav"/>
- <prompt phrase="Четырёхсот" filename= "h-400xx.wav"/>
- <prompt phrase="Пятьсот" filename= "500.wav"/>
- <prompt phrase="Пятисотая" filename= "h-500f.wav"/>
- <prompt phrase="Пятисотого" filename= "h-500x.wav"/>
- <prompt phrase="Пятисотый" filename= "h-500m.wav"/>
- <prompt phrase="Пятисотое" filename= "h-500n.wav"/>
- <prompt phrase="Пятисот" filename= "h-500xx.wav"/>
- <prompt phrase="Шестьсот" filename= "600.wav"/>
- <prompt phrase="Шестисотая" filename= "h-600f.wav"/>
- <prompt phrase="Шестисотого" filename= "h-600x.wav"/>
- <prompt phrase="Шестисотый" filename= "h-600m.wav"/>
- <prompt phrase="Шестисотое" filename= "h-600n.wav"/>
- <prompt phrase="Шестисот" filename= "h-600xx.wav"/>
- <prompt phrase="Семьсот" filename= "700.wav"/>
- <prompt phrase="Семисотая" filename= "h-700f.wav"/>
- <prompt phrase="Семисотого" filename= "h-700x.wav"/>
- <prompt phrase="Семисотый" filename= "h-700m.wav"/>
- <prompt phrase="Семисотое" filename= "h-700n.wav"/>
- <prompt phrase="Семисот" filename= "h-700xx.wav"/>
- <prompt phrase="Восемьсот" filename= "800.wav"/>
- <prompt phrase="Восьмисотая" filename= "h-800f.wav"/>
- <prompt phrase="Восьмисотого" filename= "h-800x.wav"/>
- <prompt phrase="Восьмисотый" filename= "h-800m.wav"/>
- <prompt phrase="Восьмисотое" filename= "h-800n.wav"/>
- <prompt phrase="Восьмисот" filename= "h-800xx.wav"/>
- <prompt phrase="Девятьсот" filename= "900.wav"/>
- <prompt phrase="Девятисотая" filename= "h-900f.wav"/>
- <prompt phrase="Девятосотого" filename= "h-900x.wav"/>
- <prompt phrase="Девятисотый" filename= "h-900m.wav"/>
- <prompt phrase="Девятисотое" filename= "h-900n.wav"/>
- <prompt phrase="Девятисот" filename= "h-900xx.wav"/>
- <prompt phrase="Тысяча " filename= "thousand.wav"/>
- <prompt phrase="Тысячи " filename= "thousands-i.wav"/>
- <prompt phrase="Тысяч " filename= "thousands.wav"/>
- <prompt phrase="Тысячная" filename= "h-thousandf.wav"/>
- <prompt phrase="Тысячного" filename= "h-thousandx.wav"/>
- <prompt phrase="Тысячный" filename= "h-thousandm.wav"/>
- <prompt phrase="Тысячное" filename= "h-thousandn.wav"/>
- <prompt phrase="Тысячных" filename= "h-thousandxxx.wav"/>
- <prompt phrase="Миллион " filename= "million.wav"/>
- <prompt phrase="Миллиона " filename= "million-a.wav"/>
- <prompt phrase="Миллионов " filename= "millions.wav"/>
- <prompt phrase="Миллионная" filename= "h-millionf.wav"/>
- <prompt phrase="Миллионного " filename= "h-millionx.wav"/>
- <prompt phrase="Миллионный" filename= "h-millionm.wav"/>
- <prompt phrase="Миллионное" filename= "h-millionn.wav"/>
- <prompt phrase="Миллионных" filename= "h-millionxxx.wav"/>
- <prompt phrase="Точка " filename= "dot.wav"/>
- <prompt phrase="Период " filename= "period.wav"/>
- <prompt phrase="Точка " filename= "point.wav"/>
- <prompt phrase="Решётка " filename= "pound.wav"/>
- <prompt phrase="Звёздочка " filename= "star.wav"/>
+ <prompt phrase="ноль" filename="0.wav"/>
+ <prompt phrase="нулевая" filename="h-0f.wav"/>
+ <prompt phrase="нулевой" filename="h-0m.wav"/>
+ <prompt phrase="Нулевое" filename="h-0n.wav"/>
+ <prompt phrase="нулевого" filename="h-0x.wav"/>
+ <prompt phrase="Один" filename="1.wav"/>
+ <prompt phrase="Одна" filename="1f.wav"/>
+ <prompt phrase="Одно" filename="1n.wav"/>
+ <prompt phrase="Одного" filename="1x.wav"/>
+ <prompt phrase="Первого" filename="h-1x.wav"/>
+ <prompt phrase="Первый" filename="h-1m.wav"/>
+ <prompt phrase="Первое" filename="h-1n.wav"/>
+ <prompt phrase="Первая" filename="h-1f.wav"/>
+ <prompt phrase="Одна" filename="h-1xx.wav"/>
+ <prompt phrase="Два" filename="2.wav"/>
+ <prompt phrase="Две" filename="2f.wav"/>
+ <prompt phrase="Два" filename="2n.wav"/>
+ <prompt phrase="Двух" filename="h-2xx.wav"/>
+ <prompt phrase="Второе" filename="h-2n.wav"/>
+ <prompt phrase="Второго" filename="h-2x.wav"/>
+ <prompt phrase="Второй" filename="h-2m.wav"/>
+ <prompt phrase="Вторая" filename="h-2f.wav"/>
+ <prompt phrase="Три" filename="3.wav"/>
+ <prompt phrase="Третьего" filename="h-3x.wav"/>
+ <prompt phrase="Третий" filename="h-3m.wav"/>
+ <prompt phrase="Третья" filename="h-3f.wav"/>
+ <prompt phrase="третье" filename="h-3n.wav"/>
+ <prompt phrase="Трёх" filename="h-3xx.wav"/>
+ <prompt phrase="Четыре" filename="4.wav"/>
+ <prompt phrase="Четвёртая" filename="h-4f.wav"/>
+ <prompt phrase="Четвёртого" filename="h-4x.wav"/>
+ <prompt phrase="Четвёртый" filename="h-4m.wav"/>
+ <prompt phrase="Четвёртое" filename="h-4n.wav"/>
+ <prompt phrase="Четырёх" filename="h-4xx.wav"/>
+ <prompt phrase="Пять" filename="5.wav"/>
+ <prompt phrase="Пятая" filename="h-5f.wav"/>
+ <prompt phrase="Пятого" filename="h-5x.wav"/>
+ <prompt phrase="Пятый" filename="h-5m.wav"/>
+ <prompt phrase="Пятое" filename="h-5n.wav"/>
+ <prompt phrase="Пяти" filename="h-5xx.wav"/>
+ <prompt phrase="Шесть" filename="6.wav"/>
+ <prompt phrase="Шестая" filename="h-6f.wav"/>
+ <prompt phrase="Шестого" filename="h-6x.wav"/>
+ <prompt phrase="Шестой" filename="h-6m.wav"/>
+ <prompt phrase="Шестое" filename="h-6n.wav"/>
+ <prompt phrase="Шести" filename="h-6xx.wav"/>
+ <prompt phrase="Семь" filename="7.wav"/>
+ <prompt phrase="Седьмая" filename="h-7f.wav"/>
+ <prompt phrase="Седьмого" filename="h-7x.wav"/>
+ <prompt phrase="Седьмой" filename="h-7m.wav"/>
+ <prompt phrase="Седьмое" filename="h-7n.wav"/>
+ <prompt phrase="Семи" filename="h-7xx.wav"/>
+ <prompt phrase="Восемь" filename="8.wav"/>
+ <prompt phrase="Восьмая" filename="h-8f.wav"/>
+ <prompt phrase="Восьмого" filename="h-8x.wav"/>
+ <prompt phrase="Восьмой" filename="h-8m.wav"/>
+ <prompt phrase="Восьмое" filename="h-8n.wav"/>
+ <prompt phrase="Восьми" filename="h-8xx.wav"/>
+ <prompt phrase="Девять" filename="9.wav"/>
+ <prompt phrase="Девятая" filename="h-9f.wav"/>
+ <prompt phrase="Девятого" filename="h-9x.wav"/>
+ <prompt phrase="Девятый" filename="h-9m.wav"/>
+ <prompt phrase="Девятое" filename="h-9n.wav"/>
+ <prompt phrase="Девяти" filename="h-9xx.wav"/>
+ <prompt phrase="Десять" filename="10.wav"/>
+ <prompt phrase="Десятая" filename="h-10f.wav"/>
+ <prompt phrase="Десятого" filename="h-10x.wav"/>
+ <prompt phrase="Десятый" filename="h-10m.wav"/>
+ <prompt phrase="Десятое" filename="h-10n.wav"/>
+ <prompt phrase="Десяти" filename="h-10xx.wav"/>
+ <prompt phrase="Одинадцать" filename="11.wav"/>
+ <prompt phrase="Одинадцатая" filename="h-11f.wav"/>
+ <prompt phrase="Одинадцатого" filename="h-11x.wav"/>
+ <prompt phrase="Одинадцатый" filename="h-11m.wav"/>
+ <prompt phrase="Одинадцатое" filename="h-11n.wav"/>
+ <prompt phrase="Одинадцати" filename="h-11xx.wav"/>
+ <prompt phrase="Двенадцать" filename="12.wav"/>
+ <prompt phrase="Двенадцатая" filename="h-12f.wav"/>
+ <prompt phrase="Двенадцатого" filename="h-12x.wav"/>
+ <prompt phrase="Двенадцатый" filename="h-12m.wav"/>
+ <prompt phrase="Двенадцатое" filename="h-12n.wav"/>
+ <prompt phrase="Двенадцати" filename="h-12xx.wav"/>
+ <prompt phrase="Тринадцать" filename="13.wav"/>
+ <prompt phrase="Тринадцатая" filename="h-13f.wav"/>
+ <prompt phrase="Тринадцатого" filename="h-13x.wav"/>
+ <prompt phrase="Тринадцатый" filename="h-13m.wav"/>
+ <prompt phrase="Тринадцатое" filename="h-13n.wav"/>
+ <prompt phrase="Тринадцати" filename="h-13xx.wav"/>
+ <prompt phrase="Четырнадцать" filename="14.wav"/>
+ <prompt phrase="Четырнадцатая" filename="h-14f.wav"/>
+ <prompt phrase="Четырнадцатого" filename="h-14x.wav"/>
+ <prompt phrase="Четырнадцатый" filename="h-14m.wav"/>
+ <prompt phrase="Четырнадцатое" filename="h-14n.wav"/>
+ <prompt phrase="Четырнадцати" filename="h-14xx.wav"/>
+ <prompt phrase="Пятнадцать" filename="15.wav"/>
+ <prompt phrase="Пятнадцатая" filename="h-15f.wav"/>
+ <prompt phrase="Пятнадцатого" filename="h-15x.wav"/>
+ <prompt phrase="Пятнадцатый" filename="h-15m.wav"/>
+ <prompt phrase="Пятнадцатое" filename="h-15n.wav"/>
+ <prompt phrase="Пятнадцати" filename="h-15xx.wav"/>
+ <prompt phrase="Шестнадцать" filename="16.wav"/>
+ <prompt phrase="Шестнадцатая" filename="h-16f.wav"/>
+ <prompt phrase="Шестнадцатого" filename="h-16x.wav"/>
+ <prompt phrase="Шестнадцатый" filename="h-16m.wav"/>
+ <prompt phrase="Шестнадцатое" filename="h-16n.wav"/>
+ <prompt phrase="Шестнадцати" filename="h-16xx.wav"/>
+ <prompt phrase="Семнадцать" filename="17.wav"/>
+ <prompt phrase="Семнадцатая" filename="h-17f.wav"/>
+ <prompt phrase="Семнадцатого" filename="h-17x.wav"/>
+ <prompt phrase="Семнадцатый" filename="h-17m.wav"/>
+ <prompt phrase="Семнадцатое" filename="h-17n.wav"/>
+ <prompt phrase="Семнадцати" filename="h-17xx.wav"/>
+ <prompt phrase="Восемнадцать" filename="18.wav"/>
+ <prompt phrase="Восемнадцатая" filename="h-18f.wav"/>
+ <prompt phrase="Восемнадцатого" filename="h-18x.wav"/>
+ <prompt phrase="Восемнадцатый" filename="h-18m.wav"/>
+ <prompt phrase="Восемнадцатое" filename="h-18n.wav"/>
+ <prompt phrase="Восемнадцати" filename="h-18xx.wav"/>
+ <prompt phrase="Девятнадцать" filename="19.wav"/>
+ <prompt phrase="Девятнадцатая" filename="h-19f.wav"/>
+ <prompt phrase="Девятнадцатого" filename="h-19x.wav"/>
+ <prompt phrase="Девятнадцатый" filename="h-19m.wav"/>
+ <prompt phrase="Девятнадцатое" filename="h-19n.wav"/>
+ <prompt phrase="Девятнадцати" filename="h-19xx.wav"/>
+ <prompt phrase="Двадцать" filename="20.wav"/>
+ <prompt phrase="Двадцатая" filename="h-20f.wav"/>
+ <prompt phrase="Двадцатого" filename="h-20x.wav"/>
+ <prompt phrase="Двадцатый" filename="h-20m.wav"/>
+ <prompt phrase="Двадцатое" filename="h-20n.wav"/>
+ <prompt phrase="Двадцати" filename="h-20xx.wav"/>
+ <prompt phrase="Тридцать" filename="30.wav"/>
+ <prompt phrase="Тридцатая" filename="h-30f.wav"/>
+ <prompt phrase="Тридцатого" filename="h-30x.wav"/>
+ <prompt phrase="Тридцатый" filename="h-30m.wav"/>
+ <prompt phrase="Тридцатое" filename="h-30n.wav"/>
+ <prompt phrase="Тридцати" filename="h-30xx.wav"/>
+ <prompt phrase="Сорок" filename="40.wav"/>
+ <prompt phrase="Сороковая" filename="h-40f.wav"/>
+ <prompt phrase="Сорокового" filename="h-40x.wav"/>
+ <prompt phrase="Сороковой" filename="h-40m.wav"/>
+ <prompt phrase="Сороковое" filename="h-40n.wav"/>
+ <prompt phrase="Сорока" filename="h-40xx.wav"/>
+ <prompt phrase="Пятьдесят" filename="50.wav"/>
+ <prompt phrase="Пятидесятая" filename="h-50f.wav"/>
+ <prompt phrase="Пятидесятого" filename="h-50x.wav"/>
+ <prompt phrase="Пятидесятый" filename="h-50m.wav"/>
+ <prompt phrase="Пятидесятое" filename="h-50n.wav"/>
+ <prompt phrase="Пятидесяти" filename="h-50xx.wav"/>
+ <prompt phrase="Шестьдесят" filename="60.wav"/>
+ <prompt phrase="Шестидесятая" filename="h-60f.wav"/>
+ <prompt phrase="Шестидесятого" filename="h-60x.wav"/>
+ <prompt phrase="Шестидесятый" filename="h-60m.wav"/>
+ <prompt phrase="Шестидесятое" filename="h-60n.wav"/>
+ <prompt phrase="Шестидесяти" filename="h-60xx.wav"/>
+ <prompt phrase="Семьдесят" filename="70.wav"/>
+ <prompt phrase="Семидесятая" filename="h-70f.wav"/>
+ <prompt phrase="Семидесятого" filename="h-70x.wav"/>
+ <prompt phrase="Семидесятый" filename="h-70m.wav"/>
+ <prompt phrase="Семидесятое" filename="h-70n.wav"/>
+ <prompt phrase="Семидесяти" filename="h-70xx.wav"/>
+ <prompt phrase="Восемьдесят" filename="80.wav"/>
+ <prompt phrase="Восьмидесятая" filename="h-80f.wav"/>
+ <prompt phrase="Восемидесятого" filename="h-80x.wav"/>
+ <prompt phrase="Восемидесятый" filename="h-80m.wav"/>
+ <prompt phrase="Восьмидесятое" filename="h-80n.wav"/>
+ <prompt phrase="Восьмидесяти" filename="h-80xx.wav"/>
+ <prompt phrase="Девяносто" filename="90.wav"/>
+ <prompt phrase="Девяностая" filename="h-90f.wav"/>
+ <prompt phrase="Девяностого" filename="h-90x.wav"/>
+ <prompt phrase="Девяностый" filename="h-90m.wav"/>
+ <prompt phrase="Девяностое" filename="h-90n.wav"/>
+ <prompt phrase="Девяноста" filename="h-90xx.wav"/>
+ <prompt phrase="Сто" filename="100.wav"/>
+ <prompt phrase="Сотая" filename="h-100f.wav"/>
+ <prompt phrase="Сотого" filename="h-100x.wav"/>
+ <prompt phrase="Сотый" filename="h-100m.wav"/>
+ <prompt phrase="Сотое" filename="h-100n.wav"/>
+ <prompt phrase="Ста" filename="h-100xx.wav"/>
+ <prompt phrase="Двести" filename="200.wav"/>
+ <prompt phrase="Двухсотая" filename="h-200f.wav"/>
+ <prompt phrase="Двухсотого" filename="h-200x.wav"/>
+ <prompt phrase="Двухсотый" filename="h-200m.wav"/>
+ <prompt phrase="Двухсотое" filename="h-200n.wav"/>
+ <prompt phrase="Двухсот" filename="h-200xx.wav"/>
+ <prompt phrase="Триста" filename="300.wav"/>
+ <prompt phrase="Трёхсотая" filename="h-300f.wav"/>
+ <prompt phrase="Трёхсотого" filename="h-300x.wav"/>
+ <prompt phrase="Трёхсотый" filename="h-300m.wav"/>
+ <prompt phrase="Трёхсотое" filename="h-300n.wav"/>
+ <prompt phrase="Трёхсот" filename="h-300xx.wav"/>
+ <prompt phrase="Четыреста" filename="400.wav"/>
+ <prompt phrase="Четырёхсотая" filename="h-400f.wav"/>
+ <prompt phrase="Четырёхсотого" filename="h-400x.wav"/>
+ <prompt phrase="Четырёхсотый" filename="h-400m.wav"/>
+ <prompt phrase="Четырёхсотое" filename="h-400n.wav"/>
+ <prompt phrase="Четырёхсот" filename="h-400xx.wav"/>
+ <prompt phrase="Пятьсот" filename="500.wav"/>
+ <prompt phrase="Пятисотая" filename="h-500f.wav"/>
+ <prompt phrase="Пятисотого" filename="h-500x.wav"/>
+ <prompt phrase="Пятисотый" filename="h-500m.wav"/>
+ <prompt phrase="Пятисотое" filename="h-500n.wav"/>
+ <prompt phrase="Пятисот" filename="h-500xx.wav"/>
+ <prompt phrase="Шестьсот" filename="600.wav"/>
+ <prompt phrase="Шестисотая" filename="h-600f.wav"/>
+ <prompt phrase="Шестисотого" filename="h-600x.wav"/>
+ <prompt phrase="Шестисотый" filename="h-600m.wav"/>
+ <prompt phrase="Шестисотое" filename="h-600n.wav"/>
+ <prompt phrase="Шестисот" filename="h-600xx.wav"/>
+ <prompt phrase="Семьсот" filename="700.wav"/>
+ <prompt phrase="Семисотая" filename="h-700f.wav"/>
+ <prompt phrase="Семисотого" filename="h-700x.wav"/>
+ <prompt phrase="Семисотый" filename="h-700m.wav"/>
+ <prompt phrase="Семисотое" filename="h-700n.wav"/>
+ <prompt phrase="Семисот" filename="h-700xx.wav"/>
+ <prompt phrase="Восемьсот" filename="800.wav"/>
+ <prompt phrase="Восьмисотая" filename="h-800f.wav"/>
+ <prompt phrase="Восьмисотого" filename="h-800x.wav"/>
+ <prompt phrase="Восьмисотый" filename="h-800m.wav"/>
+ <prompt phrase="Восьмисотое" filename="h-800n.wav"/>
+ <prompt phrase="Восьмисот" filename="h-800xx.wav"/>
+ <prompt phrase="Девятьсот" filename="900.wav"/>
+ <prompt phrase="Девятисотая" filename="h-900f.wav"/>
+ <prompt phrase="Девятосотого" filename="h-900x.wav"/>
+ <prompt phrase="Девятисотый" filename="h-900m.wav"/>
+ <prompt phrase="Девятисотое" filename="h-900n.wav"/>
+ <prompt phrase="Девятисот" filename="h-900xx.wav"/>
+ <prompt phrase="Тысяча" filename="thousand.wav"/>
+ <prompt phrase="Тысячи" filename="thousands-i.wav"/>
+ <prompt phrase="Тысяч" filename="thousands.wav"/>
+ <prompt phrase="Тысячная" filename="h-thousandf.wav"/>
+ <prompt phrase="Тысячного" filename="h-thousandx.wav"/>
+ <prompt phrase="Тысячный" filename="h-thousandm.wav"/>
+ <prompt phrase="Тысячное" filename="h-thousandn.wav"/>
+ <prompt phrase="Тысячных" filename="h-thousandxxx.wav"/>
+ <prompt phrase="Миллион" filename="million.wav"/>
+ <prompt phrase="Миллиона" filename="million-a.wav"/>
+ <prompt phrase="Миллионов" filename="millions.wav"/>
+ <prompt phrase="Миллионная" filename="h-millionf.wav"/>
+ <prompt phrase="Миллионного" filename="h-millionx.wav"/>
+ <prompt phrase="Миллионный" filename="h-millionm.wav"/>
+ <prompt phrase="Миллионное" filename="h-millionn.wav"/>
+ <prompt phrase="Миллионных" filename="h-millionxxx.wav"/>
+ <prompt phrase="Точка" filename="dot.wav"/>
+ <prompt phrase="Точка" filename="period.wav"/>
<--period -->
+ <prompt phrase="Точка" filename="point.wav"/>
+ <prompt phrase="Решётка" filename="pound.wav"/>
+ <prompt phrase="Звёздочка" filename="star.wav"/>
</digits>
<currency>
- <prompt phrase="и " filename= "and.wav"/>
- <prompt phrase="Цент " filename= "cent.wav"/>
- <prompt phrase="центральный " filename= "central.wav"/>
- <prompt phrase="Центов в минуту " filename= "cents-per-minute.wav"/>
- <prompt phrase="Центы " filename= "cents.wav"/>
- <prompt phrase="Доллар " filename= "dollar.wav"/>
- <prompt phrase="Долларов " filename= "dollars.wav"/>
- <prompt phrase="Минус " filename= "minus.wav"/>
- <prompt phrase="Отрицательный " filename= "negative.wav"/>
- <prompt phrase="Копеек " filename= "kopeck-i.wav"/>
- <prompt phrase="Копейка " filename= "kopeck.wav"/>
- <prompt phrase="Копейки " filename= "kopecks.wav"/>
- <prompt phrase="Рубль " filename= "ruble.wav"/>
- <prompt phrase="Рубля " filename= "ruble-a.wav"/>
- <prompt phrase="Рублей " filename= "rubles.wav"/>
+ <prompt phrase="и" filename="and.wav"/>
+ <prompt phrase="Цент" filename="cent.wav"/>
+ <prompt phrase="центральный" filename="central.wav"/>
+ <prompt phrase="Центов в минуту" filename="cents-per-minute.wav"/>
+ <prompt phrase="Центы" filename="cents.wav"/>
+ <prompt phrase="Доллар" filename="dollar.wav"/>
+ <prompt phrase="Долларов" filename="dollars.wav"/>
+ <prompt phrase="Минус" filename="minus.wav"/>
+ <prompt phrase="Отрицательный" filename="negative.wav"/>
+ <prompt phrase="Копеек" filename="kopeck-i.wav"/>
+ <prompt phrase="Копейка" filename="kopeck.wav"/>
+ <prompt phrase="Копейки" filename="kopecks.wav"/>
+ <prompt phrase="Рубль" filename="ruble.wav"/>
+ <prompt phrase="Рубля" filename="ruble-a.wav"/>
+ <prompt phrase="Рублей" filename="rubles.wav"/>
</currency>
<time>
- <prompt phrase="до полудня " filename= "a-m.wav"/>
- <prompt phrase="В " filename= "at.wav"/>
- <prompt phrase="Воскресенье " filename= "day-0.wav"/>
- <prompt phrase="Понедельник " filename= "day-1.wav"/>
- <prompt phrase="Вторник " filename= "day-2.wav"/>
- <prompt phrase="Среда " filename= "day-3.wav"/>
- <prompt phrase="Четверг " filename= "day-4.wav"/>
- <prompt phrase="Пятница " filename= "day-5.wav"/>
- <prompt phrase="Суббота " filename= "day-6.wav"/>
- <prompt phrase="час" filename= "hour.wav"/>
- <prompt phrase="часа " filename= "hours-a.wav"/>
- <prompt phrase="часов " filename= "hours.wav"/>
- <prompt phrase="минута " filename= "minute.wav"/>
- <prompt phrase="Минуты" filename= "minutes-i.wav"/>
- <prompt phrase="минут " filename= "minutes.wav"/>
- <prompt phrase="секунда " filename= "second.wav"/>
- <prompt phrase="секунды " filename= "seconds-i.wav"/>
- <prompt phrase="секунд" filename= "seconds.wav"/>
- <prompt phrase="января " filename= "mon-0.wav"/>
- <prompt phrase="февраля " filename= "mon-1.wav"/>
- <prompt phrase="марта " filename= "mon-2.wav"/>
- <prompt phrase="апреля " filename= "mon-3.wav"/>
- <prompt phrase="мая " filename= "mon-4.wav"/>
- <prompt phrase="июня " filename= "mon-5.wav"/>
- <prompt phrase="июля " filename= "mon-6.wav"/>
- <prompt phrase="августа " filename= "mon-7.wav"/>
- <prompt phrase="сентября " filename= "mon-8.wav"/>
- <prompt phrase="октября " filename= "mon-9.wav"/>
- <prompt phrase="ноября " filename= "mon-10.wav"/>
- <prompt phrase="декабря " filename= "mon-11.wav"/>
- <prompt phrase="после полудня " filename= "p-m.wav"/>
- <prompt phrase="сегодня " filename= "today.wav"/>
- <prompt phrase="завтра " filename= "tomorrow.wav"/>
- <prompt phrase="вчера " filename= "yesterday.wav"/>
- <prompt phrase="Год" filename= "year.wav"/>
- <prompt phrase="Года" filename= "h-year.wav"/>
- <prompt phrase="Годов" filename= "years.wav"/>
- <prompt phrase="Лет" filename= "yearsx.wav"/>
+ <prompt phrase="до полудня" filename="a-m.wav"/>
+ <prompt phrase="В" filename="at.wav"/>
+ <prompt phrase="Воскресенье" filename="day-0.wav"/>
+ <prompt phrase="Понедельник" filename="day-1.wav"/>
+ <prompt phrase="Вторник" filename="day-2.wav"/>
+ <prompt phrase="Среда" filename="day-3.wav"/>
+ <prompt phrase="Четверг" filename="day-4.wav"/>
+ <prompt phrase="Пятница" filename="day-5.wav"/>
+ <prompt phrase="Суббота" filename="day-6.wav"/>
+ <prompt phrase="час" filename="hour.wav"/>
+ <prompt phrase="часа" filename="hours-a.wav"/>
+ <prompt phrase="часов" filename="hours.wav"/>
+ <prompt phrase="минута" filename="minute.wav"/>
+ <prompt phrase="Минуты" filename="minutes-i.wav"/>
+ <prompt phrase="минут" filename="minutes.wav"/>
+ <prompt phrase="секунда" filename="second.wav"/>
+ <prompt phrase="секунды" filename="seconds-i.wav"/>
+ <prompt phrase="секунд" filename="seconds.wav"/>
+ <prompt phrase="января" filename="mon-0.wav"/>
+ <prompt phrase="февраля" filename="mon-1.wav"/>
+ <prompt phrase="марта" filename="mon-2.wav"/>
+ <prompt phrase="апреля" filename="mon-3.wav"/>
+ <prompt phrase="мая" filename="mon-4.wav"/>
+ <prompt phrase="июня" filename="mon-5.wav"/>
+ <prompt phrase="июля" filename="mon-6.wav"/>
+ <prompt phrase="августа" filename="mon-7.wav"/>
+ <prompt phrase="сентября" filename="mon-8.wav"/>
+ <prompt phrase="октября" filename="mon-9.wav"/>
+ <prompt phrase="ноября" filename="mon-10.wav"/>
+ <prompt phrase="декабря" filename="mon-11.wav"/>
+ <prompt phrase="после полудня" filename="p-m.wav"/>
+ <prompt phrase="сегодня" filename="today.wav"/>
+ <prompt phrase="завтра" filename="tomorrow.wav"/>
+ <prompt phrase="вчера" filename="yesterday.wav"/>
+ <prompt phrase="Год" filename="year.wav"/>
+ <prompt phrase="Года" filename="h-year.wav"/>
+ <prompt phrase="Годов" filename="years.wav"/>
+ <prompt phrase="Лет" filename="yearsx.wav"/>
</time>
<voicemail>
- <prompt phrase="Абонент с номером " filename= "vm-person.wav"/>
<!-- The person at extension-->
- <prompt phrase="Помечено как важное " filename= "vm-marked_urgent.wav"/>
<!-- marked urgent-->
- <prompt phrase="отправлен на электронную почту" filename= "vm-emailed.wav"/>
<!-- emailed-->
- <prompt phrase="у Вас " filename= "vm-you_have.wav"/>
<!--you have -->
- <prompt phrase="Пожалуйста, введите свой идентификатор " filename= "vm-enter_id.wav"/>
<!-- please enter your i d, followed by -->
- <prompt phrase="Пожалуйста, введите свой пароль " filename= "vm-enter_pass.wav"/>
<!-- please enter your password, followed by -->
- <prompt phrase="Неправильный номер " filename= "vm-fail_auth.wav"/>
<!-- login incorrect -->
- <prompt phrase="Добро пожаловать в Вашу голосовую почту " filename= "vm-hello.wav"/>
<!-- welcome to your voicemail -->
- <prompt phrase="До свидания " filename= "vm-goodbye.wav"/>
<!--goodbye -->
- <prompt phrase="После сигнала, пожалуйста, сообщите свое имя, для окончания записи нажмите любую клавишу или перестаньте говорить." filename= "vm-record_name1.wav"/>
<!--at the tone please record your name, press any key or stop talking to end the recording. -->
- <prompt phrase="Выберите приветствие от единицы до девяти " filename= "vm-choose_greeting_choose.wav"/>
<!--choose a greeting between 1 and 9 -->
- <prompt phrase="Неправильное значение " filename= "vm-choose_greeting_fail.wav"/>
<!--invalid value -->
- <prompt phrase="Слишком много неудачных попыток " filename= "vm-abort.wav"/>
<!--too many failed attempts -->
- <prompt phrase="Для изменения Вашего пароля " filename= "vm-change_password.wav"/>
<!-- to change your password -->
- <prompt phrase="После сигнала, запишите свое приветствие, для окончания записи нажмите любую клавишу или перестаньте говорить " filename= "vm-to_record_greeting.wav"/>
<!-- record your greeting at the tone, press any key or stop talking to end the recording -->
- <prompt phrase="После сигнала, запишите свое сообщение, для окончания записи нажмите любую клавишу или перестаньте говорить " filename= "vm-record_message.wav"/>
<!--record your message at the tone, press any key or stop talking to end the recording -->
- <prompt phrase="не доступно " filename= "vm-play_greeting.wav"/>
<!-- is not available -->
- <prompt phrase="новых срочных" filename= "vm-urgent-newx.wav"/>
<!-- urgent new -->
- <prompt phrase="новое срочное " filename= "vm-urgent-new.wav"/>
<!-- -->
- <prompt phrase="новое " filename= "vm-new.wav"/>
<!-- new -->
- <prompt phrase="новых " filename= "vm-newx .wav"/>
<!-- -->
- <prompt phrase="срочное сообщение сохранено" filename= "vm-urgent-saved.wav"/>
<!--urgent saved -->
- <prompt phrase="сохранено " filename= "vm-saved.wav"/>
<!--saved -->
- <prompt phrase="сообщение " filename= "vm-message.wav"/>
<!--message -->
- <prompt phrase="сообщений " filename= "vm-messagex.wav"/>
<!--messages -->
- <prompt phrase="сообщения " filename= "vm-messages.wav"/>
<!-- message -->
- <prompt phrase="нажмите " filename= "vm-press.wav"/>
<!-- press -->
- <prompt phrase="чтобы прослушать новые сообщения" filename= "vm-listen_new.wav"/>
<!-- to listen to new messages -->
- <prompt phrase="для прослушивания сохраненных сообщений " filename= "vm-listen_saved.wav"/>
<!-- to listen to saved messages -->
- <prompt phrase="для дополнительных параметров " filename= "vm-advanced.wav"/>
<!-- for advanced options -->
- <prompt phrase="для выхода " filename= "vm-to_exit.wav"/>
<!-- to exit -->
- <prompt phrase="для записи приветствия " filename= "vm-record_greeting.wav"/>
<!-- to record a greeting -->
- <prompt phrase="для выбора приветствия " filename= "vm-choose_greeting.wav"/>
<!-- to choose greeting -->
- <prompt phrase="для записи Вашего имени " filename= "vm-record_name2.wav"/>
<!-- to record your name -->
- <prompt phrase="для перехода в главное меню " filename= "vm-main_menu.wav"/>
<!-- for the main menu -->
- <prompt phrase="прослушать запись " filename= "vm-listen_to_recording.wav"/>
<!-- to listen to the recording -->
- <prompt phrase="сохранить запись " filename= "vm-save_recording.wav"/>
<!-- to save the recording -->
- <prompt phrase="записать " filename= "vm-rerecord.wav"/>
<!-- to rerecord -->
- <prompt phrase="пометить это сообщение как срочное" filename= "vm-mark-urgent.wav"/>
<!-- to mark this message urgent -->
- <prompt phrase="для продолжения " filename= "vm-continue.wav"/>
<!-- to continue -->
- <prompt phrase="прослушать запись снова " filename= "vm-listen_to_recording_again.wav"/>
<!-- to listen to the recording again -->
- <prompt phrase="удалить запись " filename= "vm-delete_recording.wav"/>
<!-- to delete the recording -->
- <prompt phrase="переслать это сообщение" filename= "vm-to_forward.wav"/>
<!-- to forward the recording to your email -->
- <prompt phrase="переслать запись на электронную почту " filename= "vm-forward_to_email.wav"/>
<!-- -->
- <prompt phrase="приветствие " filename= "vm-greeting.wav"/>
<!--greeting -->
- <prompt phrase="выбрано " filename= "vm-selected.wav"/>
<!-- selected -->
- <prompt phrase="не доступен " filename= "vm-not_available.wav"/>
<!-- is not available -->
- <prompt phrase="сообщение номер " filename= "vm-message_number.wav"/>
<!-- message number -->
- <prompt phrase="удалено " filename= "vm-deleted.wav"/>
<!-- deleted -->
- <prompt phrase="Ваша запись короче минимально допустимой длинны, пожалуйста попробуйте снова " filename= "vm-too-small.wav"/>
<!-- Your recording is below the minimum acceptable length, please try again -->
- <prompt phrase="в папке Входящие " filename= "vm-in_folder.wav"/>
<!-- in folder inbox -->
- <prompt phrase="что бы перезвонить" filename= "vm-return_call_1.wav"/>
<!-- to return the call now -->
- <prompt phrase="для возврата вызова " filename= "vm-return_call.wav"/>
<!-- to return the call now -->
- <prompt phrase="Срочное" filename= "vm-urgent.wav"/>
<!-- urgent -->
- <prompt phrase="добавить вступление к сообщению" filename= "vm-forward_add_intro.wav"/>
<!-- to add an introduction to this message -->
- <prompt phrase="для того что бы послать собощение " filename= "vm-send_message_now.wav"/>
<!-- to send this messege now -->
- <prompt phrase="пожалуйста, введите добавочный номер для отправки сообщения" filename= "vm-forward_enter_ext.wav"/>
<!--please, enter the extention to forward this message to -->
- <prompt phrase="Неправильный добавочный номер" filename= "vm-that_was_an_invalid_ext.wav"/>
<!-- -->
- <prompt phrase="Почтовый ящик переполнен. Пожалуйста перезвоните позже" filename= "vm-mailbox_full.wav"/>
<!-- That mailbox is full. Please try your call again later. -->
+ <prompt phrase="Абонент с номером" filename="vm-person.wav"/>
<!-- The person at extension-->
+ <prompt phrase="Помечено как важное" filename="vm-marked_urgent.wav"/>
<!-- marked urgent-->
+ <prompt phrase="отправлен на электронную почту" filename="vm-emailed.wav"/>
<!-- emailed-->
+ <prompt phrase="у Вас" filename="vm-you_have.wav"/>
<!--you have -->
+ <prompt phrase="Пожалуйста, введите свой идентификатор, завершив нажатием на клавишу" filename="vm-enter_id.wav"/>
<!-- please enter your i d, followed by -->
+ <prompt phrase="Пожалуйста, введите свой пароль , завершив нажатием на клавишу" filename="vm-enter_pass.wav"/>
<!-- please enter your password, followed by -->
+ <prompt phrase="Неправильный номер" filename="vm-fail_auth.wav"/>
<!-- login incorrect -->
+ <prompt phrase="Добро пожаловать в Вашу голосовую почту" filename="vm-hello.wav"/>
<!-- welcome to your voicemail -->
+ <prompt phrase="До свидания" filename="vm-goodbye.wav"/>
<!--goodbye -->
+ <prompt phrase="После сигнала, пожалуйста, сообщите свое имя, для окончания записи нажмите любую клавишу или перестаньте говорить." filename="vm-record_name1.wav"/>
<!--at the tone please record your name, press any key or stop talking to end the recording. -->
+ <prompt phrase="Выберите приветствие от единицы до девяти" filename="vm-choose_greeting_choose.wav"/>
<!--choose a greeting between 1 and 9 -->
+ <prompt phrase="Неправильное значение" filename="vm-choose_greeting_fail.wav"/>
<!--invalid value -->
+ <prompt phrase="Слишком много неудачных попыток" filename="vm-abort.wav"/>
<!--too many failed attempts -->
+ <prompt phrase="Для изменения Вашего пароля" filename="vm-change_password.wav"/>
<!-- to change your password -->
+ <prompt phrase="После сигнала, запишите свое приветствие, для окончания записи нажмите любую клавишу или перестаньте говорить" filename="vm-to_record_greeting.wav"/>
<!-- record your greeting at the tone, press any key or stop talking to end the recording -->
+ <prompt phrase="После сигнала, запишите свое сообщение, для окончания записи нажмите любую клавишу или перестаньте говорить" filename="vm-record_message.wav"/>
<!--record your message at the tone, press any key or stop talking to end the recording -->
+ <prompt phrase="не доступно" filename="vm-play_greeting.wav"/>
<!-- is not available -->
+ <prompt phrase="новых срочных" filename="vm-urgent-newx.wav"/>
<!-- urgent new -->
+ <prompt phrase="новое срочное" filename="vm-urgent-new.wav"/>
<!-- -->
+ <prompt phrase="новое" filename="vm-new.wav"/>
<!-- new -->
+ <prompt phrase="новых" filename="vm-newx .wav"/>
<!-- -->
+ <prompt phrase="срочное сообщение сохранено" filename="vm-urgent-saved.wav"/>
<!--urgent saved -->
+ <prompt phrase="сохранено" filename="vm-saved.wav"/>
<!--saved -->
+ <prompt phrase="сообщение" filename="vm-message.wav"/>
<!--message -->
+ <prompt phrase="сообщений" filename="vm-messagex.wav"/>
<!--messages -->
+ <prompt phrase="сообщения" filename="vm-messages.wav"/>
<!-- message -->
+ <prompt phrase="нажмите" filename="vm-press.wav"/>
<!-- press -->
+ <prompt phrase="чтобы прослушать новые сообщения" filename="vm-listen_new.wav"/>
<!-- to listen to new messages -->
+ <prompt phrase="для прослушивания сохраненных сообщений" filename="vm-listen_saved.wav"/>
<!-- to listen to saved messages -->
+ <prompt phrase="для дополнительных параметров" filename="vm-advanced.wav"/>
<!-- for advanced options -->
+ <prompt phrase="для выхода" filename="vm-to_exit.wav"/>
<!-- to exit -->
+ <prompt phrase="для записи приветствия" filename="vm-record_greeting.wav"/>
<!-- to record a greeting -->
+ <prompt phrase="для выбора приветствия" filename="vm-choose_greeting.wav"/>
<!-- to choose greeting -->
+ <prompt phrase="для записи Вашего имени" filename="vm-record_name2.wav"/>
<!-- to record your name -->
+ <prompt phrase="для перехода в главное меню" filename="vm-main_menu.wav"/>
<!-- for the main menu -->
+ <prompt phrase="прослушать запись" filename="vm-listen_to_recording.wav"/>
<!-- to listen to the recording -->
+ <prompt phrase="сохранить запись" filename="vm-save_recording.wav"/>
<!-- to save the recording -->
+ <prompt phrase="записать" filename="vm-rerecord.wav"/>
<!-- to rerecord -->
+ <prompt phrase="пометить это сообщение как срочное" filename="vm-mark-urgent.wav"/>
<!-- to mark this message urgent -->
+ <prompt phrase="для продолжения" filename="vm-continue.wav"/>
<!-- to continue -->
+ <prompt phrase="прослушать запись снова" filename="vm-listen_to_recording_again.wav"/>
<!-- to listen to the recording again -->
+ <prompt phrase="удалить запись" filename="vm-delete_recording.wav"/>
<!-- to delete the recording -->
+ <prompt phrase="переслать это сообщение" filename="vm-to_forward.wav"/>
<!-- to forward the recording to your email -->
+ <prompt phrase="переслать запись на электронную почту" filename="vm-forward_to_email.wav"/>
<!-- -->
+ <prompt phrase="приветствие" filename="vm-greeting.wav"/>
<!--greeting -->
+ <prompt phrase="выбрано" filename="vm-selected.wav"/>
<!-- selected -->
+ <prompt phrase="не доступен" filename="vm-not_available.wav"/>
<!-- is not available -->
+ <prompt phrase="сообщение номер" filename="vm-message_number.wav"/>
<!-- message number -->
+ <prompt phrase="удалено" filename="vm-deleted.wav"/>
<!-- deleted -->
+ <prompt phrase="Ваша запись короче минимально допустимой длинны, пожалуйста попробуйте снова" filename="vm-too-small.wav"/>
<!-- Your recording is below the minimum acceptable length, please try again -->
+ <prompt phrase="в папке Входящие" filename="vm-in_folder.wav"/>
<!-- in folder inbox -->
+ <prompt phrase="что бы перезвонить" filename="vm-return_call_1.wav"/>
<!-- to return the call now -->
+ <prompt phrase="для возврата вызова" filename="vm-return_call.wav"/>
<!-- to return the call now -->
+ <prompt phrase="Срочное" filename="vm-urgent.wav"/>
<!-- urgent -->
+ <prompt phrase="добавить вступление к сообщению" filename="vm-forward_add_intro.wav"/>
<!-- to add an introduction to this message -->
+ <prompt phrase="для того что бы послать собощение" filename="vm-send_message_now.wav"/>
<!-- to send this messege now -->
+ <prompt phrase="пожалуйста, введите добавочный номер для отправки сообщения" filename="vm-forward_enter_ext.wav"/>
<!--please, enter the extention to forward this message to -->
+ <prompt phrase="Неправильный добавочный номер" filename="vm-that_was_an_invalid_ext.wav"/>
<!-- -->
+ <prompt phrase="Почтовый ящик переполнен. Пожалуйста перезвоните позже" filename="vm-mailbox_full.wav"/>
<!-- That mailbox is full. Please try your call again later. -->
</voicemail>
<conference>
- <prompt phrase="NULL " filename= "conf-ack type.wav"/>
<!-- -->
- <prompt phrase="NULL " filename= "conf-nack type.wav"/>
<!-- -->
- <prompt phrase="Ваш микрофон отключен " filename= "conf-muted.wav"/>
<!-- You are now muted. -->
- <prompt phrase="Ваш микрофон включён " filename= "conf-unmuted.wav"/>
<!-- You are now unmuted. -->
- <prompt phrase="Вы единственный участник конференции" filename= "conf-alone.wav"/>
<!-- You are currently the only person in this conference. -->
- <prompt phrase="NULL " filename= "conf-perpetual type.wav"/>
<!-- -->
- <prompt phrase="NULL " filename= "conf-enter type.wav"/>
<!-- -->
- <prompt phrase="NULL " filename= "conf-exit type.wav"/>
<!-- -->
- <prompt phrase="Вы были отключены от конференции " filename= "conf-kicked.wav"/>
<!-- You have been kicked from this conference. -->
- <prompt phrase="Эта конференция заблокирована " filename= "conf-locked.wav"/>
<!-- This conference is locked. -->
- <prompt phrase="Конференция заблокирована " filename= "conf-is-locked.wav"/>
<!-- The conference is now locked. -->
- <prompt phrase="Конференция разблокирована " filename= "conf-is-unlocked.wav"/>
<!-- The conference is now unlocked. -->
- <prompt phrase="Пожалуйста, введите пин-код конференции " filename= "conf-pin.wav"/>
<!-- Please enter the conference pin number. -->
- <prompt phrase="Неправильный пин-код, попробуйте снова " filename= "conf-bad-pin.wav"/>
<!-- Invalid pin number, try again. -->
- <prompt phrase="До свидания " filename= "conf-goodbye.wav"/>
<!-- goodbye -->
- <prompt phrase="Добро пожаловать в конференцию " filename= "conf-welcome.wav"/>
<!--Welcome to the conference. -->
+ <prompt phrase="NULL" filename="conf-ack type.wav"/>
<!-- -->
+ <prompt phrase="NULL" filename="conf-nack type.wav"/>
<!-- -->
+ <prompt phrase="Ваш микрофон отключен" filename="conf-muted.wav"/>
<!-- You are now muted. -->
+ <prompt phrase="Ваш микрофон включён" filename="conf-unmuted.wav"/>
<!-- You are now unmuted. -->
+ <prompt phrase="Вы единственный участник конференции" filename="conf-alone.wav"/>
<!-- You are currently the only person in this conference. -->
+ <prompt phrase="NULL" filename="conf-perpetual type.wav"/>
<!-- -->
+ <prompt phrase="NULL" filename="conf-enter type.wav"/>
<!-- -->
+ <prompt phrase="NULL" filename="conf-exit type.wav"/>
<!-- -->
+ <prompt phrase="Вы были отключены от конференции" filename="conf-kicked.wav"/>
<!-- You have been kicked from this conference. -->
+ <prompt phrase="Эта конференция заблокирована" filename="conf-locked.wav"/>
<!-- This conference is locked. -->
+ <prompt phrase="Конференция заблокирована" filename="conf-is-locked.wav"/>
<!-- The conference is now locked. -->
+ <prompt phrase="Конференция разблокирована" filename="conf-is-unlocked.wav"/>
<!-- The conference is now unlocked. -->
+ <prompt phrase="Пожалуйста, введите пин-код конференции" filename="conf-pin.wav"/>
<!-- Please enter the conference pin number. -->
+ <prompt phrase="Неправильный пин-код, попробуйте снова" filename="conf-bad-pin.wav"/>
<!-- Invalid pin number, try again. -->
+ <prompt phrase="До свидания" filename="conf-goodbye.wav"/>
<!-- goodbye -->
+ <prompt phrase="Добро пожаловать в конференцию" filename="conf-welcome.wav"/>
<!--Welcome to the conference. -->
</conference>
<ivr>
- <prompt phrase="Номер счета " filename= "ivr-account_number.wav"/>
<!-- Account number -->
- <prompt phrase="Соединение с вызывающим абонентом " filename= "ivr-connect_to_caller.wav"/>
<!--Connect to caller -->
- <prompt phrase="если вам известен добавочный номер вызываемого абонента, пожалуйста введите его сейчас " filename= "ivr-enter_ext_pound.wav"/>
<!-- If you know your party's extension, please enter it now -->
- <prompt phrase="Пожалуйста, введите добавочный номер абонента после знака решётка " filename= "ivr-enter_ext.wav"/>
<!-- Please enter an extension followed by the pound sign-->
- <prompt phrase="Для этого абонента " filename= "ivr-for_this_person.wav"/>
<!-- For this person -->
- <prompt phrase="Пожалуйста, оставайтесь на линии, идет соединение " filename= "ivr-hold_connect_call.wav"/>
<!-- Please hold while I connect your call -->
- <prompt phrase="Извините " filename= "ivr-im_sorry.wav"/>
<!-- I'm sorry -->
- <prompt phrase="Пожалуйста " filename= "ivr-please.wav"/>
<!-- Please -->
- <prompt phrase="Пожалуйста, перезвоните нам в … " filename= "ivr-please_return_our_call_at.wav"/>
<!-- Please return our call at -->
- <prompt phrase="относительно номера ссылки" filename= "ivr-regarding_reference_number.wav"/>
<!-- Regarding reference number -->
- <prompt phrase="Это простое голосовое подменю" filename= "ivr-sample_submenu.wav"/>
<!-- This is a sample IVR submenu... -->
- <prompt phrase="Пожалуйста, представьтесь после сигнала" filename= "ivr-say_name.wav"/>
<!-- Please say your name after the tone -->
- <prompt phrase="Перенаправить на голосовую почту " filename= "ivr-send_to_voicemail.wav"/>
<!-- Send this caller to voicemail -->
- <prompt phrase="Для разговора с представителем по обслуживанию клиентов " filename= "ivr-speak_to_a_customer_service_representative.wav"/>
<!-- To speak to a customer service representative -->
- <prompt phrase="принять сообщение." filename= "ivr-take_a_message.wav"/>
<!-- Take a message -->
- <prompt phrase="Спасибо " filename= "ivr-thank_you.wav"/>
<!-- Thank you -->
- <prompt phrase="Неправильное значение " filename= "ivr-that_was_an_invalid_entry.wav"/>
<!-- That was an invalid entry -->
- <prompt phrase="Этот звонок от " filename= "ivr-this_is_a_call_from.wav"/>
<!-- This is a call from -->
- <prompt phrase="это голосовое меню позволит Вам протестировать некоторые функции" filename= "ivr-this_ivr_will_let_you_test_features.wav"/>
<!-- This IVR will let you test some of the features... -->
- <prompt phrase="Для того чтобы набрать конференцию ФС ___ " filename= "ivr-to_call_the_freeswitch_conference.wav"/>
<!-- To call the FreeSWITCH conference -->
- <prompt phrase="Для выполнения эхо-теста в ФС " filename= "ivr-to_do_a_freeswitch_echo_test.wav"/>
<!-- To do a FreeSWITCH echo test -->
- <prompt phrase="Для выполнения эхо-теста free world dialed " filename= "ivr-to_do_a_fwd_echo_test.wav"/>
<!-- To do a fwd echo test -->
- <prompt phrase="чтобы прослушать пример голосового подменю " filename= "ivr-to_hear_sample_submenu.wav"/>
<!-- To hear a sample IVR submenu -->
- <prompt phrase="Чтобы услышать кричащих обезьян " filename= "ivr-to_hear_screaming_monkeys.wav"/>
<!-- To hear screaming monkeys -->
- <prompt phrase="Для прослушивания списка мелодий в режиме ожидания " filename= "ivr-to_listen_to_moh.wav"/>
<!-- To list to music on hold -->
- <prompt phrase="Для повтора этих параметров " filename= "ivr-to_repeat_these_options.wav"/>
<!-- To repeat these options -->
- <prompt phrase="Для возврата к предыдущему меню " filename= "ivr-to_return_to_previous_menu.wav"/>
<!-- To return to the previous menu -->
- <prompt phrase="Для соединения с оператором " filename= "ivr-to_speak_with_an_operator.wav"/>
<!-- To speak with an operator -->
- <prompt phrase="Добро пожаловать в FreeSwitch, будущее телефонии " filename= "ivr-welcome_to_freeswitch.wav"/>
<!-- Welcome to FreeSWITCH, the future of telephony -->
- <prompt phrase="Вы можете выйти в любое время повесив трубку " filename= "ivr-you_may_exit_by_hanging_up.wav"/>
<!-- You may exit at any time by simply hanging up -->
- <prompt phrase="или " filename= "ivr-or.wav"/>
<!-- or -->
- <prompt phrase="не " filename= "ivr-not.wav"/>
<!-- not -->
- <prompt phrase="Вызов " filename= "ivr-call.wav"/>
<!-- call -->
- <prompt phrase="Вы можете " filename= "ivr-you_may.wav"/>
<!-- You may -->
- <prompt phrase="Здравствуйте " filename= "ivr-hello.wav"/>
<!-- hello -->
- <prompt phrase="Используя клавиатуру телефона… " filename= "ivr-use_telephone_keypad.wav"/>
<!-- Using your telephone keypad... -->
- <prompt phrase="Пожалуйста, назовите имя сотрудника, которому пытаетесь дозвониться " filename= "ivr-spell_name.wav"/>
<!-- please spell the name of the person you are trying to reach. -->
- <prompt phrase="Сначала фамилия " filename= "ivr-last_name_first.wav"/>
<!--Last name firs -->
- <prompt phrase="Сначала имя " filename= "ivr-first_name_first.wav"/>
<!--First name first -->
- <prompt phrase="Нажмите 1 для Q или Z. " filename= "ivr-press_one_q_or_z.wav"/>
<!--Press 1 for Q or Z. -->
- <prompt phrase="Отдел продаж " filename= "ivr-sales.wav"/>
<!-- Sales -->
- <prompt phrase="Центр обслуживания клиентов " filename= "ivr-customer_service.wav"/>
<!-- Customer service -->
- <prompt phrase="Отдел технической поддержки " filename= "ivr-technical_support.wav"/>
<!-- Technical support -->
- <prompt phrase="Оператор " filename= "ivr-operator.wav"/>
<!-- Operator -->
- <prompt phrase="Вы набрали несуществующий добавочный номер" filename= "ivr-you_have_dialed_an_invalid_extension.wav"/>
<!--You have dialed an invalid extension. -->
- <prompt phrase="Пожалйста, наберите добавочный номер и нажмите клавишу решетка" filename= "ivr-please_enter_extension_followed_by_pound.wav"/>
<!--Please enter your extension, followed by the pound sign. -->
- <prompt phrase="Пожалуйста введите ваш пинкод и нажмите клавишу решётка" filename= "ivr-please_enter_pin_followed_by_pound.wav"/>
<!-- Please enter your pin number, followed by the pound sign. -->
- <prompt phrase="Ваш пин код или номер не верны" filename= "ivr-pin_or_extension_is-invalid.wav"/>
<!-- Your pin number or extension is invalid. -->
- <prompt phrase="Вы закрепляете этот телефон за вашей учётной записью" filename= "ivr-you_are_about_to_provision_this_phone.wav"/>
<!-- You are about to provision this phone to your account... -->
- <prompt phrase="Пожалуйста повторите ваш пин код для подтверждения" filename= "ivr-please_reenter_your_pin.wav"/>
<!-- Please re-enter your pin number to confirm. -->
- <prompt phrase="Для регистрации на clueCon , пожалуйста нажмите .." filename= "ivr-register_for_cluecon.wav"/>
<!-- To register for ClueCon, please press... -->
- <prompt phrase="Для входа" filename= "ivr-to_log_in.wav"/>
<!-- to log in -->
- <prompt phrase="Для выхода" filename= "ivr-to_log_out.wav"/>
<!-- to log out -->
- <prompt phrase="Вы вошли" filename= "ivr-you_are_now_logged_in.wav"/>
<!-- You are now logged in -->
- <prompt phrase="Вы вышли" filename= "ivr-you_are_now_logged_out.wav"/>
<!-- You are now logged out -->
- <prompt phrase="Попробуйте снова" filename= "ivr-please_try_again.wav"/>
<!-- Please try again. -->
- <prompt phrase="Вы закрепляете этот телефон за Вашим добавочным номером" filename= "ivr-provision_phone_permanently_to_extension.wav"/>
<!-- You are about to provision this phone permanently to your extension. -->
- <prompt phrase="Пожалуйста введите добавочный номер за которым вы хотите закрепить этот телефон и нажмите решётку" filename= "ivr-extension_to_provision_this_phone.wav"/>
<!-- Please enter the extension number to which you would like to provision this phone,followed by the pound sign. -->
- <prompt phrase="Спасибо, этот телефон сейчас перезагрузится" filename= "ivr-this_phone_will_now_reboot.wav"/>
<!-- Thank you, this phone will now reboot. -->
+ <prompt phrase="Номер счета" filename="ivr-account_number.wav"/>
<!-- Account number -->
+ <prompt phrase="Соединение с вызывающим абонентом" filename="ivr-connect_to_caller.wav"/>
<!--Connect to caller -->
+ <prompt phrase="если вам известен добавочный номер вызываемого абонента, пожалуйста введите его сейчас" filename="ivr-enter_ext_pound.wav"/>
<!-- If you know your party's extension, please enter it now -->
+ <prompt phrase="Пожалуйста, введите добавочный номер абонента завершив нажатием на клавишу решётка" filename="ivr-enter_ext.wav"/>
<!-- Please enter an extension followed by the pound sign-->
+ <prompt phrase="Для этого абонента" filename="ivr-for_this_person.wav"/>
<!-- For this person -->
+ <prompt phrase="Пожалуйста, оставайтесь на линии, идет соединение" filename="ivr-hold_connect_call.wav"/>
<!-- Please hold while I connect your call -->
+ <prompt phrase="Извините" filename="ivr-im_sorry.wav"/>
<!-- I'm sorry -->
+ <prompt phrase="Пожалуйста" filename="ivr-please.wav"/>
<!-- Please -->
+ <prompt phrase="Пожалуйста, перезвоните нам в …" filename="ivr-please_return_our_call_at.wav"/>
<!-- Please return our call at -->
+ <prompt phrase="относительно номера ссылки" filename="ivr-regarding_reference_number.wav"/>
<!-- Regarding reference number -->
+ <prompt phrase="Это пример голосового подменю" filename="ivr-sample_submenu.wav"/>
<!-- This is a sample IVR submenu... -->
+ <prompt phrase="Пожалуйста, представьтесь после сигнала" filename="ivr-say_name.wav"/>
<!-- Please say your name after the tone -->
+ <prompt phrase="Перенаправить на голосовую почту" filename="ivr-send_to_voicemail.wav"/>
<!-- Send this caller to voicemail -->
+ <prompt phrase="Для разговора с представителем по обслуживанию клиентов" filename="ivr-speak_to_a_customer_service_representative.wav"/>
<!-- To speak to a customer service representative -->
+ <prompt phrase="принять сообщение." filename="ivr-take_a_message.wav"/>
<!-- Take a message -->
+ <prompt phrase="Спасибо" filename="ivr-thank_you.wav"/>
<!-- Thank you -->
+ <prompt phrase="Неправильное значение" filename="ivr-that_was_an_invalid_entry.wav"/>
<!-- That was an invalid entry -->
+ <prompt phrase="Этот звонок от" filename="ivr-this_is_a_call_from.wav"/>
<!-- This is a call from -->
+ <prompt phrase="это голосовое меню позволит Вам протестировать некоторые функции" filename="ivr-this_ivr_will_let_you_test_features.wav"/>
<!-- This IVR will let you test some of the features... -->
+ <prompt phrase="Для того чтобы набрать конференцию ФС ___" filename="ivr-to_call_the_freeswitch_conference.wav"/>
<!-- To call the FreeSWITCH conference -->
+ <prompt phrase="Для выполнения эхо-теста в ФС" filename="ivr-to_do_a_freeswitch_echo_test.wav"/>
<!-- To do a FreeSWITCH echo test -->
+ <prompt phrase="Для выполнения эхо-теста free world dialed" filename="ivr-to_do_a_fwd_echo_test.wav"/>
<!-- To do a fwd echo test -->
+ <prompt phrase="чтобы прослушать пример голосового подменю" filename="ivr-to_hear_sample_submenu.wav"/>
<!-- To hear a sample IVR submenu -->
+ <prompt phrase="Чтобы услышать кричащих обезьян" filename="ivr-to_hear_screaming_monkeys.wav"/>
<!-- To hear screaming monkeys -->
+ <prompt phrase="Для прослушивания списка мелодий в режиме ожидания" filename="ivr-to_listen_to_moh.wav"/>
<!-- To list to music on hold -->
+ <prompt phrase="Для повтора этих параметров" filename="ivr-to_repeat_these_options.wav"/>
<!-- To repeat these options -->
+ <prompt phrase="Для возврата к предыдущему меню" filename="ivr-to_return_to_previous_menu.wav"/>
<!-- To return to the previous menu -->
+ <prompt phrase="Для соединения с оператором" filename="ivr-to_speak_with_an_operator.wav"/>
<!-- To speak with an operator -->
+ <prompt phrase="Добро пожаловать в FreeSwitch, будущее телефонии" filename="ivr-welcome_to_freeswitch.wav"/>
<!-- Welcome to FreeSWITCH, the future of telephony -->
+ <prompt phrase="Вы можете выйти в любое время повесив трубку" filename="ivr-you_may_exit_by_hanging_up.wav"/>
<!-- You may exit at any time by simply hanging up -->
+ <prompt phrase="или" filename="ivr-or.wav"/>
<!-- or -->
+ <prompt phrase="не" filename="ivr-not.wav"/>
<!-- not -->
+ <prompt phrase="Вызов" filename="ivr-call.wav"/>
<!-- call -->
+ <prompt phrase="Вы можете" filename="ivr-you_may.wav"/>
<!-- You may -->
+ <prompt phrase="Здравствуйте" filename="ivr-hello.wav"/>
<!-- hello -->
+ <prompt phrase="Используя клавиатуру телефона…" filename="ivr-use_telephone_keypad.wav"/>
<!-- Using your telephone keypad... -->
+ <prompt phrase="Пожалуйста, назовите имя сотрудника, которому пытаетесь дозвониться" filename="ivr-spell_name.wav"/>
<!-- please spell the name of the person you are trying to reach. -->
+ <prompt phrase="Сначала фамилия" filename="ivr-last_name_first.wav"/>
<!--Last name firs -->
+ <prompt phrase="Сначала имя" filename="ivr-first_name_first.wav"/>
<!--First name first -->
+ <prompt phrase="Нажмите 1 для Q или Z." filename="ivr-press_one_q_or_z.wav"/>
<!--Press 1 for Q or Z. -->
+ <prompt phrase="Отдел продаж" filename="ivr-sales.wav"/>
<!-- Sales -->
+ <prompt phrase="Центр обслуживания клиентов" filename="ivr-customer_service.wav"/>
<!-- Customer service -->
+ <prompt phrase="Отдел технической поддержки" filename="ivr-technical_support.wav"/>
<!-- Technical support -->
+ <prompt phrase="Оператор" filename="ivr-operator.wav"/>
<!-- Operator -->
+ <prompt phrase="Вы набрали несуществующий добавочный номер" filename="ivr-you_have_dialed_an_invalid_extension.wav"/>
<!--You have dialed an invalid extension. -->
+ <prompt phrase="Пожалйста, наберите добавочный номер и нажмите клавишу решетка" filename="ivr-please_enter_extension_followed_by_pound.wav"/>
<!--Please enter your extension, followed by the pound sign. -->
+ <prompt phrase="Пожалуйста введите ваш пинкод и нажмите клавишу решётка" filename="ivr-please_enter_pin_followed_by_pound.wav"/>
<!-- Please enter your pin number, followed by the pound sign. -->
+ <prompt phrase="Ваш пин код или номер не верны" filename="ivr-pin_or_extension_is-invalid.wav"/>
<!-- Your pin number or extension is invalid. -->
+ <prompt phrase="Вы закрепляете этот телефон за вашей учётной записью" filename="ivr-you_are_about_to_provision_this_phone.wav"/>
<!-- You are about to provision this phone to your account... -->
+ <prompt phrase="Пожалуйста повторите ваш пин код для подтверждения" filename="ivr-please_reenter_your_pin.wav"/>
<!-- Please re-enter your pin number to confirm. -->
+ <prompt phrase="Для регистрации на clueCon , пожалуйста нажмите .." filename="ivr-register_for_cluecon.wav"/>
<!-- To register for ClueCon, please press... -->
+ <prompt phrase="Для входа" filename="ivr-to_log_in.wav"/>
<!-- to log in -->
+ <prompt phrase="Для выхода" filename="ivr-to_log_out.wav"/>
<!-- to log out -->
+ <prompt phrase="Вы вошли" filename="ivr-you_are_now_logged_in.wav"/>
<!-- You are now logged in -->
+ <prompt phrase="Вы вышли" filename="ivr-you_are_now_logged_out.wav"/>
<!-- You are now logged out -->
+ <prompt phrase="Попробуйте снова" filename="ivr-please_try_again.wav"/>
<!-- Please try again. -->
+ <prompt phrase="Вы закрепляете этот телефон за Вашим добавочным номером" filename="ivr-provision_phone_permanently_to_extension.wav"/>
<!-- You are about to provision this phone permanently to your extension. -->
+ <prompt phrase="Пожалуйста введите добавочный номер за которым вы хотите закрепить этот телефон и нажмите решётку" filename="ivr-extension_to_provision_this_phone.wav"/>
<!-- Please enter the extension number to which you would like to provision this phone,followed by the pound sign. -->
+ <prompt phrase="Спасибо, этот телефон сейчас перезагрузится" filename="ivr-this_phone_will_now_reboot.wav"/>
<!-- Thank you, this phone will now reboot. -->
</ivr>
<misc>
- <prompt phrase="Этот звонок шифруется " filename= "call_secured.wav"/>
<!-- This call has been secured -->
- <prompt phrase="завершаемый нажатием на клавишу решетка " filename= "vm-followed_by.wav"/>
<!-- Followed by pound -->
- <prompt phrase="Если вы этот человек " filename= "if_you_are_this_person.wav"/>
<!-- If you are this person -->
- <prompt phrase="Если вы хотите " filename= "if_you_would_like_to.wav"/>
<!-- If you would like to -->
- <prompt phrase="Предоставьте номер ссылки " filename= "provide_reference_number.wav"/>
<!-- Provide reference number -->
- <prompt phrase="Пожалуйста, введите добавочный номер на который хотите перевести звонок " filename= "transfer1.wav"/>
<!-- Please enter extension you want to transfer to -->
- <prompt phrase="Перевод" filename= "transfer2.wav"/>
<!-- Transfer -->
- <prompt phrase="Мы пытаемся связаться" filename= "we_are_trying_to_reach.wav"/>
<!-- We are trying to reach -->
- <prompt phrase="Произошла ошибка, пожалуйста обратитесь к администратору " filename= "error.wav"/>
<!-- An error has occurred please contact the administrator -->
+ <prompt phrase="Этот звонок шифруется" filename="call_secured.wav"/>
<!-- This call has been secured -->
+ <prompt phrase="завершаемый нажатием на клавишу решетка" filename="vm-followed_by.wav"/>
<!-- Followed by pound -->
+ <prompt phrase="Если вы этот человек" filename="if_you_are_this_person.wav"/>
<!-- If you are this person -->
+ <prompt phrase="Если вы хотите" filename="if_you_would_like_to.wav"/>
<!-- If you would like to -->
+ <prompt phrase="Предоставьте номер ссылки" filename="provide_reference_number.wav"/>
<!-- Provide reference number -->
+ <prompt phrase="Пожалуйста, введите добавочный номер на который хотите перевести звонок" filename="transfer1.wav"/>
<!-- Please enter extension you want to transfer to -->
+ <prompt phrase="Перевод" filename="transfer2.wav"/>
<!-- Transfer -->
+ <prompt phrase="Мы пытаемся связаться" filename="we_are_trying_to_reach.wav"/>
<!-- We are trying to reach -->
+ <prompt phrase="Произошла ошибка, пожалуйста обратитесь к администратору" filename="error.wav"/>
<!-- An error has occurred please contact the administrator -->
</misc>
</ru>
</language>
1
0
[commit] r13073 - freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory
by FreeSWITCH SVN 17 Apr '09
by FreeSWITCH SVN 17 Apr '09
17 Apr '09
Author: nmartin
Date: Thu Apr 16 23:50:32 2009
New Revision: 13073
Log:
cleaned up licensing and attribution to original author
Modified:
freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README
freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/dial_by_name_directory.js
Modified: freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README
==============================================================================
--- freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README (original)
+++ freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/README Thu Apr 16 23:50:32 2009
@@ -28,8 +28,8 @@
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
-The original author of this work, Nik Martin, must be credited
-as the original author of this work.
+The original authors of this work, John Wehle, then Nik Martin, must be credited
+as the original authors of this work.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
Modified: freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/dial_by_name_directory.js
==============================================================================
--- freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/dial_by_name_directory.js (original)
+++ freeswitch/trunk/scripts/contrib/nmartin/dial_by_name_directory/dial_by_name_directory.js Thu Apr 16 23:50:32 2009
@@ -11,6 +11,7 @@
If the prior author's claimed copyright is infringed by the one I claim we'll
work it out, BUT I prefer a much looser MIT license:
==============================================================
+
Copyright (c) 2009 Nik Martin
Permission is hereby granted, free of charge, to any person
@@ -25,8 +26,8 @@
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
-The original author of this work, Nik Martin, must be credited
-as the original author of this work.
+The original authors of this work, John Wehle, then Nik Martin, must be credited
+as the original authors of this work.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
@@ -203,7 +204,13 @@
session.streamFile (recorded_name);
break;
}
+//TODO: say <module_name> <say_type> <say_method> <text> << spell out the name if they have not recorded one yet
+
}
+
+
session.execute ("phrase", "spell," + choice);
+//TODO: prompt to see if they REALLY want this person, then go back up if not.
+
session.execute ("transfer", choice + " XML features");
exit();
\ No newline at end of file
1
0