Add -lncurses to LDD flags
[lcr.git] / port.h
diff --git a/port.h b/port.h
index 0ee91e7..caf017a 100644 (file)
--- a/port.h
+++ b/port.h
 
 /* type of port */
 #define        PORT_TYPE_NULL          0x0000
-#define PORT_CLASS_mISDN       0x0100
-#define PORT_CLASS_MASK                0xff00
-#define PORT_CLASS_mISDN_DSS1  0x0110
-#define PORT_CLASS_mISDN_MASK  0xfff0
+#define PORT_CLASS_mISDN       0x1000
+#define PORT_CLASS_DSS1                0x1100
+#define PORT_CLASS_DSS1_NT     0x1110
+#define PORT_CLASS_DSS1_TE     0x1120
+#define PORT_CLASS_POTS                0x1200
+#define PORT_CLASS_POTS_FXS    0x1210
+#define PORT_CLASS_POTS_FXO    0x1220
+#define PORT_CLASS_SS5         0x1300
+#define PORT_CLASS_SIP         0x2000
+#define PORT_CLASS_GSM         0x3000
+#define PORT_CLASS_GSM_BS      0x3100
+#define PORT_CLASS_GSM_MS      0x3200
+#define PORT_CLASS_REMOTE      0x4000
+#define PORT_CLASS_MASK                0xf000
+#define PORT_CLASS_mISDN_MASK  0xff00
+#define PORT_CLASS_DSS1_MASK   0xfff0
+#define PORT_CLASS_POTS_MASK   0xfff0
+#define PORT_CLASS_GSM_MASK    0xff00
+#define PORT_CLASS_DIR_MASK    0x000f
+#define PORT_CLASS_DIR_IN      0x0001
+#define PORT_CLASS_DIR_OUT     0x0002
        /* nt-mode */
-#define        PORT_TYPE_DSS1_NT_IN    0x0111
-#define        PORT_TYPE_DSS1_NT_OUT   0x0112
+#define        PORT_TYPE_DSS1_NT_IN    0x1111
+#define        PORT_TYPE_DSS1_NT_OUT   0x1112
        /* te-mode */
-#define        PORT_TYPE_DSS1_TE_IN    0x0113
-#define        PORT_TYPE_DSS1_TE_OUT   0x0114
+#define        PORT_TYPE_DSS1_TE_IN    0x1121
+#define        PORT_TYPE_DSS1_TE_OUT   0x1122
+       /* FXS-mode */
+#define        PORT_TYPE_POTS_FXS_IN   0x1211
+#define        PORT_TYPE_POTS_FXS_OUT  0x1212
+       /* FXO-mode */
+#define        PORT_TYPE_POTS_FXO_IN   0x1221
+#define        PORT_TYPE_POTS_FXO_OUT  0x1222
+       /* gsm */
+#define        PORT_TYPE_GSM_BS_IN     0x3101
+#define        PORT_TYPE_GSM_BS_OUT    0x3102
+#define        PORT_TYPE_GSM_MS_IN     0x3201
+#define        PORT_TYPE_GSM_MS_OUT    0x3202
+       /* ss5 */
+#define        PORT_TYPE_SS5_IN        0x1311
+#define        PORT_TYPE_SS5_OUT       0x1312
+#define        PORT_TYPE_SS5_IDLE      0x1313
+       /* remote */
+#define        PORT_TYPE_REMOTE_IN     0x4001
+#define        PORT_TYPE_REMOTE_OUT    0x4002
+       /* SIP */
+#define        PORT_TYPE_SIP_IN        0x2001
+#define        PORT_TYPE_SIP_OUT       0x2002
        /* answering machine */
