Various tweaks to spandsp. Cleaned up a few MSVC issues with spandsp
This commit is contained in:
parent
682fb58bd5
commit
12aec908bb
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue