Various tweaks to spandsp. Cleaned up a few MSVC issues with spandsp

This commit is contained in:
Steve Underwood 2012-07-18 21:46:58 +08:00
parent 682fb58bd5
commit 12aec908bb
17 changed files with 244 additions and 136 deletions

View File

@ -100,6 +100,7 @@ SPAN_DECLARE_NONSTD(int) fax_modems_v17_v21_rx(void *user_data, const int16_t am
s->rx_handler = (span_rx_handler_t) &fsk_rx; s->rx_handler = (span_rx_handler_t) &fsk_rx;
s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin; s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin;
s->rx_user_data = &s->v21_rx; s->rx_user_data = &s->v21_rx;
s->rx_fillin_user_data = &s->v21_rx;
} }
/*endif*/ /*endif*/
return 0; return 0;
@ -131,6 +132,7 @@ SPAN_DECLARE_NONSTD(int) fax_modems_v27ter_v21_rx(void *user_data, const int16_t
s->rx_handler = (span_rx_handler_t) &fsk_rx; s->rx_handler = (span_rx_handler_t) &fsk_rx;
s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin; s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin;
s->rx_user_data = &s->v21_rx; s->rx_user_data = &s->v21_rx;
s->rx_fillin_user_data = &s->v21_rx;
} }
/*endif*/ /*endif*/
return 0; return 0;
@ -162,6 +164,7 @@ SPAN_DECLARE_NONSTD(int) fax_modems_v29_v21_rx(void *user_data, const int16_t am
s->rx_handler = (span_rx_handler_t) &fsk_rx; s->rx_handler = (span_rx_handler_t) &fsk_rx;
s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin; s->rx_fillin_handler = (span_rx_fillin_handler_t) &fsk_rx_fillin;
s->rx_user_data = &s->v21_rx; s->rx_user_data = &s->v21_rx;
s->rx_fillin_user_data = &s->v21_rx;
} }
/*endif*/ /*endif*/
return 0; return 0;
@ -201,6 +204,7 @@ static void v17_rx_status_handler(void *user_data, int status)
s->rx_handler = (span_rx_handler_t) &v17_rx; s->rx_handler = (span_rx_handler_t) &v17_rx;
s->rx_fillin_handler = (span_rx_fillin_handler_t) &v17_rx_fillin; s->rx_fillin_handler = (span_rx_fillin_handler_t) &v17_rx_fillin;
s->rx_user_data = &s->fast_modems.v17_rx; s->rx_user_data = &s->fast_modems.v17_rx;
s->rx_fillin_user_data = &s->fast_modems.v17_rx;
break; break;
} }
/*endswitch*/ /*endswitch*/
@ -219,6 +223,7 @@ static void v27ter_rx_status_handler(void *user_data, int status)
s->rx_handler = (span_rx_handler_t) &v27ter_rx; s->rx_handler = (span_rx_handler_t) &v27ter_rx;
s->rx_fillin_handler = (span_rx_fillin_handler_t) &v27ter_rx_fillin; s->rx_fillin_handler = (span_rx_fillin_handler_t) &v27ter_rx_fillin;
s->rx_user_data = &s->fast_modems.v27ter_rx; s->rx_user_data = &s->fast_modems.v27ter_rx;
s->rx_fillin_user_data = &s->fast_modems.v27ter_rx;
break; break;
} }
/*endswitch*/ /*endswitch*/
@ -237,6 +242,7 @@ static void v29_rx_status_handler(void *user_data, int status)
s->rx_handler = (span_rx_handler_t) &v29_rx; s->rx_handler = (span_rx_handler_t) &v29_rx;
s->rx_fillin_handler = (span_rx_fillin_handler_t) &v29_rx_fillin; s->rx_fillin_handler = (span_rx_fillin_handler_t) &v29_rx_fillin;
s->rx_user_data = &s->fast_modems.v29_rx; s->rx_user_data = &s->fast_modems.v29_rx;
s->rx_fillin_user_data = &s->fast_modems.v29_rx;
break; break;
} }
/*endswitch*/ /*endswitch*/
@ -326,6 +332,7 @@ SPAN_DECLARE(fax_modems_state_t *) fax_modems_init(fax_modems_state_t *s,
s->rx_handler = (span_rx_handler_t) &span_dummy_rx; s->rx_handler = (span_rx_handler_t) &span_dummy_rx;
s->rx_fillin_handler = (span_rx_fillin_handler_t) &span_dummy_rx; s->rx_fillin_handler = (span_rx_fillin_handler_t) &span_dummy_rx;
s->rx_user_data = NULL; s->rx_user_data = NULL;
s->rx_fillin_user_data = NULL;
s->tx_handler = (span_tx_handler_t) &silence_gen; s->tx_handler = (span_tx_handler_t) &silence_gen;
s->tx_user_data = &s->silence_gen; s->tx_user_data = &s->silence_gen;
return s; return s;

View File

@ -43,6 +43,9 @@ typedef __int64 int64_t;
#if !defined(UINT16_MAX) #if !defined(UINT16_MAX)
#define UINT16_MAX 0xFFFF #define UINT16_MAX 0xFFFF
#endif #endif
#if !defined(UINT32_MAX)
#define UINT32_MAX 0xFFFFFFFF
#endif
#if !defined(INT16_MAX) #if !defined(INT16_MAX)
#define INT16_MAX 0x7FFF #define INT16_MAX 0x7FFF

View File

@ -21,8 +21,6 @@
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software * License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id: spandsp.h.in,v 1.19.4.1 2009/12/19 09:47:56 steveu Exp $
*/ */
/*! \file */ /*! \file */
@ -38,6 +36,10 @@
#define SPANDSP_USE_EXPORT_CAPABILITY 1 #define SPANDSP_USE_EXPORT_CAPABILITY 1
#undef SPANDSP_SUPPORT_T42
#undef SPANDSP_SUPPORT_T43
#undef SPANDSP_SUPPORT_V34
#include <stdlib.h> #include <stdlib.h>
#include <msvc/inttypes.h> #include <msvc/inttypes.h>
#include <string.h> #include <string.h>
@ -56,6 +58,7 @@
#include <spandsp/schedule.h> #include <spandsp/schedule.h>
#include <spandsp/g711.h> #include <spandsp/g711.h>
#include <spandsp/timing.h> #include <spandsp/timing.h>
#include <spandsp/math_fixed.h>
#include <spandsp/vector_float.h> #include <spandsp/vector_float.h>
#include <spandsp/complex_vector_float.h> #include <spandsp/complex_vector_float.h>
#include <spandsp/vector_int.h> #include <spandsp/vector_int.h>
@ -88,6 +91,9 @@
#include <spandsp/fsk.h> #include <spandsp/fsk.h>
#include <spandsp/modem_connect_tones.h> #include <spandsp/modem_connect_tones.h>
#include <spandsp/silence_gen.h> #include <spandsp/silence_gen.h>
#include <spandsp/v8.h>
#include <spandsp/v42.h>
#include <spandsp/v42bis.h>
#include <spandsp/v29rx.h> #include <spandsp/v29rx.h>
#include <spandsp/v29tx.h> #include <spandsp/v29tx.h>
#include <spandsp/v17rx.h> #include <spandsp/v17rx.h>
@ -95,17 +101,21 @@
#include <spandsp/v22bis.h> #include <spandsp/v22bis.h>
#include <spandsp/v27ter_rx.h> #include <spandsp/v27ter_rx.h>
#include <spandsp/v27ter_tx.h> #include <spandsp/v27ter_tx.h>
#include <spandsp/v8.h>
#include <spandsp/v18.h> #include <spandsp/v18.h>
#include <spandsp/v42.h>
#include <spandsp/v42bis.h>
#include <spandsp/timezone.h> #include <spandsp/timezone.h>
#include <spandsp/t4_rx.h> #include <spandsp/t4_rx.h>
#include <spandsp/t4_tx.h> #include <spandsp/t4_tx.h>
#include <spandsp/image_translate.h>
#include <spandsp/t4_t6_decode.h> #include <spandsp/t4_t6_decode.h>
#include <spandsp/t4_t6_encode.h> #include <spandsp/t4_t6_encode.h>
#include <spandsp/t81_t82_arith_coding.h> #include <spandsp/t81_t82_arith_coding.h>
#include <spandsp/t85.h> #include <spandsp/t85.h>
#if defined(SPANDSP_SUPPORT_T42)
#include <spandsp/t42.h>
#endif
#if defined(SPANDSP_SUPPORT_T43)
#include <spandsp/t43.h>
#endif
#include <spandsp/t30.h> #include <spandsp/t30.h>
#include <spandsp/t30_api.h> #include <spandsp/t30_api.h>
#include <spandsp/t30_fcf.h> #include <spandsp/t30_fcf.h>

View File

@ -99,6 +99,7 @@ struct fax_modems_state_s
/*! \brief The current receive missing signal fill-in handler */ /*! \brief The current receive missing signal fill-in handler */
span_rx_fillin_handler_t rx_fillin_handler; span_rx_fillin_handler_t rx_fillin_handler;
void *rx_user_data; void *rx_user_data;
void *rx_fillin_user_data;
/*! \brief The current transmit signal handler */ /*! \brief The current transmit signal handler */
span_tx_handler_t tx_handler; span_tx_handler_t tx_handler;
@ -109,12 +110,12 @@ struct fax_modems_state_s
span_tx_handler_t next_tx_handler; span_tx_handler_t next_tx_handler;
void *next_tx_user_data; void *next_tx_user_data;
/*! The current bit rate of the transmitter. */ /*! \brief The current bit rate of the transmitter. */
int tx_bit_rate; int tx_bit_rate;
/*! The current bit rate of the receiver. */ /*! \brief The current bit rate of the receiver. */
int rx_bit_rate; int rx_bit_rate;
/*! If TRUE, transmission is in progress */ /*! \brief If TRUE, transmission is in progress */
int transmit; int transmit;
/*! \brief Audio logging file handle for received audio. */ /*! \brief Audio logging file handle for received audio. */
int audio_rx_log; int audio_rx_log;

View File

@ -73,7 +73,7 @@ struct v17_rx_state_s
void *qam_user_data; void *qam_user_data;
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The scaling factor accessed by the AGC algorithm. */ /*! \brief The scaling factor assessed by the AGC algorithm. */
float agc_scaling; float agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */ /*! \brief The previous value of agc_scaling, needed to reuse old training. */
float agc_scaling_save; float agc_scaling_save;
@ -110,7 +110,7 @@ struct v17_rx_state_s
/*! \brief A pointer to the current constellation. */ /*! \brief A pointer to the current constellation. */
const complexi16_t *constellation; const complexi16_t *constellation;
#else #else
/*! \brief The scaling factor accessed by the AGC algorithm. */ /*! \brief The scaling factor assessed by the AGC algorithm. */
float agc_scaling; float agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */ /*! \brief The previous value of agc_scaling, needed to reuse old training. */
float agc_scaling_save; float agc_scaling_save;
@ -150,7 +150,7 @@ struct v17_rx_state_s
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step; int rrc_filter_step;
/*! \brief The state of the differential decoder */ /*! \brief The current state of the differential decoder */
int diff; int diff;
/*! \brief The register for the data scrambler. */ /*! \brief The register for the data scrambler. */
uint32_t scramble_reg; uint32_t scramble_reg;
@ -228,7 +228,6 @@ struct v17_rx_state_s
from the last states of the trellis. */ from the last states of the trellis. */
float distances[8]; float distances[8];
#endif #endif
/*! \brief Error and flow logging control */ /*! \brief Error and flow logging control */
logging_state_t logging; logging_state_t logging;
}; };

