/////////////////////////////////////////////////////////////////////////////// // // // PBX4Linux // // // //---------------------------------------------------------------------------// // Copyright: Andreas Eversberg // // // // H323_chan class // // // /////////////////////////////////////////////////////////////////////////////// #include #include #include #include "main.h" #include #include #include // // 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 (iparam.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; }