summaryrefslogtreecommitdiffstats
path: root/h323_chan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'h323_chan.cpp')
-rw-r--r--h323_chan.cpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/h323_chan.cpp b/h323_chan.cpp
new file mode 100644
index 0000000..ca10cbb
--- /dev/null
+++ b/h323_chan.cpp
@@ -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;
+}
+