spandsp 0.0.6
t31.c File Reference
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <time.h>
#include <memory.h>
#include <string.h>
#include <ctype.h>
#include "floating_fudge.h"
#include <assert.h>
#include <tiffio.h>
#include "spandsp/telephony.h"
#include "spandsp/logging.h"
#include "spandsp/bit_operations.h"
#include "spandsp/bitstream.h"
#include "spandsp/dc_restore.h"
#include "spandsp/queue.h"
#include "spandsp/power_meter.h"
#include "spandsp/complex.h"
#include "spandsp/tone_detect.h"
#include "spandsp/tone_generate.h"
#include "spandsp/async.h"
#include "spandsp/crc.h"
#include "spandsp/hdlc.h"
#include "spandsp/silence_gen.h"
#include "spandsp/super_tone_rx.h"
#include "spandsp/fsk.h"
#include "spandsp/modem_connect_tones.h"
#include "spandsp/v8.h"
#include "spandsp/v29tx.h"
#include "spandsp/v29rx.h"
#include "spandsp/v27ter_tx.h"
#include "spandsp/v27ter_rx.h"
#include "spandsp/v17tx.h"
#include "spandsp/v17rx.h"
#include "spandsp/timezone.h"
#include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h"
#include "spandsp/t30.h"
#include "spandsp/t30_logging.h"
#include "spandsp/t38_core.h"
#include "spandsp/at_interpreter.h"
#include "spandsp/fax_modems.h"
#include "spandsp/t31.h"
#include "spandsp/t30_fcf.h"
#include "spandsp/private/logging.h"
#include "spandsp/private/bitstream.h"
#include "spandsp/private/t38_core.h"
#include "spandsp/private/silence_gen.h"
#include "spandsp/private/fsk.h"
#include "spandsp/private/modem_connect_tones.h"
#include "spandsp/private/v8.h"
#include "spandsp/private/v17tx.h"
#include "spandsp/private/v17rx.h"
#include "spandsp/private/v27ter_tx.h"
#include "spandsp/private/v27ter_rx.h"
#include "spandsp/private/v29tx.h"
#include "spandsp/private/v29rx.h"
#include "spandsp/private/hdlc.h"
#include "spandsp/private/fax_modems.h"
#include "spandsp/private/at_interpreter.h"
#include "spandsp/private/t31.h"

Macros

#define MS_PER_TX_CHUNK   30
#define INDICATOR_TX_COUNT   3
#define DATA_TX_COUNT   1
#define DATA_END_TX_COUNT   3
#define DEFAULT_DTE_TIMEOUT   5
#define MAX_OCTETS_PER_UNPACED_CHUNK   300
#define MID_RX_TIMEOUT   15000
#define HDLC_FRAMING_OK_THRESHOLD   5

Typedefs

typedef const char *(* at_cmd_service_t) (t31_state_t *s, const char *cmd)

Enumerations

