update to spandsp snapshot 20090714

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14316 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Michael Jerris 2009-07-22 15:18:32 +00:00
parent 10143a3403
commit 1c1a9a6be9
42 changed files with 451 additions and 382 deletions

View File

@ -16,7 +16,7 @@
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# $Id: configure.ac,v 1.70 2009/06/02 11:51:57 steveu Exp $
# $Id: configure.ac,v 1.71 2009/07/12 09:29:18 steveu Exp $
# @start 1
@ -124,7 +124,7 @@ AC_ARG_ENABLE(mmx, [ --enable-mmx Enable MMX support])
AC_ARG_ENABLE(sse, [ --enable-sse Enable SSE support])
AC_ARG_ENABLE(sse2, [ --enable-sse2 Enable SSE2 support])
AC_ARG_ENABLE(sse3, [ --enable-sse3 Enable SSE3 support])
AC_ARG_ENABLE(sse3, [ --enable-sse3 Enable SSE3 support])
AC_ARG_ENABLE(ssse3, [ --enable-ssse3 Enable SSSE3 support])
AC_ARG_ENABLE(sse4_1, [ --enable-sse4-1 Enable SSE4.1 support])
AC_ARG_ENABLE(sse4_2, [ --enable-sse4-2 Enable SSE4.2 support])
AC_ARG_ENABLE(sse4a, [ --enable-sse4a Enable SSE4A support])
@ -305,6 +305,9 @@ gnu)
if test "$enable_sse4_1" = "yes" ; then
COMP_VENDOR_CFLAGS="-msse41 $COMP_VENDOR_CFLAGS"
fi
if test "$enable_ssse3" = "yes" ; then
COMP_VENDOR_CFLAGS="-mssse3 $COMP_VENDOR_CFLAGS"
fi
if test "$enable_sse3" = "yes" ; then
COMP_VENDOR_CFLAGS="-msse3 $COMP_VENDOR_CFLAGS"
fi
@ -357,6 +360,7 @@ AM_CONDITIONAL([COND_MMX], [test "$enable_mmx" = yes])
AM_CONDITIONAL([COND_SSE], [test "$enable_sse" = yes])
AM_CONDITIONAL([COND_SSE2], [test "$enable_sse2" = yes])
AM_CONDITIONAL([COND_SSE3], [test "$enable_sse3" = yes])
AM_CONDITIONAL([COND_SSSE3], [test "$enable_ssse3" = yes])
AM_CONDITIONAL([COND_SSE4_1], [test "$enable_sse4_1" = yes])
AM_CONDITIONAL([COND_SSE4_2], [test "$enable_sse4_2" = yes])
AM_CONDITIONAL([COND_SSE4A], [test "$enable_sse4a" = yes])
@ -389,6 +393,10 @@ if test "$enable_sse4_2" = "yes" ; then
fi
if test "$enable_sse4_1" = "yes" ; then
AC_DEFINE([SPANDSP_USE_SSE4_1], [1], [Use the SSE4.1 instruction set (i386 and x86_64 only).])
enable_ssse3="yes"
fi
if test "$enable_ssse3" = "yes" ; then
AC_DEFINE([SPANDSP_USE_SSSE3], [1], [Use the SSSE3 instruction set (i386 and x86_64 only).])
enable_sse3="yes"
fi
if test "$enable_sse3" = "yes" ; then

View File

@ -16,7 +16,7 @@
## License along with this program; if not, write to the Free Software
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
##
## $Id: Makefile.am,v 1.134 2009/06/02 11:51:57 steveu Exp $
## $Id: Makefile.am,v 1.135 2009/07/12 09:23:09 steveu Exp $
AM_CFLAGS = $(COMP_VENDOR_CFLAGS)
AM_LDFLAGS = $(COMP_VENDOR_LDFLAGS)
@ -275,6 +275,7 @@ noinst_HEADERS = faxfont.h \
filter_tools.h \
gsm0610_local.h \
lpc10_encdecs.h \
mmx_sse_decs.h \
t30_local.h \
t4_states.h \
v17_v32bis_rx_constellation_maps.h \

View File