-#define        PORT_TYPE_VBOX_OUT      0x0311
+#define        PORT_TYPE_VBOX_OUT      0xf111
 
 
 enum { /* states of call */
@@ -46,7 +84,7 @@ enum { /* states of call */
 };
 
 #define PORT_STATE_NAMES \
-static char *state_name[] = { \
+static const char *state_name[] = { \
        "PORT_STATE_IDLE", \
        "PORT_STATE_IN_SETUP", \
        "PORT_STATE_OUT_SETUP", \
@@ -80,14 +118,19 @@ enum { /* event list from listening to tty */
        TTYI_EVENT_BUSY,        /* channel unavailable */
 };
 
+#define RECORD_BUFFER_LENGTH   1024 // must be a binary border & must be greater 256, because 256 will be written if buffer overflows
+#define RECORD_BUFFER_MASK     1023
+
+#define PORT_TRANSMIT          256 // how much to transmit via bridge, if it is not defined by received data length
+
 /* structure of epoint_list */
 struct epoint_list {
        struct epoint_list      *next;
-       unsigned long           epoint_id;
+       unsigned int            epoint_id;
        int                     active;
 };
 
-inline unsigned long ACTIVE_EPOINT(struct epoint_list *epointlist)
+inline unsigned int ACTIVE_EPOINT(struct epoint_list *epointlist)
 {
        while(epointlist)
        {
@@ -98,7 +141,7 @@ inline unsigned long ACTIVE_EPOINT(struct epoint_list *epointlist)
        return(0);
 }
 
-inline unsigned long INACTIVE_EPOINT(struct epoint_list *epointlist)
+inline unsigned int INACTIVE_EPOINT(struct epoint_list *epointlist)
 {
        while(epointlist)
        {
@@ -110,24 +153,38 @@ inline unsigned long INACTIVE_EPOINT(struct epoint_list *epointlist)
 }
 
 
-/* a linked list of soft-mixer relations */
-struct mixer_relation {
-       struct mixer_relation *next;            /* next in list */
-       unsigned long port_id;                  /* port related to */
-       int mixer_writep;                       /* write pointer in buffer */
-       };
-
 /* structure of port settings */
 struct port_settings {
        char tones_dir[256];                    /* directory of current tone */
-        int tout_setup;
-        int tout_dialing;
-        int tout_proceeding;
-        int tout_alerting;
-        int tout_disconnect;
-//     int tout_hold;
-//     int tout_park;
-       int no_seconds;                         /* don't send seconds with time information element */
+       int no_seconds;
+};
+
+#define BRIDGE_BUFFER 4096
+
+struct port_bridge_member {
+       struct port_bridge_member *next;
+       class Port *port;
+       unsigned char buffer[BRIDGE_BUFFER];
+       int write_p;                            /* points to write position in buffer */
+       int min_space;                          /* minimum space to calculate how much delay can be removed */
+};
+
+/* port bridge instance */
+struct port_bridge {
+       struct port_bridge *next;               /* next bridge node */
+       unsigned int bridge_id;                 /* unique ID to identify bridge */
+       struct port_bridge_member *first;       /* list of ports that are bridged */
+       signed long sum_buffer[BRIDGE_BUFFER];
+       int read_p;                             /* points to read position in buffer */
+       struct lcr_timer timer;                 /* clock to transmit sum data */
+       int sample_count;                       /* counter of samples since last delay check */
+};
+
+extern struct port_bridge *p_bridge_first;
+
+enum dov_type {
+       DOV_TYPE_PWM,
+       DOV_TYPE_PCM,
 };
 
 /* generic port class */
@@ -135,45 +192,52 @@ class Port
 {
        public:
        /* methods */
-       Port(int type, char *portname, struct port_settings *settings);
+       Port(int type, const char *portname, struct port_settings *settings, struct interface *interface);
        virtual ~Port();
        class Port *next;                       /* next port in list */
        int p_type;                             /* type of port */
-       virtual int handler(void);
-       virtual int message_epoint(unsigned long epoint_id, int message, union parameter *param);
+       virtual int message_epoint(unsigned int epoint_id, int message, union parameter *param);
        virtual void set_echotest(int echotest);
-       virtual void set_tone(char *dir, char *name);
+       virtual void set_tone(const char *dir, const char *name);
        virtual int read_audio(unsigned char *buffer, int length);
-       virtual void transmit(unsigned char *buffer, int length);
+       virtual void update_load(void);
+       virtual void set_display(const char *text);
 
        struct port_settings p_settings;
+       char p_interface_name[64];
        
        /* tone */
-       int p_debug_nothingtosend;              /* used for debugging the, if we have currently nothing to send (used for ISDN) */
+       char p_tones_interface[256];            /* directory of tones of interface */
        char p_tone_dir[256];                   /* name of current directory */
        char p_tone_name[256];                  /* name of current tone */
        char p_tone_fh;                         /* file descriptor of current tone or -1 if not open */
        void *p_tone_fetched;                   /* pointer to fetched data */
        int p_tone_codec;                       /* codec that the tone is made of */
-       long p_tone_size, p_tone_left;          /* size of tone in bytes (not samples), bytes left */
-       long p_tone_eof;                        /* flag that makes the use of eof message */
-       long p_tone_counter;                    /* flag that makes the use of counter message */
-       long p_tone_speed;                      /* speed of current tone, 1=normal, may also be negative */
+       signed int p_tone_size, p_tone_left;    /* size of tone in bytes (not samples), bytes left */
+       signed int p_tone_eof;                  /* flag that makes the use of eof message */
+       signed int p_tone_counter;              /* flag that makes the use of counter message */
+       signed int p_tone_speed;                /* speed of current tone, 1=normal, may also be negative */
 //     char p_knock_fh;                        /* file descriptor of knocking tone or -1 if not open */
 //     void *p_knock_fetched;                  /* pointer to fetched data */
 //     int p_knock_codec;
-//     long p_knock_size, p_knock_left;
-       void set_vbox_tone(char *dir, char *name);/* tone of answering machine */
-       void set_vbox_play(char *name, int offset); /* sample of answ. */
+//     signed int p_knock_size, p_knock_left;
+       void set_vbox_tone(const char *dir, const char *name);/* tone of answering machine */
+       void set_vbox_play(const char *name, int offset); /* sample of answ. */
        void set_vbox_speed(int speed); /* speed of answ. */
 
        /* identification */
-       unsigned long p_serial;                 /* serial unique id of port */
+       unsigned int p_serial;                  /* serial unique id of port */
        char p_name[128];                       /* name of port or token (h323) */
 
        /* endpoint relation */
        struct epoint_list *p_epointlist;       /* endpoint relation */
 
+       /* audio bridging */
+       struct port_bridge *p_bridge;           /* linked to a port bridge or NULL */
+       void bridge(unsigned int bridge_id);    /* join a bridge */
+       int bridge_tx(unsigned char *data, int len); /* used to transmit data to remote port */
+       virtual int bridge_rx(unsigned char *data, int len); /* function to be inherited, so data is received */
+
        /* state */
        int p_state;                            /* state of port */
        void new_state(int state);              /* set new state */
@@ -184,13 +248,22 @@ class Port
        struct capa_info p_capainfo;    /* info on l2,l3 capacity */
        int p_echotest;                         /* set to echo audio data FROM port back to port's mixer */
 
-       /* recording */
-       int open_record(int type, int mode, int skip, char *terminal, int anon_ignore, char *vbox_email, int vbox_email_file);
-       void close_record(int beep);
+       /* recording/tapping */
+       int open_record(int type, int mode, int skip, char *terminal, int anon_ignore, const char *vbox_email, int vbox_email_file);
+       void close_record(int beep, int mute);
+       void record(unsigned char *data, int length, int dir_fromup);
+       void tap(unsigned char *data, int length, int dir_fromup);
        FILE *p_record;                         /* recording fp: if not NULL, recording is enabled */
+       unsigned int p_tap;                     /* enpoint to send tapping audio to */
        int p_record_type;                      /* codec to use: RECORD_MONO, RECORD_STEREO, ... */
        int p_record_skip;                      /* skip bytes before writing the sample */
-       unsigned long p_record_length;          /* size of what's written so far */
+       unsigned int p_record_length;           /* size of what's written so far */
+
+       signed short p_record_buffer[RECORD_BUFFER_LENGTH];
+       unsigned int p_record_buffer_readp;
+       unsigned int p_record_buffer_writep;
+       int p_record_buffer_dir;                /* current direction in buffer */
+
        char p_record_filename[256];            /* record filename */
        int p_record_vbox;                      /* 0= normal recording, 1= announcement, 2= record to vbox dir */
        int p_record_vbox_year;                 /* time when vbox recording started */
@@ -202,18 +275,54 @@ class Port
        int p_record_anon_ignore;
        char p_record_vbox_email[128];
        int p_record_vbox_email_file;
+       virtual void update_rxoff(void);        /* inherited by mISDNport, to control rxoff */
+
+#ifdef WITH_VOOTP
+       vootp_t *p_vootp;                       /* VoOTP instance */
+       void set_vootp(struct param_vootp *vootp);
+#endif
+
+       /* DOV */
+       int p_dov_tx, p_dov_rx;
+       int p_dov_tx_sync, p_dov_rx_sync;
+       enum dov_type p_dov_tx_type, p_dov_rx_type;
+       unsigned char *p_dov_tx_data, *p_dov_rx_data;
+       int p_dov_tx_data_length;
+       int p_dov_tx_data_pos, p_dov_rx_data_pos;
+       int p_dov_tx_bit_pos, p_dov_rx_bit_pos;
+       int p_dov_tx_pwm_pos, p_dov_rx_pwm_pos;
+       int p_dov_rx_pwm_duration, p_dov_rx_pwm_polarity;
+       int p_dov_tx_up;
+       int p_dov_rx_sync_word;
+       unsigned char p_dov_up;
+       unsigned char p_dov_down;
+       void dov_init(void);
+       void dov_exit(void);
+       void dov_reset_tx(void);
+       void dov_reset_rx(void);
+       struct lcr_timer p_dov_tx_timer;
+       struct lcr_timer p_dov_rx_timer;
+       void dov_sendmsg(unsigned char *data, int length, enum dov_type type, int level);
+       int dov_tx(unsigned char *data, int length);
+       int dov_tx_pcm(unsigned char *data, int length);
+       int dov_tx_pwm(unsigned char *data, int length);
+       void dov_listen(enum dov_type type);
+       void dov_rx(unsigned char *data, int length);
+       void dov_rx_pcm(unsigned char *data, int length);
+       void dov_rx_pwm(unsigned char *data, int length);
+       void dov_message(unsigned char *data, int length);
 
        void free_epointlist(struct epoint_list *epointlist);
-       void free_epointid(unsigned long epoint_id);
-       struct epoint_list *epointlist_new(unsigned long epoint_id);
+       void free_epointid(unsigned int epoint_id);
+       struct epoint_list *epointlist_new(unsigned int epoint_id);
 };
 
 
 extern Port *port_first;
-extern unsigned long port_serial;
+extern unsigned int port_serial;
 
 class Port *find_port_with_token(char *name);
-class Port *find_port_id(unsigned long port_id);
+class Port *find_port_id(unsigned int port_id);
 
 
 #endif // PORT_HEADER