#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/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/fsk.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/super_tone_rx.h"
#include "spandsp/modem_connect_tones.h"
#include "spandsp/t4.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/t38_core.h"
#include "spandsp/private/silence_gen.h"
#include "spandsp/private/fsk.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/modem_connect_tones.h"
#include "spandsp/private/hdlc.h"
#include "spandsp/private/fax_modems.h"
#include "spandsp/private/at_interpreter.h"
#include "spandsp/private/t31.h"
Defines | |
#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) |
Process a block of received T.31 modem audio samples. | |
int | t31_rx_fillin (t31_state_t *s, int len) |
Fake processing of a missing block of received T.31 modem audio samples. | |
int | t31_tx (t31_state_t *s, int16_t amp[], int max_len) |
Generate a block of T.31 modem audio samples. | |
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_t * | t31_get_logging_state (t31_state_t *s) |
Get a pointer to the logging context associated with a T.31 context. | |
t38_core_state_t * | t31_get_t38_core_state (t31_state_t *s) |
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. | |
int | t31_release (t31_state_t *s) |
Release a T.31 context. | |
int | t31_free (t31_state_t *s) |
Release a T.31 context. |
#define DATA_END_TX_COUNT 3 |
The number of transmissions of terminating data IFP packets
Referenced by t31_set_t38_config().
#define DATA_TX_COUNT 1 |
The number of transmissions of data IFP packets
Referenced by t31_set_t38_config().
#define DEFAULT_DTE_TIMEOUT 5 |
The default DTE timeout, in seconds
Referenced by t31_init().
#define INDICATOR_TX_COUNT 3 |
The number of transmissions of indicator IFP packets
Referenced by t31_set_t38_config().
#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().
int t31_free | ( | t31_state_t * | s | ) |
Release a T.31 context.
Free a T.31 context.
s | The T.31 context. |
References t31_release().
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.
s | The T.31 context. |
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.
s | The T.31 context. | |
at_tx_handler | A callback routine to handle AT interpreter channel output. | |
at_tx_user_data | An opaque pointer passed in called to at_tx_handler. | |
modem_control_handler | A callback routine to handle control of the modem (off-hook, etc). | |
modem_control_user_data | An opaque pointer passed in called to modem_control_handler. | |
tx_t38_packet_handler | ??? | |
tx_t38_packet_user_data | ??? |
References at_init(), DEFAULT_DTE_TIMEOUT, power_meter_init(), power_meter_level_dbm0(), queue_init(), QUEUE_READ_ATOMIC, QUEUE_WRITE_ATOMIC, and t31_set_t38_config().
int t31_release | ( | t31_state_t * | s | ) |
Release a T.31 context.
Release a T.31 context.
s | The T.31 context. |
Referenced by t31_free().
int t31_rx | ( | t31_state_t * | s, | |
int16_t | amp[], | |||
int | len | |||
) |
Process a block of received T.31 modem audio samples.
Process a block of received T.31 modem audio samples.
s | The T.31 modem context. | |
amp | The audio sample buffer. | |
len | The number of samples in the buffer. |
References ms_to_samples, and power_meter_update().
int t31_rx_fillin | ( | t31_state_t * | s, | |
int | len | |||
) |
Fake processing of a missing block of received T.31 modem audio samples.
Fake processing of a missing block of received T.31 modem audio samples (e.g due to packet loss).
s | The T.31 modem context. | |
len | The number of samples to fake. |
References fsk_rx_fillin(), v17_rx_fillin(), v27ter_rx_fillin(), and v29_rx_fillin().
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.
s | The T.31 modem context. | |
without_pacing | TRUE 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, and MS_PER_TX_CHUNK.
Referenced by t31_init().
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).
s | The T.31 modem context. | |
use_tep | TRUE if TEP is to be ised. |
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.
s | The T.31 modem context. | |
transmit_on_idle | TRUE 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. |
int t31_tx | ( | t31_state_t * | s, | |
int16_t | amp[], | |||
int | max_len | |||
) |
Generate a block of T.31 modem audio samples.
Generate a block of T.31 modem audio samples.
s | The T.31 modem context. | |
amp | The audio sample buffer. | |
max_len | The number of samples to be generated. |