@ -25,7 +25,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: at_interpreter.c,v 1.39 2009/04/24 22:35:25 steveu Exp $
* $Id: at_interpreter.c,v 1.40 2009/07/10 13:15:56 steveu Exp $
*/
/*! \file */
@ -76,7 +76,7 @@ enum
static at_profile_t profiles[3] =
{
{
#if defined(_MSC_VER)
#if defined(_MSC_VER) || defined(__sunos) || defined(__solaris)
/*.echo =*/ TRUE,
/*.verbose =*/ TRUE,
/*.result_code_format =*/ ASCII_RESULT_CODES,

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: complex_vector_float.c,v 1.15 2009/02/03 16:28:39 steveu Exp $
* $Id: complex_vector_float.c,v 1.16 2009/07/12 09:23:09 steveu Exp $
*/
/*! \file */
@ -41,33 +41,10 @@
#if defined(HAVE_MATH_H)
#include <math.h>
#endif
#include "floating_fudge.h"
#include <assert.h>
#if defined(SPANDSP_USE_MMX)
#include <mmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE)
#include <xmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE2)
#include <emmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE3)
#include <pmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_1)
#include <smmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_2)
#include <nmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4A)
#include <ammintrin.h>
#endif
#if defined(SPANDSP_USE_SSE5)
#include <bmmintrin.h>
#endif
#include "floating_fudge.h"
#include "mmx_sse_decs.h"
#include "spandsp/telephony.h"
#include "spandsp/logging.h"

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: complex_vector_int.c,v 1.8 2009/02/21 04:27:46 steveu Exp $
* $Id: complex_vector_int.c,v 1.9 2009/07/12 09:23:09 steveu Exp $
*/
/*! \file */
@ -41,33 +41,10 @@
#if defined(HAVE_MATH_H)
#include <math.h>
#endif
#include "floating_fudge.h"
#include <assert.h>
#if defined(SPANDSP_USE_MMX)
#include <mmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE)
#include <xmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE2)
#include <emmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE3)
#include <pmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_1)
#include <smmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_2)
#include <nmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4A)
#include <ammintrin.h>
#endif
#if defined(SPANDSP_USE_SSE5)
#include <bmmintrin.h>
#endif
#include "floating_fudge.h"
#include "mmx_sse_decs.h"
#include "spandsp/telephony.h"
#include "spandsp/logging.h"

View File

@ -23,7 +23,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: make_modem_filter.c,v 1.15 2009/06/02 11:51:57 steveu Exp $
* $Id: make_modem_filter.c,v 1.16 2009/07/10 13:15:56 steveu Exp $
*/
#if defined(HAVE_CONFIG_H)
@ -44,6 +44,9 @@
#include <stdio.h>
#include <time.h>
#include <fcntl.h>
#if defined(__sunos) || defined(__solaris)
#include <getopt.h>
#endif
#include "spandsp/telephony.h"
#include "spandsp/complex.h"

View File

@ -0,0 +1,61 @@
/*
* SpanDSP - a series of DSP components for telephony
*
* mmx_sse_decs.h - Pull in the appropriate systems headers for the MMX/SSE settings.
*
* Written by Steve Underwood <steveu@coppice.org>
*
* Copyright (C) 2009 Steve Underwood
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 2.1,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: mmx_sse_decs.h,v 1.1 2009/07/12 09:23:09 steveu Exp $
*/
#if !defined(_MMX_SSE_DECS_H_)
#define _MMX_SSE_DECS_H_
#if defined(SPANDSP_USE_MMX)
#include <mmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE)
#include <xmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE2)
#include <emmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE3)
#include <pmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSSE3)
#include <tmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_1)
#include <smmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_2)
#include <nmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4A)
#include <ammintrin.h>
#endif
#if defined(SPANDSP_USE_SSE5)
#include <bmmintrin.h>
#endif
#endif
/*- End of include ---------------------------------------------------------*/

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: bit_operations.h,v 1.26 2009/02/26 16:08:50 steveu Exp $
* $Id: bit_operations.h,v 1.27 2009/07/10 13:15:56 steveu Exp $
*/
/*! \file */
@ -30,6 +30,12 @@
#if !defined(_SPANDSP_BIT_OPERATIONS_H_)
#define _SPANDSP_BIT_OPERATIONS_H_
#if defined(__i386__) || defined(__x86_64__)
#if !defined(__SUNPRO_C) || (__SUNPRO_C >= 0x0590)
#define SPANDSP_USE_86_ASM
#endif
#endif
#if defined(__cplusplus)
extern "C"
{
@ -40,7 +46,7 @@ extern "C"
\return The bit number of the highest set bit, or -1 if the word is zero. */
static __inline__ int top_bit(unsigned int bits)
{
#if defined(__i386__) || defined(__x86_64__)
#if defined(SPANDSP_USE_86_ASM)
int res;
__asm__ (" xorl %[res],%[res];\n"
@ -141,7 +147,7 @@ static __inline__ int bottom_bit(unsigned int bits)
{
int res;
#if defined(__i386__) || defined(__x86_64__)
#if defined(SPANDSP_USE_86_ASM)
__asm__ (" xorl %[res],%[res];\n"
" decl %[res];\n"
" bsfl %[bits],%[res]\n"

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: fast_convert.h,v 1.7 2009/04/18 03:18:41 steveu Exp $
* $Id: fast_convert.h,v 1.8 2009/07/10 13:15:56 steveu Exp $
*/
#if !defined(_SPANDSP_FAST_CONVERT_H_)
@ -403,7 +403,7 @@ extern "C"
the accuracy issues related to changing the rounding scheme are of little concern
to us. */
#if !defined(__sgi)
#if !defined(__sgi) && !defined(__sunos) && !defined(__solaris)
#warning "No usable lrint() and lrintf() functions available."
#warning "Replacing these functions with a simple C cast."
#endif

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: t38_core.h,v 1.3 2009/04/12 14:18:02 steveu Exp $
* $Id: t38_core.h,v 1.4 2009/07/14 13:54:22 steveu Exp $
*/
#if !defined(_SPANDSP_PRIVATE_T38_CORE_H_)
@ -97,19 +97,11 @@ struct t38_core_state_s
/*! \brief The fastest data rate supported by the T.38 channel. */
int fastest_image_data_rate;
/*! \brief The number of times an indicator packet will be sent. Numbers greater than one
will increase reliability for UDP transmission. Zero is valid, to suppress all
indicator packets for TCP transmission. */
int indicator_tx_count;
/*! \brief The number of times a data packet which does not end transmission will be sent.
Numbers greater than one will increase reliability for UDP transmission. Zero
is not valid. */
int data_tx_count;
/*! \brief The number of times a data packet which ends transmission will be sent. Numbers
greater than one will increase reliability for UDP transmission. Zero is not valid. */
int data_end_tx_count;
/*! \brief The number of times each packet type will be sent (low byte). The
depth of redundancy (2nd byte). Higher numbers may increase reliability
for UDP transmission. Zero is valid for the indicator packet category,
to suppress all indicator packets (typicaly for TCP transmission). */
int category_control[5];
/*! \brief TRUE if IFP packet sequence numbers are relevant. For some transports, like TPKT
over TCP they are not relevent. */

View File

@ -22,12 +22,31 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v17rx.h,v 1.1 2008/10/13 13:14:01 steveu Exp $
* $Id: v17rx.h,v 1.2 2009/07/09 13:52:09 steveu Exp $
*/
#if !defined(_SPANDSP_PRIVATE_V17RX_H_)
#define _SPANDSP_PRIVATE_V17RX_H_
/* Target length for the equalizer is about 63 taps, to deal with the worst stuff
in V.56bis. */
/*! Samples before the target position in the equalizer buffer */
#define V17_EQUALIZER_PRE_LEN 8
/*! Samples after the target position in the equalizer buffer */
#define V17_EQUALIZER_POST_LEN 8
/*! The number of taps in the pulse shaping/bandpass filter */
#define V17_RX_FILTER_STEPS 27
/* We can store more trellis depth that we look back over, so that we can push out a group
of symbols in one go, giving greater processing efficiency, at the expense of a bit more
latency through the modem. */
/* Right now we don't take advantage of this optimisation. */
/*! The depth of the trellis buffer */
#define V17_TRELLIS_STORAGE_DEPTH 16
/*! How far we look back into history for trellis decisions */
#define V17_TRELLIS_LOOKBACK_DEPTH 16
/*!
V.17 modem receive side descriptor. This defines the working state for a
single instance of a V.17 modem receiver.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v17tx.h,v 1.1 2008/10/13 13:14:01 steveu Exp $
* $Id: v17tx.h,v 1.2 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -30,6 +30,9 @@
#if !defined(_SPANDSP_PRIVATE_V17TX_H_)
#define _SPANDSP_PRIVATE_V17TX_H_
/*! The number of taps in the pulse shaping/bandpass filter */
#define V17_TX_FILTER_STEPS 9
/*!
V.17 modem transmit side descriptor. This defines the working state for a
single instance of a V.17 modem transmitter.

View File

@ -22,12 +22,23 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v22bis.h,v 1.10 2009/04/29 12:37:45 steveu Exp $
* $Id: v22bis.h,v 1.11 2009/07/09 13:52:09 steveu Exp $
*/
#if !defined(_SPANDSP_PRIVATE_V22BIS_H_)
#define _SPANDSP_PRIVATE_V22BIS_H_
/*! The number of steps to the left and to the right of the target position in the equalizer buffer. */
#define V22BIS_EQUALIZER_LEN 7
/*! One less than a power of 2 >= (2*V22BIS_EQUALIZER_LEN + 1) */
#define V22BIS_EQUALIZER_MASK 15
/*! The number of taps in the transmit pulse shaping filter */
#define V22BIS_TX_FILTER_STEPS 9
/*! The number of taps in the receive pulse shaping/bandpass filter */
#define V22BIS_RX_FILTER_STEPS 37
/*! Segments of the training sequence on the receive side */
enum
{

View File

@ -22,12 +22,30 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v27ter_rx.h,v 1.1 2008/10/13 13:14:01 steveu Exp $
* $Id: v27ter_rx.h,v 1.2 2009/07/09 13:52:09 steveu Exp $
*/
#if !defined(_SPANDSP_PRIVATE_V27TER_RX_H_)
#define _SPANDSP_PRIVATE_V27TER_RX_H_
/* Target length for the equalizer is about 43 taps for 4800bps and 32 taps for 2400bps
to deal with the worst stuff in V.56bis. */
/*! Samples before the target position in the equalizer buffer */
#define V27TER_EQUALIZER_PRE_LEN 16 /* This much before the real event */
/*! Samples after the target position in the equalizer buffer */
#define V27TER_EQUALIZER_POST_LEN 14 /* This much after the real event (must be even) */
/*! The number of taps in the 4800bps pulse shaping/bandpass filter */
#define V27TER_RX_4800_FILTER_STEPS 27
/*! The number of taps in the 2400bps pulse shaping/bandpass filter */
#define V27TER_RX_2400_FILTER_STEPS 27
#if V27TER_RX_4800_FILTER_STEPS > V27TER_RX_2400_FILTER_STEPS
#define V27TER_RX_FILTER_STEPS V27TER_RX_4800_FILTER_STEPS
#else
#define V27TER_RX_FILTER_STEPS V27TER_RX_2400_FILTER_STEPS
#endif
/*!
V.27ter modem receive side descriptor. This defines the working state for a
single instance of a V.27ter modem receiver.

View File

@ -22,12 +22,15 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v27ter_tx.h,v 1.2 2008/12/06 14:35:04 steveu Exp $
* $Id: v27ter_tx.h,v 1.3 2009/07/09 13:52:09 steveu Exp $
*/
#if !defined(_SPANDSP_PRIVATE_V27TER_TX_H_)
#define _SPANDSP_PRIVATE_V27TER_TX_H_
/*! The number of taps in the pulse shaping/bandpass filter */
#define V27TER_TX_FILTER_STEPS 9
/*!
V.27ter modem transmit side descriptor. This defines the working state for a
single instance of a V.27ter modem transmitter.

View File

@ -22,12 +22,22 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v29rx.h,v 1.1 2008/10/13 13:14:01 steveu Exp $
* $Id: v29rx.h,v 1.2 2009/07/09 13:52:09 steveu Exp $
*/
#if !defined(_SPANDSP_PRIVATE_V29RX_H_)
#define _SPANDSP_PRIVATE_V29RX_H_
/* Target length for the equalizer is about 63 taps, to deal with the worst stuff
in V.56bis. */
/*! Samples before the target position in the equalizer buffer */
#define V29_EQUALIZER_PRE_LEN 16
/*! Samples after the target position in the equalizer buffer */
#define V29_EQUALIZER_POST_LEN 14
/*! The number of taps in the pulse shaping/bandpass filter */
#define V29_RX_FILTER_STEPS 27
/*!
V.29 modem receive side descriptor. This defines the working state for a
single instance of a V.29 modem receiver.

View File

@ -22,12 +22,15 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v29tx.h,v 1.1 2008/10/13 13:14:01 steveu Exp $
* $Id: v29tx.h,v 1.2 2009/07/09 13:52:09 steveu Exp $
*/
#if !defined(_SPANDSP_PRIVATE_V29TX_H_)
#define _SPANDSP_PRIVATE_V29TX_H_
/*! The number of taps in the pulse shaping/bandpass filter */
#define V29_TX_FILTER_STEPS 9
/*!
V.29 modem transmit side descriptor. This defines the working state for a
single instance of a V.29 modem transmitter.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: t38_core.h,v 1.38 2009/04/12 14:18:02 steveu Exp $
* $Id: t38_core.h,v 1.39 2009/07/14 13:54:22 steveu Exp $
*/
/*! \file */
@ -167,6 +167,22 @@ enum t38_data_rate_management_types_e
T38_DATA_RATE_MANAGEMENT_TRANSFERRED_TCF = 2
};
/*! T.38 Packet categories used for setting the redundancy level and packet repeat
counts on a packet by packet basis. */
enum t38_packet_categories_e
{
/*! \brief Indicator packet */
T38_PACKET_CATEGORY_INDICATOR = 0,
/*! \brief Control data packet */
T38_PACKET_CATEGORY_CONTROL_DATA = 1,
/*! \brief Terminating control data packet */
T38_PACKET_CATEGORY_CONTROL_DATA_END = 2,
/*! \brief Image data packet */
T38_PACKET_CATEGORY_IMAGE_DATA = 3,
/*! \brief Terminating image data packet */
T38_PACKET_CATEGORY_IMAGE_DATA_END = 4
};
#define T38_RX_BUF_LEN 2048
#define T38_TX_BUF_LEN 16384
@ -232,9 +248,8 @@ SPAN_DECLARE(int) t38_v34rate_to_bps(const uint8_t *data, int len);
/*! \brief Send an indicator packet
\param s The T.38 context.
\param indicator The indicator to send.
\param count The number of copies of the packet to send.
\return The delay to allow after this indicator is sent. */
SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator, int count);
SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator);
/*! \brief Find the delay to allow for HDLC flags after sending an indicator
\param s The T.38 context.
@ -248,18 +263,18 @@ SPAN_DECLARE(int) t38_core_send_flags_delay(t38_core_state_t *s, int indicator);
\param field_type The packet's field type.
\param field The message data content for the packet.
\param field_len The length of the message data, in bytes.
\param count The number of copies of the packet to send.
\param category The category of the packet being sent. This should be one of the values defined for t38_packet_categories_e.
\return ??? */
SPAN_DECLARE(int) t38_core_send_data(t38_core_state_t *s, int data_type, int field_type, const uint8_t field[], int field_len, int count);
SPAN_DECLARE(int) t38_core_send_data(t38_core_state_t *s, int data_type, int field_type, const uint8_t field[], int field_len, int category);
/*! \brief Send a data packet
\param s The T.38 context.
\param data_type The packet's data type.
\param field The list of fields.
\param fields The number of fields in the list.
\param count The number of copies of the packet to send.
\param category The category of the packet being sent. This should be one of the values defined for t38_packet_categories_e.
\return ??? */
SPAN_DECLARE(int) t38_core_send_data_multi_field(t38_core_state_t *s, int data_type, const t38_data_field_t field[], int fields, int count);
SPAN_DECLARE(int) t38_core_send_data_multi_field(t38_core_state_t *s, int data_type, const t38_data_field_t field[], int fields, int category);
/*! \brief Process a received T.38 IFP packet.
\param s The T.38 context.
@ -299,10 +314,29 @@ SPAN_DECLARE(void) t38_set_mmr_transcoding(t38_core_state_t *s, int mmr_transcod
*/
SPAN_DECLARE(void) t38_set_jbig_transcoding(t38_core_state_t *s, int jbig_transcoding);
/*! Set the maximum buffer size for received data at the far end.
\param s The T.38 context.
\param max_buffer_size The maximum buffer size.
*/
SPAN_DECLARE(void) t38_set_max_buffer_size(t38_core_state_t *s, int max_buffer_size);
/*! Set the maximum size of an IFP packet that is acceptable by the far end.
\param s The T.38 context.
\param max_datagram_size The maximum IFP packet length, in bytes.
*/
SPAN_DECLARE(void) t38_set_max_datagram_size(t38_core_state_t *s, int max_datagram_size);
/*! \brief Send a data packet
\param s The T.38 context.
\param category The category of the packet being sent. This should be one of the values defined for t38_packet_categories_e.
\param setting The repeat count for the category. This should be at least one for all categories other an indicator packets.
Zero is valid for indicator packets, as it suppresses the sending of indicator packets, as an application using
TCP for the transport would require. As the setting is passed through to the transmission channel, additional
information may be encoded in it, such as the redundancy depth for the particular packet category. */
SPAN_DECLARE(void) t38_set_redundancy_control(t38_core_state_t *s, int category, int setting);
SPAN_DECLARE(void) t38_set_fastest_image_data_rate(t38_core_state_t *s, int max_rate);
SPAN_DECLARE(int) t38_get_fastest_image_data_rate(t38_core_state_t *s);
/*! Set the T.38 version to be emulated.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v17rx.h,v 1.64 2009/06/02 16:03:56 steveu Exp $
* $Id: v17rx.h,v 1.65 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -211,25 +211,6 @@ working only on the most optimal lines, and being widely usable across most phon
TCM absolutely transformed the phone line modem business.
*/
/* Target length for the equalizer is about 63 taps, to deal with the worst stuff
in V.56bis. */
/*! Samples before the target position in the equalizer buffer */
#define V17_EQUALIZER_PRE_LEN 8
/*! Samples after the target position in the equalizer buffer */
#define V17_EQUALIZER_POST_LEN 8
/*! The number of taps in the pulse shaping/bandpass filter */
#define V17_RX_FILTER_STEPS 27
/* We can store more trellis depth that we look back over, so that we can push out a group
of symbols in one go, giving greater processing efficiency, at the expense of a bit more
latency through the modem. */
/* Right now we don't take advantage of this optimisation. */
/*! The depth of the trellis buffer */
#define V17_TRELLIS_STORAGE_DEPTH 16
/*! How far we look back into history for trellis decisions */
#define V17_TRELLIS_LOOKBACK_DEPTH 16
/*!
V.17 modem receive side descriptor. This defines the working state for a
single instance of a V.17 modem receiver.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v17tx.h,v 1.42 2009/06/02 16:03:56 steveu Exp $
* $Id: v17tx.h,v 1.43 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -81,9 +81,6 @@ suits the receiver better, so the same signal generator is also used for the
transmitter.
*/
/*! The number of taps in the pulse shaping/bandpass filter */
#define V17_TX_FILTER_STEPS 9
/*!
V.17 modem transmit side descriptor. This defines the working state for a
single instance of a V.17 modem transmitter.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v22bis.h,v 1.43 2009/06/02 16:03:56 steveu Exp $
* $Id: v22bis.h,v 1.45 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -57,17 +57,6 @@ enum
V22BIS_GUARD_TONE_1800HZ
};
/*! The number of steps to the left and to the right of the target position in the equalizer buffer. */
#define V22BIS_EQUALIZER_LEN 7
/*! One less than a power of 2 >= (2*V22BIS_EQUALIZER_LEN + 1) */
#define V22BIS_EQUALIZER_MASK 15
/*! The number of taps in the transmit pulse shaping filter */
#define V22BIS_TX_FILTER_STEPS 9
/*! The number of taps in the receive pulse shaping/bandpass filter */
#define V22BIS_RX_FILTER_STEPS 37
/*!
V.22bis modem descriptor. This defines the working state for a single instance
of a V.22bis modem.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v27ter_rx.h,v 1.60 2009/06/02 16:03:56 steveu Exp $
* $Id: v27ter_rx.h,v 1.61 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -46,24 +46,6 @@ at the start of transmission, which makes the design of a V.27ter receiver relat
straightforward.
*/
/* Target length for the equalizer is about 43 taps for 4800bps and 32 taps for 2400bps
to deal with the worst stuff in V.56bis. */
/*! Samples before the target position in the equalizer buffer */
#define V27TER_EQUALIZER_PRE_LEN 16 /* This much before the real event */
/*! Samples after the target position in the equalizer buffer */
#define V27TER_EQUALIZER_POST_LEN 14 /* This much after the real event (must be even) */
/*! The number of taps in the 4800bps pulse shaping/bandpass filter */
#define V27TER_RX_4800_FILTER_STEPS 27
/*! The number of taps in the 2400bps pulse shaping/bandpass filter */
#define V27TER_RX_2400_FILTER_STEPS 27
#if V27TER_RX_4800_FILTER_STEPS > V27TER_RX_2400_FILTER_STEPS
#define V27TER_RX_FILTER_STEPS V27TER_RX_4800_FILTER_STEPS
#else
#define V27TER_RX_FILTER_STEPS V27TER_RX_2400_FILTER_STEPS
#endif
/*!
V.27ter modem receive side descriptor. This defines the working state for a
single instance of a V.27ter modem receiver.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v27ter_tx.h,v 1.42 2009/06/02 16:03:56 steveu Exp $
* $Id: v27ter_tx.h,v 1.43 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -64,9 +64,6 @@ suits the receiver better, so then same signal generator is also used for the
transmitter.
*/
/*! The number of taps in the pulse shaping/bandpass filter */
#define V27TER_TX_FILTER_STEPS 9
/*!
V.27ter modem transmit side descriptor. This defines the working state for a
single instance of a V.27ter modem transmitter.

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v29rx.h,v 1.71 2009/06/02 16:03:56 steveu Exp $
* $Id: v29rx.h,v 1.72 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -120,16 +120,6 @@ scrambler register) cannot be trusted for the test. The receive modem,
therefore, only tests that bits starting at bit 24 are really ones.
*/
/* Target length for the equalizer is about 63 taps, to deal with the worst stuff
in V.56bis. */
/*! Samples before the target position in the equalizer buffer */
#define V29_EQUALIZER_PRE_LEN 16
/*! Samples after the target position in the equalizer buffer */
#define V29_EQUALIZER_POST_LEN 14
/*! The number of taps in the pulse shaping/bandpass filter */
#define V29_RX_FILTER_STEPS 27
typedef void (*qam_report_handler_t)(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol);
/*!

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v29tx.h,v 1.40 2009/06/02 16:03:56 steveu Exp $
* $Id: v29tx.h,v 1.41 2009/07/09 13:52:09 steveu Exp $
*/
/*! \file */
@ -94,9 +94,6 @@ gives
*/
/*! The number of taps in the pulse shaping/bandpass filter */
#define V29_TX_FILTER_STEPS 9
/*!
V.29 modem transmit side descriptor. This defines the working state for a
single instance of a V.29 modem transmitter.

View File

@ -30,9 +30,9 @@
/* The date and time of the version are in UTC form. */
#define SPANDSP_RELEASE_DATE 20090602
#define SPANDSP_RELEASE_TIME 160509
#define SPANDSP_RELEASE_DATETIME_STRING "20090602 160509"
#define SPANDSP_RELEASE_DATE 20090714
#define SPANDSP_RELEASE_TIME 135534
#define SPANDSP_RELEASE_DATETIME_STRING "20090714 135534"
#endif
/*- End of file ------------------------------------------------------------*/

View File

@ -25,7 +25,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: t31.c,v 1.150 2009/04/12 09:12:10 steveu Exp $
* $Id: t31.c,v 1.151 2009/07/14 13:54:22 steveu Exp $
*/
/*! \file */
@ -696,13 +696,13 @@ static int stream_non_ecm(t31_state_t *s)
case T38_TIMED_STEP_NON_ECM_MODEM:
/* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2;
fe->next_tx_samples = fe->samples;
break;
case T38_TIMED_STEP_NON_ECM_MODEM_2:
/* Switch on a fast modem, and give the training time to complete */
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator);
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
break;
case T38_TIMED_STEP_NON_ECM_MODEM_3:
@ -734,12 +734,12 @@ static int stream_non_ecm(t31_state_t *s)
else
{
/* If we are sending quickly there seems no point in doing any padding */
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, fe->t38.data_end_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
delay = 0;
}
}
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, fe->t38.data_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
delay = bits_to_us(s, 8*len);
break;
case T38_TIMED_STEP_NON_ECM_MODEM_4:
@ -750,7 +750,7 @@ static int stream_non_ecm(t31_state_t *s)
{
len += fe->non_ecm_trailer_bytes;
memset(buf, 0, len);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, fe->t38.data_end_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
/* Allow a bit more time than the data will take to play out, to ensure the far ATA does not
cut things short. */
@ -761,13 +761,13 @@ static int stream_non_ecm(t31_state_t *s)
break;
}
memset(buf, 0, len);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, fe->t38.data_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
delay = bits_to_us(s, 8*len);
break;
case T38_TIMED_STEP_NON_ECM_MODEM_5:
/* This should not be needed, since the message above indicates the end of the signal, but it
seems like it can improve compatibility with quirky implementations. */
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
fe->timed_step = T38_TIMED_STEP_NONE;
return delay;
}
@ -784,6 +784,7 @@ static int stream_hdlc(t31_state_t *s)
int previous;
int delay;
int i;
int category;
fe = &s->t38_fe;
for (delay = 0; delay == 0; )
@ -793,13 +794,13 @@ static int stream_hdlc(t31_state_t *s)
case T38_TIMED_STEP_HDLC_MODEM:
/* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2;
fe->next_tx_samples = fe->samples + ms_to_samples(75);
break;
case T38_TIMED_STEP_HDLC_MODEM_2:
/* Send HDLC preambling */
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator);
delay += t38_core_send_flags_delay(&fe->t38, fe->next_tx_indicator);
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
@ -834,7 +835,8 @@ static int stream_hdlc(t31_state_t *s)
data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK_SIG_END;
data_fields[1].field = NULL;
data_fields[1].field_len = 0;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, fe->t38.data_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */
@ -849,23 +851,26 @@ static int stream_hdlc(t31_state_t *s)
data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK;
data_fields[1].field = NULL;
data_fields[1].field_len = 0;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, fe->t38.data_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
delay = bits_to_us(s, i*8 + fe->hdlc_tx.extra_bits);
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
}
break;
}
else
{
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &s->hdlc_tx.buf[s->hdlc_tx.ptr], i, fe->t38.data_tx_count);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
delay = bits_to_us(s, i*8);
}
break;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &s->hdlc_tx.buf[s->hdlc_tx.ptr], i, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
}
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &s->hdlc_tx.buf[s->hdlc_tx.ptr], fe->octets_per_data_packet, fe->t38.data_tx_count);
s->hdlc_tx.ptr += fe->octets_per_data_packet;
delay = bits_to_us(s, fe->octets_per_data_packet*8);
else
{
i = fe->octets_per_data_packet;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &s->hdlc_tx.buf[s->hdlc_tx.ptr], i, category);
s->hdlc_tx.ptr += i;
}
delay = bits_to_us(s, i*8);
break;
case T38_TIMED_STEP_HDLC_MODEM_4:
/* End of HDLC frame */
@ -877,7 +882,8 @@ static int stream_hdlc(t31_state_t *s)
/* End of transmission */
s->hdlc_tx.len = 0;
s->hdlc_tx.final = FALSE;
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, fe->t38.data_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */
@ -888,7 +894,8 @@ static int stream_hdlc(t31_state_t *s)
break;
}
/* Finish the current frame off, and prepare for the next one. */
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, fe->t38.data_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
/* We should now wait enough time for everything to clear through an analogue modem at the far end. */
@ -899,8 +906,9 @@ static int stream_hdlc(t31_state_t *s)
case T38_TIMED_STEP_HDLC_MODEM_5:
/* Note that some boxes do not like us sending a T38_FIELD_HDLC_SIG_END at this point.
A T38_IND_NO_SIGNAL should always be OK. */
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, fe->t38.data_end_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, category);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
fe->timed_step = T38_TIMED_STEP_NONE;
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
@ -927,14 +935,14 @@ static int stream_ced(t31_state_t *s)
of silence, starting the delay with a no signal indication makes sense.
We do need a 200ms delay, as that is a specification requirement. */
fe->timed_step = T38_TIMED_STEP_CED_2;
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
delay = 200000;
fe->next_tx_samples = fe->samples;
break;
case T38_TIMED_STEP_CED_2:
/* Initial 200ms delay over. Send the CED indicator */
fe->timed_step = T38_TIMED_STEP_CED_3;
delay = t38_core_send_indicator(&fe->t38, T38_IND_CED, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_CED);
fe->current_tx_data_type = T38_DATA_NONE;
break;
case T38_TIMED_STEP_CED_3:
@ -964,7 +972,7 @@ static int stream_cng(t31_state_t *s)
be sending 200ms of silence, according to T.30, starting that delay with
a no signal indication makes sense. */
fe->timed_step = T38_TIMED_STEP_CNG_2;
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
delay = 200000;
fe->next_tx_samples = fe->samples;
break;
@ -973,7 +981,7 @@ static int stream_cng(t31_state_t *s)
coming the other way interrupts it, or a long timeout controlled by the T.30 engine
expires. */
fe->timed_step = T38_TIMED_STEP_NONE;
delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG);
fe->current_tx_data_type = T38_DATA_NONE;
return delay;
}
@ -1728,7 +1736,7 @@ static int restart_modem(t31_state_t *s, int new_modem)
case FAX_MODEM_SILENCE_TX:
if (s->t38_mode)
{
t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT);
t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL);
s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(700);
s->t38_fe.timed_step = T38_TIMED_STEP_PAUSE;
s->t38_fe.current_tx_data_type = T38_DATA_NONE;
@ -1755,7 +1763,7 @@ static int restart_modem(t31_state_t *s, int new_modem)
/* Send 200ms of silence to "push" the last audio out */
if (s->t38_mode)
{
t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT);
t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL);
}
else
{
@ -2424,17 +2432,21 @@ SPAN_DECLARE(void) t31_set_t38_config(t31_state_t *s, int without_pacing)
{
/* Continuous streaming mode, as used for TPKT over TCP transport */
/* Inhibit indicator packets */
s->t38_fe.t38.indicator_tx_count = 0;
s->t38_fe.t38.data_tx_count = 1;
s->t38_fe.t38.data_end_tx_count = 1;
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_INDICATOR, 0);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA, 1);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA_END, 1);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA, 1);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA_END, 1);
s->t38_fe.ms_per_tx_chunk = 0;
}
else
{
/* Paced streaming mode, as used for UDP transports */
s->t38_fe.t38.indicator_tx_count = INDICATOR_TX_COUNT;
s->t38_fe.t38.data_tx_count = DATA_TX_COUNT;
s->t38_fe.t38.data_end_tx_count = DATA_END_TX_COUNT;
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_INDICATOR, INDICATOR_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA, DATA_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA_END, DATA_END_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA, DATA_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA_END, DATA_END_TX_COUNT);
s->t38_fe.ms_per_tx_chunk = MS_PER_TX_CHUNK;
}
set_octets_per_data_packet(s, 300);

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: t38_core.c,v 1.52 2009/02/10 13:06:46 steveu Exp $
* $Id: t38_core.c,v 1.53 2009/07/14 13:54:22 steveu Exp $
*/
/*! \file */
@ -777,7 +777,7 @@ static int t38_encode_data(t38_core_state_t *s, uint8_t buf[], int data_type, co
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator, int count)
SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator)
{
uint8_t buf[100];
int len;
@ -789,7 +789,7 @@ SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator, in
{
/* Zero is a valid count, to suppress the transmission of indicators when the
transport means they are not needed - e.g. TPKT/TCP. */
if (count)
if (s->category_control[T38_PACKET_CATEGORY_INDICATOR])
{
if ((len = t38_encode_indicator(s, buf, indicator)) < 0)
{
@ -797,7 +797,7 @@ SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator, in
return len;
}
span_log(&s->logging, SPAN_LOG_FLOW, "Tx %5d: indicator %s\n", s->tx_seq_no, t38_indicator_to_str(indicator));
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, count);
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[T38_PACKET_CATEGORY_INDICATOR]);
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
delay = modem_startup_time[indicator].training;
if (s->allow_for_tep)
@ -815,7 +815,7 @@ SPAN_DECLARE(int) t38_core_send_flags_delay(t38_core_state_t *s, int indicator)
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t38_core_send_data(t38_core_state_t *s, int data_type, int field_type, const uint8_t field[], int field_len, int count)
SPAN_DECLARE(int) t38_core_send_data(t38_core_state_t *s, int data_type, int field_type, const uint8_t field[], int field_len, int category)
{
t38_data_field_t field0;
uint8_t buf[1000];
@ -829,13 +829,13 @@ SPAN_DECLARE(int) t38_core_send_data(t38_core_state_t *s, int data_type, int fie
span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len);
return len;
}
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, count);
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]);
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
return 0;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t38_core_send_data_multi_field(t38_core_state_t *s, int data_type, const t38_data_field_t field[], int fields, int count)
SPAN_DECLARE(int) t38_core_send_data_multi_field(t38_core_state_t *s, int data_type, const t38_data_field_t field[], int fields, int category)
{
uint8_t buf[1000];
int len;
@ -845,7 +845,7 @@ SPAN_DECLARE(int) t38_core_send_data_multi_field(t38_core_state_t *s, int data_t
span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len);
return len;
}
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, count);
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]);
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
return 0;
}
@ -911,6 +911,18 @@ SPAN_DECLARE(void) t38_set_tep_handling(t38_core_state_t *s, int allow_for_tep)
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) t38_set_redundancy_control(t38_core_state_t *s, int category, int setting)
{
s->category_control[category] = setting;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) t38_set_fastest_image_data_rate(t38_core_state_t *s, int max_rate)
{
s->fastest_image_data_rate = max_rate;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) t38_get_fastest_image_data_rate(t38_core_state_t *s)
{
return s->fastest_image_data_rate;
@ -952,6 +964,13 @@ SPAN_DECLARE(t38_core_state_t *) t38_core_init(t38_core_state_t *s,
s->t38_version = 0;
s->check_sequence_numbers = TRUE;
/* Set some defaults */
s->category_control[T38_PACKET_CATEGORY_INDICATOR] = 1;
s->category_control[T38_PACKET_CATEGORY_CONTROL_DATA] = 1;
s->category_control[T38_PACKET_CATEGORY_CONTROL_DATA_END] = 1;
s->category_control[T38_PACKET_CATEGORY_IMAGE_DATA] = 1;
s->category_control[T38_PACKET_CATEGORY_IMAGE_DATA_END] = 1;
/* Set the initial current receive states to something invalid, so the
first data received is seen as a change of state. */
s->current_rx_indicator = -1;

View File

@ -23,7 +23,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: t38_gateway.c,v 1.163 2009/05/16 03:34:45 steveu Exp $
* $Id: t38_gateway.c,v 1.164 2009/07/14 13:54:22 steveu Exp $
*/
/*! \file */
@ -1498,7 +1498,7 @@ static int set_fast_packetisation(t38_gateway_state_t *s)
static void announce_training(t38_gateway_state_t *s)
{
t38_core_send_indicator(&s->t38x.t38, set_fast_packetisation(s), s->t38x.t38.indicator_tx_count);
t38_core_send_indicator(&s->t38x.t38, set_fast_packetisation(s));
}
/*- End of function --------------------------------------------------------*/
@ -1552,7 +1552,7 @@ static void non_ecm_rx_status(void *user_data, int status)
/* TODO: If the carrier really did fall for good during the 500ms TEP blocking timeout, we
won't declare the no-signal condition. */
non_ecm_push_residue(s);
t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL, s->t38x.t38.indicator_tx_count);
t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL);
}
restart_rx_modem(s);
break;
@ -1586,7 +1586,7 @@ static void non_ecm_push_residue(t38_gateway_state_t *t)
/* There is a fractional octet in progress. We might as well send every last bit we can. */
s->data[s->data_ptr++] = (uint8_t) (s->bit_stream << (8 - s->bit_no));
}
t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, s->data, s->data_ptr, t->t38x.t38.data_end_tx_count);
t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, s->data, s->data_ptr, T38_PACKET_CATEGORY_IMAGE_DATA_END);
s->in_bits += s->bits_absorbed;
s->out_octets += s->data_ptr;
s->data_ptr = 0;
@ -1600,7 +1600,7 @@ static void non_ecm_push(t38_gateway_state_t *t)
s = &t->core.to_t38;
if (s->data_ptr)
{
t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, s->data, s->data_ptr, t->t38x.t38.data_tx_count);
t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, s->data, s->data_ptr, T38_PACKET_CATEGORY_IMAGE_DATA);
s->in_bits += s->bits_absorbed;
s->out_octets += s->data_ptr;
s->bits_absorbed = 0;
@ -1682,6 +1682,7 @@ static void non_ecm_remove_fill_and_put_bit(void *user_data, int bit)
static void hdlc_rx_status(hdlc_rx_state_t *t, int status)
{
t38_gateway_state_t *s;
int category;
s = (t38_gateway_state_t *) t->frame_user_data;
span_log(&s->logging, SPAN_LOG_FLOW, "HDLC signal status is %s (%d)\n", signal_status_to_str(status), status);
@ -1712,8 +1713,9 @@ static void hdlc_rx_status(hdlc_rx_state_t *t, int status)
case SIG_STATUS_CARRIER_DOWN:
if (t->framing_ok_announced)
{
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, s->t38x.t38.data_end_tx_count);
t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL, s->t38x.t38.indicator_tx_count);
category = (s->t38x.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, category);
t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL);
t->framing_ok_announced = FALSE;
}
restart_rx_modem(s);
@ -1739,6 +1741,7 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
{
t38_gateway_state_t *s;
t38_gateway_to_t38_state_t *u;
int category;
s = (t38_gateway_state_t *) t->frame_user_data;
u = &s->core.to_t38;
@ -1757,6 +1760,7 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
/* Hit HDLC flag */
if (t->flags_seen >= t->framing_ok_threshold)
{
category = (s->t38x.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
if (t->len)
{
/* This is not back-to-back flags */
@ -1765,7 +1769,7 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
if (u->data_ptr)
{
bit_reverse(u->data, t->buffer + t->len - 2 - u->data_ptr, u->data_ptr);
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, s->t38x.t38.data_tx_count);
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, category);
}
/*endif*/
if (t->num_bits != 7)
@ -1775,7 +1779,7 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
/* It seems some boxes may not like us sending a _SIG_END here, and then another
when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */
if (t->len > 2)
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, s->t38x.t38.data_tx_count);
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, category);
/*endif*/
}
else if ((u->crc & 0xFFFF) != 0xF0B8)
@ -1785,7 +1789,7 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
/* It seems some boxes may not like us sending a _SIG_END here, and then another
when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */
if (t->len > 2)
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, s->t38x.t38.data_tx_count);
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, category);
/*endif*/
}
else
@ -1810,7 +1814,7 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
/*endif*/
/* It seems some boxes may not like us sending a _SIG_END here, and then another
when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_OK, NULL, 0, s->t38x.t38.data_tx_count);
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_OK, NULL, 0, category);
}
/*endif*/
}
@ -1835,7 +1839,7 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
{
if (s->t38x.current_tx_data_type == T38_DATA_V21)
{
t38_core_send_indicator(&s->t38x.t38, set_slow_packetisation(s), s->t38x.t38.indicator_tx_count);
t38_core_send_indicator(&s->t38x.t38, set_slow_packetisation(s));
s->audio.modems.rx_signal_present = TRUE;
}
/*endif*/
@ -1861,6 +1865,7 @@ static void t38_hdlc_rx_put_bit(hdlc_rx_state_t *t, int new_bit)
{
t38_gateway_state_t *s;
t38_gateway_to_t38_state_t *u;
int category;
if (new_bit < 0)
{
@ -1914,7 +1919,8 @@ static void t38_hdlc_rx_put_bit(hdlc_rx_state_t *t, int new_bit)
if (++u->data_ptr >= u->octets_per_data_packet)
{
bit_reverse(u->data, t->buffer + t->len - 2 - u->data_ptr, u->data_ptr);
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, s->t38x.t38.data_tx_count);
category = (s->t38x.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, category);
/* Since we delay transmission by 2 octets, we should now have sent the last of the data octets when
we have just received the last of the CRC octets. */
u->data_ptr = 0;
@ -2028,7 +2034,7 @@ SPAN_DECLARE(int) t38_gateway_rx(t38_gateway_state_t *s, int16_t amp[], int len)
break;
case TIMED_MODE_STARTUP:
/* Ensure a no-signal condition goes out the moment the received audio starts */
t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL, s->t38x.t38.indicator_tx_count);
t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL);
s->core.timed_mode = TIMED_MODE_IDLE;
break;
}
@ -2127,11 +2133,11 @@ SPAN_DECLARE(void) t38_gateway_set_supported_modems(t38_gateway_state_t *s, int
{
s->core.supported_modems = supported_modems;
if ((s->core.supported_modems & T30_SUPPORT_V17))
s->t38x.t38.fastest_image_data_rate = 14400;
t38_set_fastest_image_data_rate(&s->t38x.t38, 14400);
else if ((s->core.supported_modems & T30_SUPPORT_V29))
s->t38x.t38.fastest_image_data_rate = 9600;
t38_set_fastest_image_data_rate(&s->t38x.t38, 9600);
else
s->t38x.t38.fastest_image_data_rate = 4800;
t38_set_fastest_image_data_rate(&s->t38x.t38, 4800);
/*endif*/
}
/*- End of function --------------------------------------------------------*/
@ -2160,8 +2166,8 @@ SPAN_DECLARE(void) t38_gateway_set_fill_bit_removal(t38_gateway_state_t *s, int
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(void) t38_gateway_set_real_time_frame_handler(t38_gateway_state_t *s,
t38_gateway_real_time_frame_handler_t *handler,
void *user_data)
t38_gateway_real_time_frame_handler_t *handler,
void *user_data)
{
s->core.real_time_frame_handler = handler;
s->core.real_time_frame_user_data = user_data;
@ -2191,8 +2197,8 @@ static int t38_gateway_audio_init(t38_gateway_state_t *s)
/*- End of function --------------------------------------------------------*/
static int t38_gateway_t38_init(t38_gateway_state_t *t,
t38_tx_packet_handler_t *tx_packet_handler,
void *tx_packet_user_data)
t38_tx_packet_handler_t *tx_packet_handler,
void *tx_packet_user_data)
{
t38_gateway_t38_state_t *s;
@ -2204,9 +2210,11 @@ static int t38_gateway_t38_init(t38_gateway_state_t *t,
(void *) t,
tx_packet_handler,
tx_packet_user_data);
s->t38.indicator_tx_count = INDICATOR_TX_COUNT;
s->t38.data_tx_count = DATA_TX_COUNT;
s->t38.data_end_tx_count = DATA_END_TX_COUNT;
t38_set_redundancy_control(&s->t38, T38_PACKET_CATEGORY_INDICATOR, INDICATOR_TX_COUNT);
t38_set_redundancy_control(&s->t38, T38_PACKET_CATEGORY_CONTROL_DATA, DATA_TX_COUNT);
t38_set_redundancy_control(&s->t38, T38_PACKET_CATEGORY_CONTROL_DATA_END, DATA_END_TX_COUNT);
t38_set_redundancy_control(&s->t38, T38_PACKET_CATEGORY_IMAGE_DATA, DATA_TX_COUNT);
t38_set_redundancy_control(&s->t38, T38_PACKET_CATEGORY_IMAGE_DATA_END, DATA_END_TX_COUNT);
return 0;
}
/*- End of function --------------------------------------------------------*/

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: t38_terminal.c,v 1.125 2009/05/02 04:43:48 steveu Exp $
* $Id: t38_terminal.c,v 1.127 2009/07/14 13:54:22 steveu Exp $
*/
/*! \file */
@ -565,7 +565,7 @@ static int stream_non_ecm(t38_terminal_state_t *s)
case T38_TIMED_STEP_NON_ECM_MODEM:
/* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
else
delay = 75000;
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2;
@ -573,7 +573,7 @@ static int stream_non_ecm(t38_terminal_state_t *s)
break;
case T38_TIMED_STEP_NON_ECM_MODEM_2:
/* Switch on a fast modem, and give the training time to complete */
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator);
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
break;
case T38_TIMED_STEP_NON_ECM_MODEM_3:
@ -605,12 +605,13 @@ static int stream_non_ecm(t38_terminal_state_t *s)
else
{
/* If we are sending quickly there seems no point in doing any padding */
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, fe->t38.data_end_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
delay = 0;
break;
}
}
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, fe->t38.data_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
delay = bits_to_us(s, 8*len);
break;
case T38_TIMED_STEP_NON_ECM_MODEM_4:
@ -621,7 +622,7 @@ static int stream_non_ecm(t38_terminal_state_t *s)
{
len += fe->non_ecm_trailer_bytes;
memset(buf, 0, len);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, fe->t38.data_end_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
/* Allow a bit more time than the data will take to play out, to ensure the far ATA does not
cut things short. */
@ -632,13 +633,13 @@ static int stream_non_ecm(t38_terminal_state_t *s)
break;
}
memset(buf, 0, len);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, fe->t38.data_tx_count);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
delay = bits_to_us(s, 8*len);
break;
case T38_TIMED_STEP_NON_ECM_MODEM_5:
/* This should not be needed, since the message above indicates the end of the signal, but it
seems like it can improve compatibility with quirky implementations. */
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
fe->timed_step = T38_TIMED_STEP_NONE;
return delay;
}
@ -652,6 +653,7 @@ static int stream_hdlc(t38_terminal_state_t *s)
t38_terminal_front_end_state_t *fe;
uint8_t buf[MAX_OCTETS_PER_UNPACED_CHUNK + 50];
t38_data_field_t data_fields[2];
int category;
int previous;
int delay;
int i;
@ -664,7 +666,7 @@ static int stream_hdlc(t38_terminal_state_t *s)
case T38_TIMED_STEP_HDLC_MODEM:
/* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
else
delay = 75000;
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2;
@ -672,7 +674,7 @@ static int stream_hdlc(t38_terminal_state_t *s)
break;
case T38_TIMED_STEP_HDLC_MODEM_2:
/* Send HDLC preambling */
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator);
delay += t38_core_send_flags_delay(&fe->t38, fe->next_tx_indicator);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
break;
@ -701,7 +703,8 @@ static int stream_hdlc(t38_terminal_state_t *s)
data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK_SIG_END;
data_fields[1].field = NULL;
data_fields[1].field_len = 0;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, fe->t38.data_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */
@ -715,22 +718,25 @@ static int stream_hdlc(t38_terminal_state_t *s)
data_fields[1].field_type = T38_FIELD_HDLC_FCS_OK;
data_fields[1].field = NULL;
data_fields[1].field_len = 0;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, fe->t38.data_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
delay = bits_to_us(s, i*8 + fe->hdlc_tx.extra_bits);
}
break;
}
else
{
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, fe->t38.data_tx_count);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
delay = bits_to_us(s, i*8);
}
break;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
}
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], fe->octets_per_data_packet, fe->t38.data_tx_count);
fe->hdlc_tx.ptr += fe->octets_per_data_packet;
delay = bits_to_us(s, fe->octets_per_data_packet*8);
else
{
i = fe->octets_per_data_packet;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category);
fe->hdlc_tx.ptr += i;
}
delay = bits_to_us(s, i*8);
break;
case T38_TIMED_STEP_HDLC_MODEM_4:
/* End of HDLC frame */
@ -742,7 +748,8 @@ static int stream_hdlc(t38_terminal_state_t *s)
if (fe->hdlc_tx.len < 0)
{
/* End of transmission */
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, fe->t38.data_end_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */
@ -759,7 +766,8 @@ static int stream_hdlc(t38_terminal_state_t *s)
span_log(&s->logging, SPAN_LOG_FLOW, "No new frame or end transmission condition.\n");
}
/* Finish the current frame off, and prepare for the next one. */
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, fe->t38.data_tx_count);
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
/* We should now wait enough time for everything to clear through an analogue modem at the far end. */
delay = bits_to_us(s, fe->hdlc_tx.extra_bits);
@ -767,7 +775,7 @@ static int stream_hdlc(t38_terminal_state_t *s)
case T38_TIMED_STEP_HDLC_MODEM_5:
/* Note that some boxes do not like us sending a T38_FIELD_HDLC_SIG_END at this point.
A T38_IND_NO_SIGNAL should always be OK. */
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
fe->timed_step = T38_TIMED_STEP_NONE;
return delay;
}
@ -792,14 +800,14 @@ static int stream_ced(t38_terminal_state_t *s)
of silence, starting the delay with a no signal indication makes sense.
We do need a 200ms delay, as that is a specification requirement. */
fe->timed_step = T38_TIMED_STEP_CED_2;
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
delay = 200000;
fe->next_tx_samples = fe->samples;
break;
case T38_TIMED_STEP_CED_2:
/* Initial 200ms delay over. Send the CED indicator */
fe->timed_step = T38_TIMED_STEP_CED_3;
delay = t38_core_send_indicator(&fe->t38, T38_IND_CED, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_CED);
fe->current_tx_data_type = T38_DATA_NONE;
break;
case T38_TIMED_STEP_CED_3:
@ -829,7 +837,7 @@ static int stream_cng(t38_terminal_state_t *s)
be sending 200ms of silence, according to T.30, starting that delay with
a no signal indication makes sense. */
fe->timed_step = T38_TIMED_STEP_CNG_2;
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
delay = 200000;
fe->next_tx_samples = fe->samples;
break;
@ -838,7 +846,7 @@ static int stream_cng(t38_terminal_state_t *s)
coming the other way interrupts it, or a long timeout controlled by the T.30 engine
expires. */
fe->timed_step = T38_TIMED_STEP_NONE;
delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG, fe->t38.indicator_tx_count);
delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG);
fe->current_tx_data_type = T38_DATA_NONE;
return delay;
}
@ -1032,17 +1040,21 @@ SPAN_DECLARE(void) t38_terminal_set_config(t38_terminal_state_t *s, int without_
{
/* Continuous streaming mode, as used for TPKT over TCP transport */
/* Inhibit indicator packets */
s->t38_fe.t38.indicator_tx_count = 0;
s->t38_fe.t38.data_tx_count = 1;
s->t38_fe.t38.data_end_tx_count = 1;
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_INDICATOR, 0);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA, 1);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA_END, 1);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA, 1);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA_END, 1);
s->t38_fe.ms_per_tx_chunk = 0;
}
else
{
/* Paced streaming mode, as used for UDP transports */
s->t38_fe.t38.indicator_tx_count = INDICATOR_TX_COUNT;
s->t38_fe.t38.data_tx_count = DATA_TX_COUNT;
s->t38_fe.t38.data_end_tx_count = DATA_END_TX_COUNT;
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_INDICATOR, INDICATOR_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA, DATA_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_CONTROL_DATA_END, DATA_END_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA, DATA_TX_COUNT);
t38_set_redundancy_control(&s->t38_fe.t38, T38_PACKET_CATEGORY_IMAGE_DATA_END, DATA_END_TX_COUNT);
s->t38_fe.ms_per_tx_chunk = MS_PER_TX_CHUNK;
}
set_octets_per_data_packet(s, 300);
@ -1095,7 +1107,7 @@ static int t38_terminal_t38_fe_init(t38_terminal_state_t *t,
(void *) t,
tx_packet_handler,
tx_packet_user_data);
s->t38.fastest_image_data_rate = 14400;
t38_set_fastest_image_data_rate(&s->t38, 14400);
s->rx_signal_present = FALSE;
s->timed_step = T38_TIMED_STEP_NONE;

