190 lines
4.5 KiB
C++
190 lines
4.5 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// 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;
|
|
}
|
|
|