only for backup, still in coding state - no compile!!!
[lcr.git] / h323_chan.cpp
diff --git a/h323_chan.cpp b/h323_chan.cpp
new file mode 100644 (file)
index 0000000..ca10cbb
--- /dev/null
@@ -0,0 +1,189 @@
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// PBX4Linux                                                                 //
+//                                                                           //
+//---------------------------------------------------------------------------//
+// Copyright: Andreas Eversberg                                              //
+//                                                                           //
+// H323_chan class                                                           //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "main.h"
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+//
+// constructor
+//
+H323_chan::H323_chan(const PString &token, BOOL isEncoding) : PIndirectChannel()
+{
+       d_token = token;
+//     d_isEncoding = isEncoding;
+
+       PDEBUG(DEBUG_H323, "H323 channel  constuctor of channel (%scoding)\n", (isEncoding)?"en":"de");
+
+       transfering = FALSE;
+}
+
+
+//
+// destructor
+//
+H323_chan::~H323_chan(void)
+{
+
+       PDEBUG(DEBUG_H323, "H323 channel  destuctor\n");
+}
+
+
+//
+// Closes the
+//
+BOOL H323_chan::Close(void)
+{
+       PDEBUG(DEBUG_H323, "H323 channel  Close\n");
+
+       return TRUE;
+}
+
+
+//
+// IsOpen
+//
+BOOL H323_chan::IsOpen(void) const
+{
+       PDEBUG(DEBUG_H323, "H323 channel  IsOpen\n");
+
+       return TRUE;
+}
+
+
+//
+// Read
+//
+BOOL H323_chan::Read(void *buf, PINDEX len)
+{
+       int nr_words;
+       class H323Port *port;
+       const unsigned char *token_string = d_token;
+       PTime Now;
+       PTimeInterval diff;
+
+       nr_words = len/2;
+
+//     cout << "H323 channel  Read " << nr_words << " words" << endl;
+       mutex_h323.Wait();
+
+       if (!(port = (class H323Port *)find_port_with_token((char *)token_string)))
+       {
+               PERROR("H323 channel  Read() cannot find port with token %s\n", token_string);
+               mutex_h323.Signal();
+               lastReadCount = 0;
+               return FALSE;
+       }
+
+       nr_words = port->read_audio((unsigned char *)buf, nr_words, 0);
+
+       mutex_h323.Signal();
+
+       // delay
+       if (!transfering)
+       {
+               PDEBUG(DEBUG_H323, "H323 channel  Read(%s) sending to h323 the first time\n", token_string);
+               start = Now;
+               transfering = TRUE;
+               elapsed = 0;
+       }
+       diff = Now-start;
+       elapsed += nr_words*125;
+       if (elapsed > (diff.GetMilliSeconds()*1000))
+               usleep(elapsed - (diff.GetMilliSeconds()*1000));
+
+       lastReadCount = 2 * nr_words;
+
+       return TRUE;
+}
+
+
+//
+// Write
+//
+BOOL H323_chan::Write(const void *buf, PINDEX len)
+{
+       int nr_words;
+       class H323Port *port;
+       const unsigned char *token_string = d_token;
+       PTime Now;
+       PTimeInterval diff;
+       unsigned char *data_temp;
+       unsigned long length_temp;
+       struct message *message;
+
+       nr_words = len / 2;
+
+//     cout << "H323 channel  Write " << nr_words << " words" << endl;
+       mutex_h323.Wait();
+
+       if (!(port = (class H323Port *)find_port_with_token((char *)token_string)))
+       {
+               PERROR("H323 channel  Write() cannot find port with token %s\n", token_string);
+               mutex_h323.Signal();
+               lastReadCount = 0;
+               return FALSE;
+       }
+
+       // send data message
+       length_temp = len;
+       data_temp = (unsigned char *)buf;
+       while(length_temp)
+       {
+               message = message_create(port->p_serial, ACTIVE_EPOINT(port->p_epointlist), PORT_TO_EPOINT, MESSAGE_DATA);
+               message->param.data.len = (length_temp>sizeof(message->param.data.data))?sizeof(message->param.data.data):length_temp;
+               memcpy(message->param.data.data, data_temp, message->param.data.len);
+               message->param.data.compressed = 0;
+/*             { // testin with law data
+                       int i=0;
+                       while (i<message->param.data.len)
+                       {
+                               ((unsigned char *)message->param.data.data)[i] = audio_s16_to_law[((signed short*)data_temp)[i] & 0xffff];
+                               i++;
+                       }
+               }
+               message->param.data.len = message->param.data.len/2;
+               message->param.data.compressed = 1;
+*/
+               message->param.data.port_type = port->p_type; 
+               message->param.data.port_id = port->p_serial;
+               message_put(message);
+               if (length_temp <= sizeof(message->param.data.data))
+                       break;
+               data_temp += sizeof(message->param.data.data);
+               length_temp -= sizeof(message->param.data.data);
+       }
+
+       mutex_h323.Signal();
+
+       // delay
+       if (!transfering)
+       {
+               PDEBUG(DEBUG_H323, "H323 channel  Write(%s) receiving from h323 the first time\n", token_string);
+               start = Now;
+               transfering = TRUE;
+               elapsed = 0;
+       }
+       diff = Now-start;
+       elapsed += nr_words*125;
+       if (elapsed > (diff.GetMilliSeconds()*1000))
+               usleep(elapsed - (diff.GetMilliSeconds()*1000));
+
+       lastWriteCount = 2 * nr_words;
+
+       return TRUE;
+}
+