View File

@ -23,7 +23,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v17rx.c,v 1.149 2009/06/02 16:03:56 steveu Exp $
* $Id: v17rx.c,v 1.153 2009/07/09 14:17:57 steveu Exp $
*/
/*! \file */
@ -262,24 +262,30 @@ static __inline__ complexf_t equalizer_get(v17_rx_state_t *s)
#if defined(SPANDSP_USE_FIXED_POINTx)
static void tune_equalizer(v17_rx_state_t *s, const complexi16_t *z, const complexi16_t *target)
{
complexi16_t err;
/* Find the x and y mismatch from the exact constellation position. */
err.re = target->re*FP_FACTOR - z->re;
err.im = target->im*FP_FACTOR - z->im;
//span_log(&s->logging, SPAN_LOG_FLOW, "Equalizer error %f\n", sqrt(err.re*err.re + err.im*err.im));
err.re = ((int32_t) err.re*(int32_t) s->eq_delta) >> 15;
err.im = ((int32_t) err.im*(int32_t) s->eq_delta) >> 15;
cvec_circular_lmsi16(s->eq_buf, s->eq_coeff, V17_EQUALIZER_LEN, s->eq_step, &err);
}
#else
static void tune_equalizer(v17_rx_state_t *s, const complexf_t *z, const complexf_t *target)
#endif
{
complexf_t err;
/* Find the x and y mismatch from the exact constellation position. */
err = complex_subf(target, z);
//span_log(&s->logging, SPAN_LOG_FLOW, "Equalizer error %f\n", sqrt(ez.re*ez.re + ez.im*ez.im));
err.re *= s->eq_delta;
err.im *= s->eq_delta;
err = complex_subf(target, z);
//span_log(&s->logging, SPAN_LOG_FLOW, "Equalizer error %f\n", sqrt(err.re*err.re + err.im*err.im));
err.re *= s->eq_delta;
err.im *= s->eq_delta;
cvec_circular_lmsf(s->eq_buf, s->eq_coeff, V17_EQUALIZER_LEN, s->eq_step, &err);
}
/*- End of function --------------------------------------------------------*/
#endif
static int descramble(v17_rx_state_t *s, int in_bit)
{

View File

@ -23,7 +23,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v27ter_rx.c,v 1.130 2009/06/02 16:03:56 steveu Exp $
* $Id: v27ter_rx.c,v 1.131 2009/07/08 15:11:09 steveu Exp $
*/
/*! \file */
@ -271,11 +271,7 @@ static __inline__ complexf_t equalizer_get(v27ter_rx_state_t *s)
#if defined(SPANDSP_USE_FIXED_POINTx)
static void tune_equalizer(v27ter_rx_state_t *s, const complexi16_t *z, const complexi16_t *target)
#else
static void tune_equalizer(v27ter_rx_state_t *s, const complexf_t *z, const complexf_t *target)
#endif
{
#if defined(SPANDSP_USE_FIXED_POINTx)
complexi16_t err;
/* Find the x and y mismatch from the exact constellation position. */
@ -284,7 +280,10 @@ static void tune_equalizer(v27ter_rx_state_t *s, const complexf_t *z, const comp
err.re = ((int32_t) err.re*(int32_t) s->eq_delta) >> 15;
err.im = ((int32_t) err.im*(int32_t) s->eq_delta) >> 15;
cvec_circular_lmsi16(s->eq_buf, s->eq_coeff, V27TER_EQUALIZER_LEN, s->eq_step, &err);
}
#else
static void tune_equalizer(v27ter_rx_state_t *s, const complexf_t *z, const complexf_t *target)
{
complexf_t err;
/* Find the x and y mismatch from the exact constellation position. */
@ -292,8 +291,8 @@ static void tune_equalizer(v27ter_rx_state_t *s, const complexf_t *z, const comp
err.re *= s->eq_delta;
err.im *= s->eq_delta;
cvec_circular_lmsf(s->eq_buf, s->eq_coeff, V27TER_EQUALIZER_LEN, s->eq_step, &err);
#endif
}
#endif
/*- End of function --------------------------------------------------------*/
#if defined(SPANDSP_USE_FIXED_POINTx)

View File

@ -23,7 +23,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v29rx.c,v 1.166 2009/06/02 16:03:56 steveu Exp $
* $Id: v29rx.c,v 1.167 2009/07/08 15:11:09 steveu Exp $
*/
/*! \file */
@ -278,11 +278,7 @@ static __inline__ complexf_t equalizer_get(v29_rx_state_t *s)
#if defined(SPANDSP_USE_FIXED_POINT)
static void tune_equalizer(v29_rx_state_t *s, const complexi16_t *z, const complexi16_t *target)
#else
static void tune_equalizer(v29_rx_state_t *s, const complexf_t *z, const complexf_t *target)
#endif
{
#if defined(SPANDSP_USE_FIXED_POINT)
complexi16_t err;
/* Find the x and y mismatch from the exact constellation position. */
@ -291,7 +287,10 @@ static void tune_equalizer(v29_rx_state_t *s, const complexf_t *z, const complex
err.re = ((int32_t) err.re*(int32_t) s->eq_delta) >> 15;
err.im = ((int32_t) err.im*(int32_t) s->eq_delta) >> 15;
cvec_circular_lmsi16(s->eq_buf, s->eq_coeff, V29_EQUALIZER_LEN, s->eq_step, &err);
}
#else
static void tune_equalizer(v29_rx_state_t *s, const complexf_t *z, const complexf_t *target)
{
complexf_t err;
/* Find the x and y mismatch from the exact constellation position. */
@ -299,8 +298,8 @@ static void tune_equalizer(v29_rx_state_t *s, const complexf_t *z, const complex
err.re *= s->eq_delta;
err.im *= s->eq_delta;
cvec_circular_lmsf(s->eq_buf, s->eq_coeff, V29_EQUALIZER_LEN, s->eq_step, &err);
#endif
}
#endif
/*- End of function --------------------------------------------------------*/
static int scrambled_training_bit(v29_rx_state_t *s)

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v8.c,v 1.38 2009/02/03 16:28:40 steveu Exp $
* $Id: v8.c,v 1.39 2009/06/24 00:34:38 steveu Exp $
*/
/*! \file */

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: vector_float.c,v 1.21 2009/02/05 15:57:27 steveu Exp $
* $Id: vector_float.c,v 1.22 2009/07/12 09:23:09 steveu Exp $
*/
/*! \file */
@ -41,33 +41,10 @@
#if defined(HAVE_MATH_H)
#include <math.h>
#endif
#include "floating_fudge.h"
#include <assert.h>
#if defined(SPANDSP_USE_MMX)
#include <mmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE)
#include <xmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE2)
#include <emmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE3)
#include <pmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_1)
#include <smmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_2)
#include <nmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4A)
#include <ammintrin.h>
#endif
#if defined(SPANDSP_USE_SSE5)
#include <bmmintrin.h>
#endif
#include "floating_fudge.h"
#include "mmx_sse_decs.h"
#include "spandsp/telephony.h"
#include "spandsp/vector_float.h"

View File

@ -22,7 +22,7 @@
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: vector_int.c,v 1.25 2009/02/21 04:27:46 steveu Exp $
* $Id: vector_int.c,v 1.26 2009/07/12 09:23:09 steveu Exp $
*/
/*! \file */
@ -41,33 +41,10 @@
#if defined(HAVE_MATH_H)
#include <math.h>
#endif
#include "floating_fudge.h"
#include <assert.h>
#if defined(SPANDSP_USE_MMX)
#include <mmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE)
#include <xmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE2)
#include <emmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE3)
#include <pmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_1)
#include <smmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4_2)
#include <nmmintrin.h>
#endif
#if defined(SPANDSP_USE_SSE4A)
#include <ammintrin.h>
#endif
#if defined(SPANDSP_USE_SSE5)
#include <bmmintrin.h>
#endif
#include "floating_fudge.h"
#include "mmx_sse_decs.h"
#include "spandsp/telephony.h"
#include "spandsp/vector_int.h"

View File

@ -22,7 +22,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: fsk_tests.c,v 1.57 2009/05/30 15:23:13 steveu Exp $
* $Id: fsk_tests.c,v 1.58 2009/07/09 13:52:09 steveu Exp $
*/
/*! \page fsk_tests_page FSK modem tests
@ -126,37 +126,37 @@ static void reporter(void *user_data, int reason, bert_results_t *results)
switch (reason)
{
case BERT_REPORT_SYNCED:
printf("%d: BERT report synced\n", channel);
fprintf(stderr, "%d: BERT report synced\n", channel);
break;
case BERT_REPORT_UNSYNCED:
printf("%d: BERT report unsync'ed\n", channel);
fprintf(stderr, "%d: BERT report unsync'ed\n", channel);
break;
case BERT_REPORT_REGULAR:
printf("%d: BERT report regular - %d bits, %d bad bits, %d resyncs\n", channel, results->total_bits, results->bad_bits, results->resyncs);
fprintf(stderr, "%d: BERT report regular - %d bits, %d bad bits, %d resyncs\n", channel, results->total_bits, results->bad_bits, results->resyncs);
break;
case BERT_REPORT_GT_10_2:
printf("%d: BERT report > 1 in 10^2\n", channel);
fprintf(stderr, "%d: BERT report > 1 in 10^2\n", channel);
break;
case BERT_REPORT_LT_10_2:
printf("%d: BERT report < 1 in 10^2\n", channel);
fprintf(stderr, "%d: BERT report < 1 in 10^2\n", channel);
break;
case BERT_REPORT_LT_10_3:
printf("%d: BERT report < 1 in 10^3\n", channel);
fprintf(stderr, "%d: BERT report < 1 in 10^3\n", channel);
break;
case BERT_REPORT_LT_10_4:
printf("%d: BERT report < 1 in 10^4\n", channel);
fprintf(stderr, "%d: BERT report < 1 in 10^4\n", channel);
break;
case BERT_REPORT_LT_10_5:
printf("%d: BERT report < 1 in 10^5\n", channel);
fprintf(stderr, "%d: BERT report < 1 in 10^5\n", channel);
break;
case BERT_REPORT_LT_10_6:
printf("%d: BERT report < 1 in 10^6\n", channel);
fprintf(stderr, "%d: BERT report < 1 in 10^6\n", channel);
break;
case BERT_REPORT_LT_10_7:
printf("%d: BERT report < 1 in 10^7\n", channel);
fprintf(stderr, "%d: BERT report < 1 in 10^7\n", channel);
break;
default:
printf("%d: BERT report reason %d\n", channel, reason);
fprintf(stderr, "%d: BERT report reason %d\n", channel, reason);
break;
}
}

View File

@ -22,7 +22,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: t38_core_tests.c,v 1.15 2009/04/25 14:17:47 steveu Exp $
* $Id: t38_core_tests.c,v 1.16 2009/07/14 13:54:22 steveu Exp $
*/
/*! \file */
@ -138,7 +138,7 @@ static int encode_decode_tests(t38_core_state_t *a, t38_core_state_t *b)
for (i = 0; i < 100; i++)
{
current_indicator = i;
if (t38_core_send_indicator(a, i, 3) < 0)
if (t38_core_send_indicator(a, i) < 0)
break;
}
@ -150,7 +150,7 @@ static int encode_decode_tests(t38_core_state_t *a, t38_core_state_t *b)
current_data_type = i;
current_field_type = j;
skip = 99;
if (t38_core_send_data(a, i, j, (uint8_t *) "", 0, 1) < 0)
if (t38_core_send_data(a, i, j, (uint8_t *) "", 0, T38_PACKET_CATEGORY_CONTROL_DATA) < 0)
break;
}
if (j == 0)
@ -165,7 +165,7 @@ static int encode_decode_tests(t38_core_state_t *a, t38_core_state_t *b)
current_data_type = i;
current_field_type = j;
skip = 99;
if (t38_core_send_data(a, i, j, (uint8_t *) "ABCD", 4, 1) < 0)
if (t38_core_send_data(a, i, j, (uint8_t *) "ABCD", 4, T38_PACKET_CATEGORY_CONTROL_DATA) < 0)
break;
}
if (j == 0)
@ -190,7 +190,7 @@ static int encode_decode_tests(t38_core_state_t *a, t38_core_state_t *b)
field[1].field_type = T38_FIELD_T4_NON_ECM_SIG_END;
field[1].field = field_body[1];
field[1].field_len = field_len[1];
if (t38_core_send_data_multi_field(a, i, field, 2, 1) < 0)
if (t38_core_send_data_multi_field(a, i, field, 2, T38_PACKET_CATEGORY_CONTROL_DATA) < 0)
break;
}
if (j == 0)

View File

@ -23,7 +23,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v17_tests.c,v 1.103 2009/05/30 15:23:14 steveu Exp $
* $Id: v17_tests.c,v 1.104 2009/07/09 13:52:09 steveu Exp $
*/
/*! \page v17_tests_page V.17 modem tests
@ -104,11 +104,11 @@ static void reporter(void *user_data, int reason, bert_results_t *results)
switch (reason)
{
case BERT_REPORT_REGULAR:
printf("BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs);
fprintf(stderr, "BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs);
memcpy(&latest_results, results, sizeof(latest_results));
break;
default:
printf("BERT report %s\n", bert_event_to_str(reason));
fprintf(stderr, "BERT report %s\n", bert_event_to_str(reason));
break;
}
}

View File

@ -22,7 +22,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v22bis_tests.c,v 1.62 2009/05/30 15:23:14 steveu Exp $
* $Id: v22bis_tests.c,v 1.63 2009/07/09 13:52:09 steveu Exp $
*/
/*! \page v22bis_tests_page V.22bis modem tests
@ -94,17 +94,18 @@ static void reporter(void *user_data, int reason, bert_results_t *results)
switch (reason)
{
case BERT_REPORT_REGULAR:
printf("V.22bis rx %p BERT report regular - %d bits, %d bad bits, %d resyncs\n",
user_data,
results->total_bits,
results->bad_bits,
results->resyncs);
fprintf(stderr, "V.22bis rx %p BERT report regular - %d bits, %d bad bits, %d resyncs\n",
user_data,
results->total_bits,
results->bad_bits,
results->resyncs);
memcpy(&s->latest_results, results, sizeof(s->latest_results));
break;
default:
printf("V.22bis rx %p BERT report %s\n",
user_data,
bert_event_to_str(reason));
fprintf(stderr,
"V.22bis rx %p BERT report %s\n",
user_data,
bert_event_to_str(reason));
break;
}
}

View File

@ -22,7 +22,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v27ter_tests.c,v 1.105 2009/05/30 15:23:14 steveu Exp $
* $Id: v27ter_tests.c,v 1.106 2009/07/09 13:52:09 steveu Exp $
*/
/*! \page v27ter_tests_page V.27ter modem tests
@ -100,11 +100,11 @@ static void reporter(void *user_data, int reason, bert_results_t *results)
switch (reason)
{
case BERT_REPORT_REGULAR:
printf("BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs);
fprintf(stderr, "BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs);
memcpy(&latest_results, results, sizeof(latest_results));
break;
default:
printf("BERT report %s\n", bert_event_to_str(reason));
fprintf(stderr, "BERT report %s\n", bert_event_to_str(reason));
break;
}
}

View File

@ -22,7 +22,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: v29_tests.c,v 1.119 2009/05/30 15:23:14 steveu Exp $
* $Id: v29_tests.c,v 1.120 2009/07/09 13:52:09 steveu Exp $
*/
/*! \page v29_tests_page V.29 modem tests
@ -99,11 +99,11 @@ static void reporter(void *user_data, int reason, bert_results_t *results)
switch (reason)
{
case BERT_REPORT_REGULAR:
printf("BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs);
fprintf(stderr, "BERT report regular - %d bits, %d bad bits, %d resyncs\n", results->total_bits, results->bad_bits, results->resyncs);
memcpy(&latest_results, results, sizeof(latest_results));
break;
default:
printf("BERT report %s\n", bert_event_to_str(reason));
fprintf(stderr, "BERT report %s\n", bert_event_to_str(reason));
break;
}
}