View File

@ -65,6 +65,12 @@ enum
V22BIS_TX_TRAINING_STAGE_PARKED V22BIS_TX_TRAINING_STAGE_PARKED
}; };
#if defined(SPANDSP_USE_FIXED_POINTx)
extern const complexi16_t v22bis_constellation[16];
#else
extern const complexf_t v22bis_constellation[16];
#endif
/*! /*!
V.22bis modem descriptor. This defines the working state for a single instance V.22bis modem descriptor. This defines the working state for a single instance
of a V.22bis modem. of a V.22bis modem.
@ -93,10 +99,11 @@ struct v22bis_state_s
/* Receive section */ /* Receive section */
struct struct
{ {
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
int16_t rrc_filter[V22BIS_RX_FILTER_STEPS]; int16_t rrc_filter[V22BIS_RX_FILTER_STEPS];
#else #else
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
float rrc_filter[V22BIS_RX_FILTER_STEPS]; float rrc_filter[V22BIS_RX_FILTER_STEPS];
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
@ -156,7 +163,9 @@ struct v22bis_state_s
/*! \brief The equalizer signal buffer. */ /*! \brief The equalizer signal buffer. */
complexi_t eq_buf[V22BIS_EQUALIZER_MASK + 1]; complexi_t eq_buf[V22BIS_EQUALIZER_MASK + 1];
#else #else
/*! \brief The adaptive equalizer coefficients. */
complexf_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1]; complexf_t eq_coeff[2*V22BIS_EQUALIZER_LEN + 1];
/*! \brief The equalizer signal buffer. */
complexf_t eq_buf[V22BIS_EQUALIZER_MASK + 1]; complexf_t eq_buf[V22BIS_EQUALIZER_MASK + 1];
#endif #endif
/*! \brief Current offset into the equalizer buffer. */ /*! \brief Current offset into the equalizer buffer. */
@ -186,7 +195,7 @@ struct v22bis_state_s
/*! \brief The gain factor needed to achieve the specified output power. */ /*! \brief The gain factor needed to achieve the specified output power. */
float gain; float gain;
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */ /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
complexf_t rrc_filter[2*V22BIS_TX_FILTER_STEPS]; complexf_t rrc_filter[2*V22BIS_TX_FILTER_STEPS];
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step; int rrc_filter_step;

View File

@ -70,7 +70,7 @@ struct v27ter_rx_state_s
void *qam_user_data; void *qam_user_data;
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The scaling factor accessed by the AGC algorithm. */ /*! \brief The scaling factor assessed by the AGC algorithm. */
int16_t agc_scaling; int16_t agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */ /*! \brief The previous value of agc_scaling, needed to reuse old training. */
int16_t agc_scaling_save; int16_t agc_scaling_save;
@ -95,7 +95,7 @@ struct v27ter_rx_state_s
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */ /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
int16_t rrc_filter[V27TER_RX_FILTER_STEPS]; int16_t rrc_filter[V27TER_RX_FILTER_STEPS];
#else #else
/*! \brief The scaling factor accessed by the AGC algorithm. */ /*! \brief The scaling factor assessed by the AGC algorithm. */
float agc_scaling; float agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */ /*! \brief The previous value of agc_scaling, needed to reuse old training. */
float agc_scaling_save; float agc_scaling_save;

View File

@ -61,82 +61,8 @@ struct v29_rx_state_s
routine. */ routine. */
void *qam_user_data; void *qam_user_data;
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
int16_t rrc_filter[V29_RX_FILTER_STEPS]; /*! \brief The scaling factor assessed by the AGC algorithm. */
#else
float rrc_filter[V29_RX_FILTER_STEPS];
#endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step;
/*! \brief The register for the data scrambler. */
uint32_t scramble_reg;
/*! \brief The register for the training scrambler. */
uint8_t training_scramble_reg;
/*! \brief The current step in the table of CD constellation positions. */
int training_cd;
/*! \brief TRUE if the previous trained values are to be reused. */
int old_train;
/*! \brief The section of the training data we are currently in. */
int training_stage;
/*! \brief A count of how far through the current training step we are. */
int training_count;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */
int16_t last_sample;
/*! \brief >0 if a signal above the minimum is present. It may or may not be a V.29 signal. */
int signal_present;
/*! \brief Whether or not a carrier drop was detected and the signal delivery is pending. */
int carrier_drop_pending;
/*! \brief A count of the current consecutive samples below the carrier off threshold. */
int low_samples;
/*! \brief A highest magnitude sample seen. */
int16_t high_sample;
/*! \brief The position of the current symbol in the constellation, used for
differential decoding. */
int constellation_state;
/*! \brief The current phase of the carrier (i.e. the DDS parameter). */
uint32_t carrier_phase;
/*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */
int32_t carrier_phase_rate;
/*! \brief The carrier update rate saved for reuse when using short training. */
int32_t carrier_phase_rate_save;
#if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The proportional part of the carrier tracking filter. */
int32_t carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
int32_t carrier_track_i;
#else
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
#endif
/*! \brief A power meter, to measure the HPF'ed signal power in the channel. */
power_meter_t power;
/*! \brief The power meter level at which carrier on is declared. */
int32_t carrier_on_power;
/*! \brief The power meter level at which carrier off is declared. */
int32_t carrier_off_power;
/*! \brief Current read offset into the equalizer buffer. */
int eq_step;
/*! \brief Current write offset into the equalizer buffer. */
int eq_put_step;
/*! \brief Symbol counter to the next equalizer update. */
int eq_skip;
/*! \brief The current half of the baud. */
int baud_half;
#if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief The scaling factor accessed by the AGC algorithm. */
int16_t agc_scaling; int16_t agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */ /*! \brief The previous value of agc_scaling, needed to reuse old training. */
int16_t agc_scaling_save; int16_t agc_scaling_save;
@ -158,8 +84,19 @@ struct v29_rx_state_s
int32_t symbol_sync_dc_filter[2]; int32_t symbol_sync_dc_filter[2];
/*! Baud phase for symbol sync. */ /*! Baud phase for symbol sync. */
int32_t baud_phase; int32_t baud_phase;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */
int32_t carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
int32_t carrier_track_i;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
int16_t rrc_filter[V29_RX_FILTER_STEPS];
#else #else
/*! \brief The scaling factor accessed by the AGC algorithm. */ /*! \brief The scaling factor assessed by the AGC algorithm. */
float agc_scaling; float agc_scaling;
/*! \brief The previous value of agc_scaling, needed to reuse old training. */ /*! \brief The previous value of agc_scaling, needed to reuse old training. */
float agc_scaling_save; float agc_scaling_save;
@ -181,7 +118,67 @@ struct v29_rx_state_s
float symbol_sync_dc_filter[2]; float symbol_sync_dc_filter[2];
/*! Baud phase for symbol sync. */ /*! Baud phase for symbol sync. */
float baud_phase; float baud_phase;
/*! \brief A measure of how much mismatch there is between the real constellation,
and the decoded symbol positions. */
float training_error;
/*! \brief The proportional part of the carrier tracking filter. */
float carrier_track_p;
/*! \brief The integral part of the carrier tracking filter. */
float carrier_track_i;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
float rrc_filter[V29_RX_FILTER_STEPS];
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */
int rrc_filter_step;
/*! \brief The register for the data scrambler. */
uint32_t scramble_reg;
/*! \brief The register for the training scrambler. */
uint8_t training_scramble_reg;
/*! \brief The current step in the table of CD constellation positions. */
int training_cd;
/*! \brief TRUE if the previous trained values are to be reused. */
int old_train;
/*! \brief The section of the training data we are currently in. */
int training_stage;
/*! \brief A count of how far through the current training step we are. */
int training_count;
/*! \brief The value of the last signal sample, using the a simple HPF for signal power estimation. */
int16_t last_sample;
/*! \brief >0 if a signal above the minimum is present. It may or may not be a V.29 signal. */
int signal_present;
/*! \brief Whether or not a carrier drop was detected and the signal delivery is pending. */
int carrier_drop_pending;
/*! \brief A count of the current consecutive samples below the carrier off threshold. */
int low_samples;
/*! \brief A highest magnitude sample seen. */
int16_t high_sample;
/*! \brief The current phase of the carrier (i.e. the DDS parameter). */
uint32_t carrier_phase;
/*! \brief The update rate for the phase of the carrier (i.e. the DDS increment). */
int32_t carrier_phase_rate;
/*! \brief The carrier update rate saved for reuse when using short training. */
int32_t carrier_phase_rate_save;
/*! \brief A power meter, to measure the HPF'ed signal power in the channel. */
power_meter_t power;
/*! \brief The power meter level at which carrier on is declared. */
int32_t carrier_on_power;
/*! \brief The power meter level at which carrier off is declared. */
int32_t carrier_off_power;
/*! \brief Current read offset into the equalizer buffer. */
int eq_step;
/*! \brief Current write offset into the equalizer buffer. */
int eq_put_step;
/*! \brief Symbol counter to the next equalizer update. */
int eq_skip;
/*! \brief The current half of the baud. */
int baud_half;
/*! \brief The total symbol timing correction since the carrier came up. /*! \brief The total symbol timing correction since the carrier came up.
This is only for performance analysis purposes. */ This is only for performance analysis purposes. */
@ -191,6 +188,11 @@ struct v29_rx_state_s
int32_t start_angles[2]; int32_t start_angles[2];
/*! \brief History list of phase angles for the coarse carrier aquisition step. */ /*! \brief History list of phase angles for the coarse carrier aquisition step. */
int32_t angles[16]; int32_t angles[16];
/*! \brief The position of the current symbol in the constellation, used for
differential decoding. */
int constellation_state;
/*! \brief Error and flow logging control */ /*! \brief Error and flow logging control */
logging_state_t logging; logging_state_t logging;
}; };