enum  { ETX = 0x03 , DLE = 0x10 , SUB = 0x1A }
enum  {
  DISBIT1 = 0x01 , DISBIT2 = 0x02 , DISBIT3 = 0x04 , DISBIT4 = 0x08 ,
  DISBIT5 = 0x10 , DISBIT6 = 0x20 , DISBIT7 = 0x40 , DISBIT8 = 0x80
}
enum  { T38_CHUNKING_MERGE_FCS_WITH_DATA = 0x0001 , T38_CHUNKING_WHOLE_FRAMES = 0x0002 , T38_CHUNKING_ALLOW_TEP_TIME = 0x0004 }
enum  {
  T38_TIMED_STEP_NONE = 0 , T38_TIMED_STEP_NON_ECM_MODEM = 0x10 , T38_TIMED_STEP_NON_ECM_MODEM_2 = 0x11 , T38_TIMED_STEP_NON_ECM_MODEM_3 = 0x12 ,
  T38_TIMED_STEP_NON_ECM_MODEM_4 = 0x13 , T38_TIMED_STEP_NON_ECM_MODEM_5 = 0x14 , T38_TIMED_STEP_HDLC_MODEM = 0x20 , T38_TIMED_STEP_HDLC_MODEM_2 = 0x21 ,
  T38_TIMED_STEP_HDLC_MODEM_3 = 0x22 , T38_TIMED_STEP_HDLC_MODEM_4 = 0x23 , T38_TIMED_STEP_HDLC_MODEM_5 = 0x24 , T38_TIMED_STEP_FAKE_HDLC_MODEM = 0x30 ,
  T38_TIMED_STEP_FAKE_HDLC_MODEM_2 = 0x31 , T38_TIMED_STEP_FAKE_HDLC_MODEM_3 = 0x32 , T38_TIMED_STEP_FAKE_HDLC_MODEM_4 = 0x33 , T38_TIMED_STEP_FAKE_HDLC_MODEM_5 = 0x34 ,
  T38_TIMED_STEP_CED = 0x40 , T38_TIMED_STEP_CED_2 = 0x41 , T38_TIMED_STEP_CED_3 = 0x42 , T38_TIMED_STEP_CNG = 0x50 ,
  T38_TIMED_STEP_CNG_2 = 0x51 , T38_TIMED_STEP_PAUSE = 0x60
}

Functions

int t31_t38_send_timeout (t31_state_t *s, int samples)
void t31_call_event (t31_state_t *s, int event)
int t31_at_rx (t31_state_t *s, const char *t, int len)
int t31_rx (t31_state_t *s, int16_t amp[], int len)
int t31_rx_fillin (t31_state_t *s, int len)
int t31_tx (t31_state_t *s, int16_t amp[], int max_len)
void t31_set_transmit_on_idle (t31_state_t *s, int transmit_on_idle)
 Select whether silent audio will be sent when transmit is idle.
void t31_set_tep_mode (t31_state_t *s, int use_tep)
 Select whether TEP mode will be used.
void t31_set_t38_config (t31_state_t *s, int without_pacing)
 Select whether T.38 data will be paced.
void t31_set_mode (t31_state_t *s, int t38_mode)
logging_state_tt31_get_logging_state (t31_state_t *s)
 Get a pointer to the logging context associated with a T.31 context.
t38_core_state_tt31_get_t38_core_state (t31_state_t *s)
t31_state_tt31_init (t31_state_t *s, at_tx_handler_t *at_tx_handler, void *at_tx_user_data, t31_modem_control_handler_t *modem_control_handler, void *modem_control_user_data, t38_tx_packet_handler_t *tx_t38_packet_handler, void *tx_t38_packet_user_data)
 Initialise a T.31 context.
int t31_release (t31_state_t *s)
 Release a T.31 context.
int t31_free (t31_state_t *s)
 Release a T.31 context.

Macro Definition Documentation

◆ DATA_END_TX_COUNT

#define DATA_END_TX_COUNT   3

The number of transmissions of terminating data IFP packets

Referenced by t31_set_t38_config(), and t38_terminal_set_config().

◆ DATA_TX_COUNT

#define DATA_TX_COUNT   1

The number of transmissions of data IFP packets

Referenced by t31_set_t38_config(), and t38_terminal_set_config().

◆ DEFAULT_DTE_TIMEOUT

#define DEFAULT_DTE_TIMEOUT   5

The default DTE timeout, in seconds

Referenced by t31_init().

◆ INDICATOR_TX_COUNT

#define INDICATOR_TX_COUNT   3

The number of transmissions of indicator IFP packets

Referenced by t31_set_t38_config(), and t38_terminal_set_config().

◆ MS_PER_TX_CHUNK

#define MS_PER_TX_CHUNK   30

The default number of milliseconds per transmitted IFP when sending bulk T.38 data

Referenced by t31_set_t38_config().

Function Documentation

◆ t31_free()

int t31_free ( t31_state_t * s)

Release a T.31 context.

Free a T.31 context.

Parameters
sThe T.31 context.
Returns
0 for OK

References t31_release().

◆ t31_get_logging_state()

