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 / opalwavfile.cxx < prev    next >
C/C++ Source or Header  |  2002-08-05  |  4KB  |  218 lines

  1. /*
  2.  * OpalWavFile.cxx
  3.  *
  4.  * WAV file class with auto-PCM conversion
  5.  *
  6.  * OpenH323 Library
  7.  *
  8.  * Copyright (c) 2002 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Open H323 Library.
  21.  *
  22.  * Contributor(s): ______________________________________.
  23.  *
  24.  * $Log: opalwavfile.cxx,v $
  25.  * Revision 1.2  2002/08/05 10:03:48  robertj
  26.  * Cosmetic changes to normalise the usage of pragma interface/implementation.
  27.  *
  28.  * Revision 1.1  2002/06/20 01:21:32  craigs
  29.  * Initial version
  30.  *
  31.  */
  32.  
  33. #include <ptlib.h>
  34.  
  35. #ifdef __GNUC__
  36. #pragma implementation "opalwavfile.h"
  37. #endif
  38.  
  39. #include "opalwavfile.h"
  40.  
  41. #include "../include/codecs.h"
  42.  
  43.  
  44.  
  45. #define new PNEW
  46.  
  47.  
  48. OpalWAVFile::OpalWAVFile(unsigned fmt)
  49.   : PWAVFile(fmt)
  50. {
  51. }
  52.  
  53.  
  54. OpalWAVFile::OpalWAVFile(OpenMode mode, int opts, unsigned fmt)
  55.   : PWAVFile(mode, opts, fmt)
  56. {
  57. }
  58.  
  59.  
  60. OpalWAVFile::OpalWAVFile(const PFilePath & name, 
  61.                                   OpenMode mode,  /// Mode in which to open the file.
  62.                                        int opts,  /// #OpenOptions enum# for open operation.
  63.                                    unsigned fmt)  /// Type of WAV File to create
  64.   : PWAVFile(name, mode, opts, fmt)
  65. {
  66. }
  67.  
  68.  
  69. unsigned OpalWAVFile::GetFormat() const
  70. {
  71.   unsigned fmt = PWAVFile::GetFormat();
  72.   switch (fmt) {
  73.     case fmt_ALaw:
  74.     case fmt_uLaw:
  75.       fmt = fmt_PCM;
  76.       break;
  77.  
  78.     default:
  79.       break;
  80.   }
  81.  
  82.   return fmt;
  83. }
  84.  
  85.  
  86. BOOL OpalWAVFile::Read(void * buf, PINDEX len)
  87. {
  88.   switch (format) {
  89.     case fmt_uLaw:
  90.       {
  91.         // read the uLaw data
  92.         PINDEX samples = (len / 2);
  93.         PBYTEArray ulaw;
  94.         if (!PWAVFile::Read(ulaw.GetPointer(samples), samples))
  95.           return FALSE;
  96.  
  97.         // convert to PCM
  98.         PINDEX i;
  99.         short * pcmPtr = (short *)buf;
  100.         for (i = 0; i < samples; i++)
  101.           *pcmPtr++ = H323_muLawCodec::DecodeSample(ulaw[i]);
  102.  
  103.         // fake the lastReadCount
  104.         lastReadCount = len;
  105.       }
  106.       return TRUE;
  107.  
  108.     case fmt_ALaw:
  109.       {
  110.         // read the aLaw data
  111.         PINDEX samples = (len / 2);
  112.         PBYTEArray Alaw;
  113.         if (!PWAVFile::Read(Alaw.GetPointer(samples), samples))
  114.           return FALSE;
  115.  
  116.         // convert to PCM
  117.         PINDEX i;
  118.         short * pcmPtr = (short *)buf;
  119.         for (i = 0; i < samples; i++)
  120.           *pcmPtr++ = H323_ALawCodec::DecodeSample(Alaw[i]);
  121.  
  122.         // fake the lastReadCount
  123.         lastReadCount = len;
  124.       }
  125.       return TRUE;
  126.  
  127.     default:
  128.       break;
  129.   }
  130.  
  131.   return PWAVFile::Read(buf, len);
  132. }
  133.  
  134. BOOL OpalWAVFile::Write(const void * buf, PINDEX len)
  135. {
  136.   switch (format) {
  137.     case fmt_ALaw:
  138.     case fmt_uLaw:
  139.       return FALSE;
  140.  
  141.     default:
  142.       break;
  143.   }
  144.  
  145.   return PWAVFile::Write(buf, len);
  146. }
  147.  
  148. off_t OpalWAVFile::GetPosition() const
  149. {
  150.   // remember: the application thinks samples are 16 bits
  151.   // so the actual position must be doubled before returning it
  152.   off_t pos = PWAVFile::GetPosition();
  153.  
  154.   switch (format) {
  155.     case fmt_ALaw:
  156.     case fmt_uLaw:
  157.       return pos * 2;
  158.  
  159.     default:
  160.       break;
  161.   }
  162.  
  163.   return pos;
  164. }
  165.  
  166. BOOL OpalWAVFile::SetPosition(off_t pos, FilePositionOrigin origin)
  167. {
  168.   // remember: the application thinks samples are 16 bits
  169.   // so the applications request must be halved
  170.   switch (format) {
  171.     case fmt_ALaw:
  172.     case fmt_uLaw:
  173.       pos /= 2;
  174.       break;
  175.  
  176.     default:
  177.       break;
  178.   }
  179.  
  180.   return PWAVFile::SetPosition(pos, origin);
  181. }
  182.  
  183.  
  184. unsigned OpalWAVFile::GetSampleSize() const
  185. {
  186.   switch (format) {
  187.     case fmt_ALaw:
  188.     case fmt_uLaw:
  189.       return 16;
  190.  
  191.     default:
  192.       break;
  193.   }
  194.  
  195.   return PWAVFile::GetSampleSize();
  196. }
  197.  
  198.  
  199. off_t OpalWAVFile::GetDataLength()
  200. {
  201.   // get length of underlying file
  202.   // if format is not one we can convert, then return length
  203.   off_t len = PWAVFile::GetDataLength();
  204.  
  205.   // remember: the application thinks samples are 16 bits
  206.   // so the actual position must be doubled before returning it
  207.   switch (format) {
  208.     case fmt_ALaw:
  209.     case fmt_uLaw:
  210.       return len * 2;
  211.  
  212.     default:
  213.       break;
  214.   }
  215.  
  216.   return len;
  217. }
  218.