00001 /* 00002 * Asterisk -- An open source telephony toolkit. 00003 * 00004 * Copyright (C) 1999 - 2005, Digium, Inc. 00005 * 00006 * Mark Spencer <markster@digium.com> 00007 * 00008 * See http://www.asterisk.org for more information about 00009 * the Asterisk project. Please do not directly contact 00010 * any of the maintainers of this project for assistance; 00011 * the project provides a web site, mailing lists and IRC 00012 * channels for your use. 00013 * 00014 * This program is free software, distributed under the terms of 00015 * the GNU General Public License Version 2. See the LICENSE file 00016 * at the top of the source tree. 00017 */ 00018 00019 /*! \file 00020 * 00021 * \brief Echo application -- play back what you hear to evaluate latency 00022 * 00023 * \author Mark Spencer <markster@digium.com> 00024 * 00025 * \ingroup applications 00026 */ 00027 00028 /*** MODULEINFO 00029 <support_level>core</support_level> 00030 ***/ 00031 00032 #include "asterisk.h" 00033 00034 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 360033 $") 00035 00036 #include "asterisk/file.h" 00037 #include "asterisk/module.h" 00038 #include "asterisk/channel.h" 00039 00040 /*** DOCUMENTATION 00041 <application name="Echo" language="en_US"> 00042 <synopsis> 00043 Echo media, DTMF back to the calling party 00044 </synopsis> 00045 <syntax /> 00046 <description> 00047 <para>Echos back any media or DTMF frames read from the calling 00048 channel back to itself. This will not echo CONTROL, MODEM, or NULL 00049 frames. Note: If '#' detected application exits.</para> 00050 <para>This application does not automatically answer and should be 00051 preceeded by an application such as Answer() or Progress().</para> 00052 </description> 00053 </application> 00054 ***/ 00055 00056 static const char app[] = "Echo"; 00057 00058 static int echo_exec(struct ast_channel *chan, const char *data) 00059 { 00060 int res = -1; 00061 format_t format; 00062 00063 format = ast_best_codec(chan->nativeformats); 00064 ast_set_write_format(chan, format); 00065 ast_set_read_format(chan, format); 00066 00067 while (ast_waitfor(chan, -1) > -1) { 00068 struct ast_frame *f = ast_read(chan); 00069 if (!f) { 00070 break; 00071 } 00072 f->delivery.tv_sec = 0; 00073 f->delivery.tv_usec = 0; 00074 if (f->frametype != AST_FRAME_CONTROL 00075 && f->frametype != AST_FRAME_MODEM 00076 && f->frametype != AST_FRAME_NULL 00077 && ast_write(chan, f)) { 00078 ast_frfree(f); 00079 goto end; 00080 } 00081 if ((f->frametype == AST_FRAME_DTMF) && (f->subclass.integer == '#')) { 00082 res = 0; 00083 ast_frfree(f); 00084 goto end; 00085 } 00086 ast_frfree(f); 00087 } 00088 end: 00089 return res; 00090 } 00091 00092 static int unload_module(void) 00093 { 00094 return ast_unregister_application(app); 00095 } 00096 00097 static int load_module(void) 00098 { 00099 return ast_register_application_xml(app, echo_exec); 00100 } 00101 00102 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Simple Echo Application");