86 lines
3.7 KiB
C
86 lines
3.7 KiB
C
|
|
#include "../libtimer/timer.h"
|
|
#include "../libosmocc/endpoint.h"
|
|
#include "../libosmocc/helper.h"
|
|
#include "../libsample/sample.h"
|
|
#include "../libjitter/jitter.h"
|
|
#include "mf.h"
|
|
#include "dsp.h"
|
|
|
|
enum ss5_state {
|
|
SS5_STATE_NULL = 0,
|
|
/* idle line */
|
|
SS5_STATE_IDLE,
|
|
/* outgoing call */
|
|
SS5_STATE_SEND_SEIZE, /* sending seize, waiting for proceed-to-send */
|
|
SS5_STATE_RECV_PROCEED, /* detected proceed-to-send, waiting to cease */
|
|
SS5_STATE_SEND_DIGITS, /* proceed-to-send is ceased, sending digits */
|
|
SS5_STATE_OUT_INACTIVE, /* waiting for called party to answer or being busy */
|
|
SS5_STATE_SEND_ACK_ANS, /* detected answer, sending acknowledge, waiting to cease */
|
|
SS5_STATE_SEND_ACK_BUS, /* detected busy-flash, sending acknowledge, waiting to cease */
|
|
SS5_STATE_SEND_ACK_CLR, /* detected clear-back, sending acknowledge, waiting to cease */
|
|
SS5_STATE_OUT_ACTIVE, /* detected answer is ceased */
|
|
SS5_STATE_SEND_CLR_FWD, /* sending clear-forward, waiting for release-guard */
|
|
SS5_STATE_RECV_RELEASE, /* receiving release-guard, waiting to cease */
|
|
SS5_STATE_SEND_FORWARD, /* sending forward-transfer for a while */
|
|
/* incoming call */
|
|
SS5_STATE_SEND_PROCEED, /* detected seize, sending procced-to-send, waiting to cease */
|
|
SS5_STATE_RECV_DIGIT, /* seize is ceased, waiting for digits */
|
|
SS5_STATE_RECV_SPACE, /* digit received, waiting to cease */
|
|
SS5_STATE_IN_INACTIVE, /* waiting for called party to answer or disconnect */
|
|
SS5_STATE_SEND_ANSWER, /* sending answer, waiting for for acknowledge */
|
|
SS5_STATE_IN_ACTIVE, /* detected acknowledge of answer */
|
|
SS5_STATE_SEND_BUSY, /* sending busy-flash, waiting for acknowledge */
|
|
SS5_STATE_SEND_CLR_BAK, /* sending clear back (hangup) */
|
|
SS5_STATE_SEND_RELEASE, /* detected clear-forward, sending release-guard, waiting for cease */
|
|
SS5_STATE_SEND_REL_WAIT,/* clear forward ceased, but waiting to prevent blueboxing */
|
|
/* seize collision */
|
|
SS5_STATE_DOUBLE_SEIZE, /* seize is detected, sending for while, waiting for cease */
|
|
};
|
|
|
|
extern const char *ss5_state_names[];
|
|
|
|
struct ss5_endpoint;
|
|
|
|
/* SS5 link definition */
|
|
typedef struct ss5 {
|
|
struct ss5 *next;
|
|
struct ss5_endpoint *ss5_ep;
|
|
char name[32]; /* name of link for debugging */
|
|
|
|
/* call states */
|
|
enum ss5_state state; /* state of link */
|
|
struct timer timer; /* for several timeouts */
|
|
uint32_t cc_callref; /* ref to CC call */
|
|
osmo_cc_session_t *cc_session; /* audio session description */
|
|
osmo_cc_session_codec_t *codec; /* selected codec */
|
|
char callerid[65]; /* current caller id (outgoing only) */
|
|
char dialing[33]; /* current dial string (send or receive) */
|
|
|
|
/* audio processing */
|
|
jitter_t tx_dejitter; /* jitter buffer for audio from CC */
|
|
dsp_t dsp; /* all dsp processing */
|
|
sample_t *delay_buffer; /* buffer for delaying audio */
|
|
int delay_length;
|
|
int delay_index;
|
|
} ss5_t;
|
|
|
|
/* SS5 endpoint definition */
|
|
typedef struct ss5_endpoint {
|
|
osmo_cc_endpoint_t cc_ep;
|
|
ss5_t *link_list;
|
|
double samplerate;
|
|
int suppress_disconnect; /* do not forward disconnect towards CC */
|
|
int prevent_blueboxing; /* extend release-guard, so outgoing exchange releases */
|
|
int crosstalk; /* mix crosstalk from TX to RX */
|
|
int comfort_noise; /* add comfort noise before answer and after disconnect */
|
|
int delay_ms; /* add delay to simulate long distance lines */
|
|
double sense_db; /* increase sensitivity of decoder by this value */
|
|
} ss5_endpoint_t;
|
|
|
|
void refresh_status(void);
|
|
ss5_endpoint_t *ss5_ep_create(const char *ep_name, int links, int prevent_blueboxing, int crosstalk, int delay_ms, int comfort_noise, int suppress_disconnect, double sense_db);
|
|
void ss5_ep_destroy(ss5_endpoint_t *ss5_ep);
|
|
void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg);
|
|
|