diff options
Diffstat (limited to 'src/ss5/ss5.h')
-rw-r--r-- | src/ss5/ss5.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/ss5/ss5.h b/src/ss5/ss5.h new file mode 100644 index 0000000..91acdc9 --- /dev/null +++ b/src/ss5/ss5.h @@ -0,0 +1,85 @@ + +#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 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); + |