Add FXS support
[lcr.git] / port.h
diff --git a/port.h b/port.h
index 4833ad7..6cfc6b5 100644 (file)
--- a/port.h
+++ b/port.h
@@ -18,6 +18,9 @@
 #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
@@ -27,6 +30,7 @@
 #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
        /* te-mode */
 #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
@@ -149,12 +159,25 @@ struct port_settings {
        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 */
-       class Port *sunrise;                    /* one side of the bridge */
-       class Port *sunset;                     /* other side of the 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;
@@ -164,7 +187,7 @@ class Port
 {
        public:
        /* methods */
-       Port(int type, const 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 */
@@ -175,6 +198,7 @@ class Port
        virtual void update_load(void);
 
        struct port_settings p_settings;
+       char p_interface_name[64];
        
        /* tone */
        char p_tone_dir[256];                   /* name of current directory */
@@ -204,7 +228,6 @@ class Port
        /* audio bridging */
        struct port_bridge *p_bridge;           /* linked to a port bridge or NULL */
        void bridge(unsigned int bridge_id);    /* join a bridge */
-       class Port *bridge_remote(void);        /* get remote port */
        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 */
 
@@ -218,11 +241,13 @@ 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 */
+       /* 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 int p_record_length;           /* size of what's written so far */