home *** CD-ROM | disk | FTP | other *** search
/ ftp.muug.mb.ca / 2014.06.ftp.muug.mb.ca.tar / ftp.muug.mb.ca / pub / openh323.tar.gz / openh323.tar / openh323 / src / rtp2wav.cxx < prev    next >
C/C++ Source or Header  |  2003-01-07  |  4KB  |  155 lines

  1. /*
  2.  * rtp2wav.cxx
  3.  *
  4.  * Open Phone Abstraction Library (OPAL)
  5.  * Formally known as the Open H323 project.
  6.  *
  7.  * Copyright (c) 2001 Equivalence Pty. Ltd.
  8.  *
  9.  * The contents of this file are subject to the Mozilla Public License
  10.  * Version 1.0 (the "License"); you may not use this file except in
  11.  * compliance with the License. You may obtain a copy of the License at
  12.  * http://www.mozilla.org/MPL/
  13.  *
  14.  * Software distributed under the License is distributed on an "AS IS"
  15.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  16.  * the License for the specific language governing rights and limitations
  17.  * under the License.
  18.  *
  19.  * The Original Code is Open Phone Abstraction Library.
  20.  *
  21.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  22.  *
  23.  * Contributor(s): ______________________________________.
  24.  *
  25.  * $Log: rtp2wav.cxx,v $
  26.  * Revision 1.3  2003/01/07 07:52:50  craigs
  27.  * Fixed problem with multi-frame G.723.1 packets
  28.  *
  29.  * Revision 1.2  2002/05/23 04:22:32  robertj
  30.  * Fixed problem with detecting correct payload type. Must
  31.  *   wait for first non-empty packet.
  32.  * Added virtual function so can override record start point.
  33.  *
  34.  * Revision 1.1  2002/05/21 02:42:58  robertj
  35.  * Added class to allow for saving of RTP data to a WAV file.
  36.  *
  37.  */
  38.  
  39. #include <ptlib.h>
  40.  
  41. #ifdef __GNUC__
  42. #pragma implementation "rtp2wav.h"
  43. #endif
  44.  
  45. #include "rtp2wav.h"
  46.  
  47.  
  48. #define new PNEW
  49.  
  50.  
  51. ///////////////////////////////////////////////////////////////////////////////
  52.  
  53. OpalRtpToWavFile::OpalRtpToWavFile()
  54. #ifdef _MSC_VER
  55. #pragma warning(disable:4355)
  56. #endif
  57.   : receiveHandler(PCREATE_NOTIFIER(ReceivedPacket))
  58. #ifdef _MSC_VER
  59. #pragma warning(default:4355)
  60. #endif
  61. {
  62.   payloadType = RTP_DataFrame::IllegalPayloadType;
  63. }
  64.  
  65.  
  66. OpalRtpToWavFile::OpalRtpToWavFile(const PString & filename)
  67. #ifdef _MSC_VER
  68. #pragma warning(disable:4355)
  69. #endif
  70.   :  receiveHandler(PCREATE_NOTIFIER(ReceivedPacket))
  71. #ifdef _MSC_VER
  72. #pragma warning(default:4355)
  73. #endif
  74. {
  75.   SetFilePath(filename);
  76.   payloadType = RTP_DataFrame::IllegalPayloadType;
  77.   lastPayloadSize = 0;
  78. }
  79.  
  80.  
  81. BOOL OpalRtpToWavFile::OnFirstPacket(RTP_DataFrame & frame)
  82. {
  83.   static int SupportedTypes[] = {
  84.     PWAVFile::fmt_uLaw,
  85.     0, 0,
  86.     PWAVFile::fmt_GSM,
  87.     PWAVFile::fmt_VivoG7231,
  88.     0, 0, 0,
  89.     PWAVFile::fmt_ALaw,
  90.     0, 0,
  91.     PWAVFile::fmt_PCM
  92.   };
  93.  
  94.   payloadType = frame.GetPayloadType();
  95.  
  96.   if (payloadType >= PARRAYSIZE(SupportedTypes) || SupportedTypes[payloadType] == 0) {
  97.     PTRACE(1, "rtp2wav\tUnsupported payload type: " << payloadType);
  98.     return FALSE;
  99.   }
  100.  
  101.   if (!SetFormat(SupportedTypes[payloadType])) {
  102.     PTRACE(1, "rtp2wav\tCould not set WAV file format: " << SupportedTypes[payloadType]);
  103.     return FALSE;
  104.   }
  105.  
  106.   if (!Open(PFile::WriteOnly)) {
  107.     PTRACE(1, "rtp2wav\tCould not open WAV file: " << GetErrorText());
  108.     return FALSE;
  109.   }
  110.  
  111.   PTRACE(3, "rtp2wav\tStarted recording payload type " << payloadType
  112.          << " to " << GetFilePath());
  113.   return TRUE;
  114. }
  115.  
  116.  
  117. void OpalRtpToWavFile::ReceivedPacket(RTP_DataFrame & frame, INT)
  118. {
  119.   PINDEX payloadSize = frame.GetPayloadSize();
  120.  
  121.   if (payloadType == RTP_DataFrame::IllegalPayloadType) {
  122.     // Ignore packets until actually get something of jitter buffer
  123.     if (payloadSize == 0)
  124.       return;
  125.     if (!OnFirstPacket(frame))
  126.       return;
  127.   }
  128.  
  129.   if (payloadType != frame.GetPayloadType())
  130.     return;
  131.  
  132.   if (!IsOpen())
  133.     return;
  134.  
  135.   if (payloadSize > 0) {
  136.     if (Write(frame.GetPayloadPtr(), payloadSize)) {
  137.       lastPayloadSize = payloadSize;
  138.       memcpy(lastFrame.GetPointer(lastPayloadSize), frame.GetPayloadPtr(), payloadSize);
  139.       return;
  140.     }
  141.   }
  142.  
  143.   else if (lastPayloadSize == 0)
  144.     return;
  145.  
  146.   else if (Write(lastFrame.GetPointer(), lastPayloadSize))
  147.     return;
  148.  
  149.   PTRACE(1, "rtp2wav\tError writing to WAV file: " << GetErrorText(PChannel::LastWriteError));
  150.   Close();
  151. }
  152.  
  153.  
  154. /////////////////////////////////////////////////////////////////////////////
  155.