summaryrefslogtreecommitdiffstats
path: root/src/ss5/ss5.h
blob: 91acdc9c3faa12192c87ad6529d4e45c72a62ee0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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);