#include "../libtimer/timer.h" #include "../libosmocc/endpoint.h" #include "../libsample/sample.h" #include "../libsamplerate/samplerate.h" #include "../libjitter/jitter.h" enum call_state { CALL_STATE_IDLE = 0, /* no call */ CALL_STATE_IN_SETUP, /* incoming connection */ CALL_STATE_OUT_SETUP, /* outgoing connection */ CALL_STATE_IN_OVERLAP, /* more informatiopn needed */ CALL_STATE_OUT_OVERLAP, /* more informatiopn needed */ CALL_STATE_IN_PROCEEDING,/* call is proceeding */ CALL_STATE_OUT_PROCEEDING,/* call is proceeding */ CALL_STATE_IN_ALERTING, /* call is ringing */ CALL_STATE_OUT_ALERTING,/* call is ringing */ CALL_STATE_CONNECT, /* call is connected and transmission is enabled */ CALL_STATE_IN_DISCONNECT,/* incoming disconnected */ CALL_STATE_OUT_DISCONNECT,/* outgoing disconnected */ }; struct telephone; struct call_list; typedef struct telephone { osmo_cc_endpoint_t cc_ep; struct call_list *call_list; const char *name; /* settings */ int serving_location; /* who we serve when sending causes towards interface */ int early_audio; /* sound */ int loopback; int samplerate; /* sample rate of headphone interface */ int latspl; void *sound; /* headphone interface */ } telephone_t; typedef struct call_list { struct call_list *next; telephone_t *telephone_ep; /* alsa states */ /* osmo-cc states */ uint32_t cc_callref; const char *sdp; osmo_cc_session_t *cc_session; osmo_cc_session_codec_t *codec; int codec_negotiated; /* call states */ enum call_state state; /* audio states */ jitter_t dejitter; samplerate_t srstate; sample_t tx_buffer[160]; /* transmit audio buffer */ int tx_buffer_pos; /* current position in transmit audio buffer */ } call_t; void telephone_destroy(telephone_t *telephone_ep); telephone_t *telephone_create(void); int telephone_init(telephone_t *telephone_ep, const char *name, const char *callerid, uint8_t serving_location, int early_audio, const char *audiodev, int samplerate, int __attribute__((unused)) latspl); void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg); int ui_init(const char *remote_id, int autoalert, int autoanswer); int ui_work(telephone_t *telephone_ep, int c); void alsa_work(telephone_t *telephone_ep); void rtp_work(telephone_t *telephone_ep);