logging_state_t * t31_get_logging_state ( t31_state_t * s)

Get a pointer to the logging context associated with a T.31 context.

Get a pointer to the logging context associated with a T.31 context.

Parameters
sThe T.31 context.
Returns
A pointer to the logging context, or NULL.

References t31_state_s::logging.

◆ t31_init()

t31_state_t * t31_init ( t31_state_t * s,
at_tx_handler_t * at_tx_handler,
void * at_tx_user_data,
t31_modem_control_handler_t * modem_control_handler,
void * modem_control_user_data,
t38_tx_packet_handler_t * tx_t38_packet_handler,
void * tx_t38_packet_user_data )

Initialise a T.31 context.

Initialise a T.31 context. This must be called before the first use of the context, to initialise its contents.

Parameters
sThe T.31 context.
at_tx_handlerA callback routine to handle AT interpreter channel output.
at_tx_user_dataAn opaque pointer passed in called to at_tx_handler.
modem_control_handlerA callback routine to handle control of the modem (off-hook, etc).
modem_control_user_dataAn opaque pointer passed in called to modem_control_handler.
tx_t38_packet_handler???
tx_t38_packet_user_data???
Returns
A pointer to the T.31 context.

References at_init(), t31_state_s::call_samples, DEFAULT_DTE_TIMEOUT, at_state_s::dte_inactivity_timeout, t31_audio_front_end_state_t::last_sample, t31_state_s::logging, t31_state_s::modem, MODEM_CONNECT_TONES_ANSAM_PR, power_meter_init(), power_meter_level_dbm0(), queue_init(), QUEUE_READ_ATOMIC, QUEUE_WRITE_ATOMIC, t31_audio_front_end_state_t::rx_power, at_state_s::rx_signal_present, at_state_s::rx_trained, t31_state_s::silence_awaited, t31_audio_front_end_state_t::silence_heard, t31_audio_front_end_state_t::silence_threshold_power, t31_set_t38_config(), t31_state_s::t38_mode, and v8_init().

◆ t31_release()

int t31_release ( t31_state_t * s)

Release a T.31 context.

Release a T.31 context.

Parameters
sThe T.31 context.
Returns
0 for OK

Referenced by t31_free().

◆ t31_set_t38_config()

void t31_set_t38_config ( t31_state_t * s,
int without_pacing )

Select whether T.38 data will be paced.

Select whether T.38 data will be paced as it is transmitted.

Parameters
sThe T.31 modem context.
without_pacingTRUE if data is to be sent as fast as possible. FALSE if it is to be paced.

References DATA_END_TX_COUNT, DATA_TX_COUNT, INDICATOR_TX_COUNT, MS_PER_TX_CHUNK, t31_t38_front_end_state_t::ms_per_tx_chunk, t31_t38_front_end_state_t::t38, T38_PACKET_CATEGORY_CONTROL_DATA, T38_PACKET_CATEGORY_CONTROL_DATA_END, T38_PACKET_CATEGORY_IMAGE_DATA, T38_PACKET_CATEGORY_IMAGE_DATA_END, T38_PACKET_CATEGORY_INDICATOR, and t38_set_redundancy_control().

Referenced by t31_init().

◆ t31_set_tep_mode()

void t31_set_tep_mode ( t31_state_t * s,
int use_tep )

Select whether TEP mode will be used.

Select whether TEP mode will be used (or time allowed for it (when transmitting).

Parameters
sThe T.31 modem context.
use_tepTRUE if TEP is to be ised.

References fax_modems_state_s::use_tep.

◆ t31_set_transmit_on_idle()

void t31_set_transmit_on_idle ( t31_state_t * s,
int transmit_on_idle )

Select whether silent audio will be sent when transmit is idle.

Select whether silent audio will be sent when transmit is idle.

Parameters
sThe T.31 modem context.
transmit_on_idleTRUE if silent audio should be output when the transmitter is idle. FALSE to transmit zero length audio when the transmitter is idle. The default behaviour is FALSE.

References fax_modems_state_s::transmit_on_idle.