View File

@ -47,21 +47,23 @@ struct v29_tx_state_s
/*! \brief A user specified opaque pointer passed to the status function. */ /*! \brief A user specified opaque pointer passed to the status function. */
void *status_user_data; void *status_user_data;
#if defined(SPANDSP_USE_FIXED_POINT)
/*! \brief Gain required to achieve the specified output power, not allowing /*! \brief Gain required to achieve the specified output power, not allowing
for the size of the current constellation. */ for the size of the current constellation. */
float base_gain; float base_gain;
/*! \brief Gain required to achieve the specified output power, allowing /*! \brief Gain required to achieve the specified output power, allowing
for the size of the current constellation. */ for the size of the current constellation. */
#if defined(SPANDSP_USE_FIXED_POINT)
int32_t gain; int32_t gain;
#else /*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
float gain;
#endif
/*! \brief The route raised cosine (RRC) pulse shaping filter buffer. */
#if defined(SPANDSP_USE_FIXED_POINT)
complexi16_t rrc_filter[2*V29_TX_FILTER_STEPS]; complexi16_t rrc_filter[2*V29_TX_FILTER_STEPS];
#else #else
/*! \brief Gain required to achieve the specified output power, not allowing
for the size of the current constellation. */
float base_gain;
/*! \brief Gain required to achieve the specified output power, allowing
for the size of the current constellation. */
float gain;
/*! \brief The root raised cosine (RRC) pulse shaping filter buffer. */
complexf_t rrc_filter[2*V29_TX_FILTER_STEPS]; complexf_t rrc_filter[2*V29_TX_FILTER_STEPS];
#endif #endif
/*! \brief Current offset into the RRC pulse shaping filter buffer. */ /*! \brief Current offset into the RRC pulse shaping filter buffer. */

View File

@ -293,7 +293,7 @@ SPAN_DECLARE_NONSTD(int) v17_rx_fillin(v17_rx_state_t *s, int len);
\param coeffs The vector of complex coefficients. \param coeffs The vector of complex coefficients.
\return The number of coefficients in the vector. */ \return The number of coefficients in the vector. */
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
SPAN_DECLARE(int) v17_rx_equalizer_state(v17_rx_state_t *s, complexi_t **coeffs); SPAN_DECLARE(int) v17_rx_equalizer_state(v17_rx_state_t *s, complexi16_t **coeffs);
#else #else
SPAN_DECLARE(int) v17_rx_equalizer_state(v17_rx_state_t *s, complexf_t **coeffs); SPAN_DECLARE(int) v17_rx_equalizer_state(v17_rx_state_t *s, complexf_t **coeffs);
#endif #endif

View File

@ -61,8 +61,6 @@ enum
*/ */
typedef struct v22bis_state_s v22bis_state_t; typedef struct v22bis_state_s v22bis_state_t;
extern const complexf_t v22bis_constellation[16];
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" extern "C"
{ {
@ -88,7 +86,11 @@ SPAN_DECLARE_NONSTD(int) v22bis_rx_fillin(v22bis_state_t *s, int len);
\brief Get a snapshot of the current equalizer coefficients. \brief Get a snapshot of the current equalizer coefficients.
\param coeffs The vector of complex coefficients. \param coeffs The vector of complex coefficients.
\return The number of coefficients in the vector. */ \return The number of coefficients in the vector. */
#if defined(SPANDSP_USE_FIXED_POINTx)
SPAN_DECLARE(int) v22bis_rx_equalizer_state(v22bis_state_t *s, complexi16_t **coeffs);
#else
SPAN_DECLARE(int) v22bis_rx_equalizer_state(v22bis_state_t *s, complexf_t **coeffs); SPAN_DECLARE(int) v22bis_rx_equalizer_state(v22bis_state_t *s, complexf_t **coeffs);
#endif
/*! Get the current received carrier frequency. /*! Get the current received carrier frequency.
\param s The modem context. \param s The modem context.

View File

@ -126,7 +126,11 @@ SPAN_DECLARE_NONSTD(int) v27ter_rx_fillin(v27ter_rx_state_t *s, int len);
\brief Get a snapshot of the current equalizer coefficients. \brief Get a snapshot of the current equalizer coefficients.
\param coeffs The vector of complex coefficients. \param coeffs The vector of complex coefficients.
\return The number of coefficients in the vector. */ \return The number of coefficients in the vector. */
#if defined(SPANDSP_USE_FIXED_POINTx)
SPAN_DECLARE(int) v27ter_rx_equalizer_state(v27ter_rx_state_t *s, complexi16_t **coeffs);
#else
SPAN_DECLARE(int) v27ter_rx_equalizer_state(v27ter_rx_state_t *s, complexf_t **coeffs); SPAN_DECLARE(int) v27ter_rx_equalizer_state(v27ter_rx_state_t *s, complexf_t **coeffs);
#endif
/*! Get the current received carrier frequency. /*! Get the current received carrier frequency.
\param s The modem context. \param s The modem context.

View File

@ -118,7 +118,11 @@ scrambler register) cannot be trusted for the test. The receive modem,
therefore, only tests that bits starting at bit 24 are really ones. therefore, only tests that bits starting at bit 24 are really ones.
*/ */
#if defined(SPANDSP_USE_FIXED_POINTx)
typedef void (*qam_report_handler_t)(void *user_data, const complexi16_t *constel, const complexi16_t *target, int symbol);
#else
typedef void (*qam_report_handler_t)(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol); typedef void (*qam_report_handler_t)(void *user_data, const complexf_t *constel, const complexf_t *target, int symbol);
#endif
/*! /*!
V.29 modem receive side descriptor. This defines the working state for a V.29 modem receive side descriptor. This defines the working state for a

View File

@ -5633,7 +5633,7 @@ SPAN_DECLARE(int) t30_non_ecm_get_chunk(void *user_data, uint8_t buf[], int max_
break; break;
default: default:
span_log(&s->logging, SPAN_LOG_WARNING, "t30_non_ecm_get_chunk in bad state %d\n", s->state); span_log(&s->logging, SPAN_LOG_WARNING, "t30_non_ecm_get_chunk in bad state %d\n", s->state);
len = 0; len = -1;
break; break;
} }
return len; return len;

View File

@ -724,13 +724,21 @@ static int stream_non_ecm(t31_state_t *s)
case T38_TIMED_STEP_NON_ECM_MODEM: case T38_TIMED_STEP_NON_ECM_MODEM:
/* Create a 75ms silence */ /* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL) if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL); {
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
{
/* ???????? */
}
}
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2; fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2;
fe->next_tx_samples = fe->samples; fe->next_tx_samples = fe->samples;
break; break;
case T38_TIMED_STEP_NON_ECM_MODEM_2: case T38_TIMED_STEP_NON_ECM_MODEM_2:
/* Switch on a fast modem, and give the training time to complete */ /* Switch on a fast modem, and give the training time to complete */
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator); if ((delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3; fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
break; break;
case T38_TIMED_STEP_NON_ECM_MODEM_3: case T38_TIMED_STEP_NON_ECM_MODEM_3:
@ -762,12 +770,18 @@ static int stream_non_ecm(t31_state_t *s)
else else
{ {
/* If we are sending quickly there seems no point in doing any padding */ /* 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, T38_PACKET_CATEGORY_IMAGE_DATA_END); if (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) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5; fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
delay = 0; delay = 0;
} }
} }
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA); if (t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA) < 0)
{
/* ???????? */
}
delay = bits_to_us(s, 8*len); delay = bits_to_us(s, 8*len);
break; break;
case T38_TIMED_STEP_NON_ECM_MODEM_4: case T38_TIMED_STEP_NON_ECM_MODEM_4:
@ -778,7 +792,10 @@ static int stream_non_ecm(t31_state_t *s)
{ {
len += fe->non_ecm_trailer_bytes; len += fe->non_ecm_trailer_bytes;
memset(buf, 0, len); memset(buf, 0, len);
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); if (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) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5; 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 /* Allow a bit more time than the data will take to play out, to ensure the far ATA does not
cut things short. */ cut things short. */
@ -789,13 +806,19 @@ static int stream_non_ecm(t31_state_t *s)
break; break;
} }
memset(buf, 0, len); memset(buf, 0, len);
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA); if (t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA) < 0)
{
/* ???????? */
}
delay = bits_to_us(s, 8*len); delay = bits_to_us(s, 8*len);
break; break;
case T38_TIMED_STEP_NON_ECM_MODEM_5: 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 /* 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. */ seems like it can improve compatibility with quirky implementations. */
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL); if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_NONE; fe->timed_step = T38_TIMED_STEP_NONE;
return delay; return delay;
} }
@ -822,13 +845,21 @@ static int stream_hdlc(t31_state_t *s)
case T38_TIMED_STEP_HDLC_MODEM: case T38_TIMED_STEP_HDLC_MODEM:
/* Create a 75ms silence */ /* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL) if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL); {
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
{
/* ???????? */
}
}
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2;
fe->next_tx_samples = fe->samples + ms_to_samples(75); fe->next_tx_samples = fe->samples + ms_to_samples(75);
break; break;
case T38_TIMED_STEP_HDLC_MODEM_2: case T38_TIMED_STEP_HDLC_MODEM_2:
/* Send HDLC preambling */ /* Send HDLC preambling */
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator); if ((delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)) < 0)
{
/* ???????? */
}
delay += t38_core_send_flags_delay(&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); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
@ -864,7 +895,10 @@ static int stream_hdlc(t31_state_t *s)
data_fields[1].field = NULL; data_fields[1].field = NULL;
data_fields[1].field_len = 0; data_fields[1].field_len = 0;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END; 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); if (t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations /* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */ the carrier falling too abruptly causes data loss. */
@ -880,7 +914,10 @@ static int stream_hdlc(t31_state_t *s)
data_fields[1].field = NULL; data_fields[1].field = NULL;
data_fields[1].field_len = 0; data_fields[1].field_len = 0;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA; 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); if (t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
delay = bits_to_us(s, i*8 + fe->hdlc_tx.extra_bits); delay = bits_to_us(s, i*8 + fe->hdlc_tx.extra_bits);
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
@ -888,14 +925,20 @@ static int stream_hdlc(t31_state_t *s)
break; break;
} }
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA; 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); if (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) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
} }
else else
{ {
i = fe->octets_per_data_packet; 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; 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); if (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) < 0)
{
/* ???????? */
}
s->hdlc_tx.ptr += i; s->hdlc_tx.ptr += i;
} }
delay = bits_to_us(s, i*8); delay = bits_to_us(s, i*8);
@ -911,7 +954,10 @@ static int stream_hdlc(t31_state_t *s)
s->hdlc_tx.len = 0; s->hdlc_tx.len = 0;
s->hdlc_tx.final = FALSE; s->hdlc_tx.final = FALSE;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA; 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); if (t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations /* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */ the carrier falling too abruptly causes data loss. */
@ -923,7 +969,10 @@ static int stream_hdlc(t31_state_t *s)
} }
/* Finish the current frame off, and prepare for the next one. */ /* Finish the current frame off, and prepare for the next one. */
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA; 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); if (t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3; fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT); 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. */ /* We should now wait enough time for everything to clear through an analogue modem at the far end. */
@ -935,8 +984,14 @@ static int stream_hdlc(t31_state_t *s)
/* Note that some boxes do not like us sending a T38_FIELD_HDLC_SIG_END at this point. /* 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. */ A T38_IND_NO_SIGNAL should always be OK. */
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END; 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); if (t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, category) < 0)
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL); {
/* ???????? */
}
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
{
/* ???????? */
}
fe->timed_step = T38_TIMED_STEP_NONE; fe->timed_step = T38_TIMED_STEP_NONE;
at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK); at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND); t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
@ -963,14 +1018,20 @@ static int stream_ced(t31_state_t *s)
of silence, starting the delay with a no signal indication makes sense. of silence, starting the delay with a no signal indication makes sense.
We do need a 200ms delay, as that is a specification requirement. */ We do need a 200ms delay, as that is a specification requirement. */
fe->timed_step = T38_TIMED_STEP_CED_2; fe->timed_step = T38_TIMED_STEP_CED_2;
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL); if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
{
/* ???????? */
}
delay = 200000; delay = 200000;
fe->next_tx_samples = fe->samples; fe->next_tx_samples = fe->samples;
break; break;
case T38_TIMED_STEP_CED_2: case T38_TIMED_STEP_CED_2:
/* Initial 200ms delay over. Send the CED indicator */ /* Initial 200ms delay over. Send the CED indicator */
fe->timed_step = T38_TIMED_STEP_CED_3; fe->timed_step = T38_TIMED_STEP_CED_3;
delay = t38_core_send_indicator(&fe->t38, T38_IND_CED); if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_CED)) < 0)
{
/* ???????? */
}
fe->current_tx_data_type = T38_DATA_NONE; fe->current_tx_data_type = T38_DATA_NONE;
break; break;
case T38_TIMED_STEP_CED_3: case T38_TIMED_STEP_CED_3:
@ -1000,7 +1061,10 @@ static int stream_cng(t31_state_t *s)
be sending 200ms of silence, according to T.30, starting that delay with be sending 200ms of silence, according to T.30, starting that delay with
a no signal indication makes sense. */ a no signal indication makes sense. */
fe->timed_step = T38_TIMED_STEP_CNG_2; fe->timed_step = T38_TIMED_STEP_CNG_2;
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL); if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
{
/* ???????? */
}
delay = 200000; delay = 200000;
fe->next_tx_samples = fe->samples; fe->next_tx_samples = fe->samples;
break; break;
@ -1009,7 +1073,10 @@ static int stream_cng(t31_state_t *s)
coming the other way interrupts it, or a long timeout controlled by the T.30 engine coming the other way interrupts it, or a long timeout controlled by the T.30 engine
expires. */ expires. */
fe->timed_step = T38_TIMED_STEP_NONE; fe->timed_step = T38_TIMED_STEP_NONE;
delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG); if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG)) < 0)
{
/* ???????? */
}
fe->current_tx_data_type = T38_DATA_NONE; fe->current_tx_data_type = T38_DATA_NONE;
return delay; return delay;
} }
@ -1775,7 +1842,10 @@ static int restart_modem(t31_state_t *s, int new_modem)
case FAX_MODEM_SILENCE_TX: case FAX_MODEM_SILENCE_TX:
if (s->t38_mode) if (s->t38_mode)
{ {
t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL); if (t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL) < 0)
{
/* ???????? */
}
s->t38_fe.next_tx_samples = s->t38_fe.samples + ms_to_samples(700); 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.timed_step = T38_TIMED_STEP_PAUSE;
s->t38_fe.current_tx_data_type = T38_DATA_NONE; s->t38_fe.current_tx_data_type = T38_DATA_NONE;
@ -1802,7 +1872,10 @@ static int restart_modem(t31_state_t *s, int new_modem)
/* Send 200ms of silence to "push" the last audio out */ /* Send 200ms of silence to "push" the last audio out */
if (s->t38_mode) if (s->t38_mode)
{ {
t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL); if (t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL) < 0)
{
/* ???????? */
}
} }
else else
{ {

View File

@ -81,10 +81,6 @@
#include "faxfont.h" #include "faxfont.h"
#ifndef UINT32_MAX
#define UINT32_MAX 0xffffffff
#endif
/*! The number of centimetres in one inch */ /*! The number of centimetres in one inch */
#define CM_PER_INCH 2.54f #define CM_PER_INCH 2.54f

View File

@ -46,10 +46,6 @@
#include "spandsp/private/t81_t82_arith_coding.h" #include "spandsp/private/t81_t82_arith_coding.h"
#include "spandsp/private/t85.h" #include "spandsp/private/t85.h"
#ifndef UINT32_MAX
#define UINT32_MAX 0xffffffff
#endif
/* Image length update status */ /* Image length update status */
enum enum
{ {