home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2003 March / VPR0303A.ISO / AIBO / MoNet / SoundAgent / WAV.cc < prev    next >
C/C++ Source or Header  |  2002-12-19  |  5KB  |  214 lines

  1. //
  2. // Copyright 2002 Sony Corporation 
  3. //
  4. // Permission to use, copy, modify, and redistribute this software for
  5. // non-commercial use is hereby granted.
  6. //
  7. // This software is provided "as is" without warranty of any kind,
  8. // either expressed or implied, including but not limited to the
  9. // implied warranties of fitness for a particular purpose.
  10. //
  11.  
  12. #include <OPENR/OPENR.h>
  13. #include <OPENR/OSyslog.h>
  14. #include "WAV.h"
  15.  
  16. WAV::WAV() : soundInfo(), dataStart(0), dataEnd(0), dataCurrent(0)
  17. {
  18. }
  19.  
  20. WAV::WAV(byte* addr) : dataStart(0), dataEnd(0), dataCurrent(0)
  21. {
  22.     Set(addr);
  23. }
  24.  
  25. WAVError
  26. WAV::Set(byte *addr)
  27. {
  28.     //
  29.     // Check Wav Header
  30.     //
  31.     if(strncmp((char *)addr, "RIFF", 4)) return WAV_NOT_RIFF;
  32.     addr += 4;
  33.  
  34.     longword length = get_longword(addr);
  35.     addr += sizeof(longword);
  36.     OSYSDEBUG(( "length = %x\n", length));
  37.  
  38.     if(strncmp((char *)addr, "WAVE", 4)) return WAV_NOT_WAV;
  39.     length -= 4;
  40.     addr += 4;
  41.  
  42.     //
  43.     // Check Chunk
  44.     //
  45.     while (length > 8) {
  46.  
  47.         size_t chunksize;
  48.         char *buf = (char *)addr;
  49.     
  50.         addr += 4;
  51.  
  52.         chunksize = get_longword(addr);
  53.         addr += sizeof(longword);
  54.         length -= chunksize + 8;
  55.  
  56.         if (!strncmp(buf, "fmt ", 4)) {
  57.  
  58.             //
  59.             // Format Chunk
  60.             //
  61.  
  62.             //
  63.             // Check WAV Type
  64.             //
  65.             soundInfo.format = (OSoundFormat)get_word(addr);
  66.             addr += sizeof(word);
  67.             if (soundInfo.format != osoundformatPCM) {
  68.                 OSYSDEBUG(("WAV_FORMAT_NOT_SUPPORTED\n"));
  69.                 return WAV_FORMAT_NOT_SUPPORTED;
  70.             }
  71.  
  72.             //
  73.             // Channel
  74.             //
  75.             soundInfo.channel = (OSoundChannel)get_word(addr);
  76.             addr += sizeof(word);
  77.             if (soundInfo.channel != osoundchannelMONO) {
  78.                 OSYSDEBUG(("WAV_CHANNEL_NOT_SUPPORTED\n"));
  79.                 return WAV_CHANNEL_NOT_SUPPORTED;
  80.             }
  81.  
  82.             //
  83.             // Sampling Rate
  84.             //
  85.             longword frq = get_longword(addr);
  86.             addr += sizeof(longword);
  87.             soundInfo.samplingRate = (word)frq;
  88.             if (soundInfo.samplingRate != 8000) {
  89.                 OSYSDEBUG(("WAV_SAMPLINGRATE_NOT_SUPPORTED\n"));
  90.                 return WAV_SAMPLINGRATE_NOT_SUPPORTED;
  91.             }
  92.  
  93.             //
  94.             // DataSize Per sec
  95.             //
  96.             addr += sizeof(longword);
  97.  
  98.             //
  99.             // Block Size
  100.             //
  101.             addr += sizeof(word);
  102.  
  103.             //
  104.             // Bits Of Sample
  105.             //
  106.             soundInfo.bitsPerSample = get_word(addr);
  107.             addr += sizeof(word);
  108.             soundInfo.bitsPerSample *= soundInfo.channel;
  109.             if (soundInfo.bitsPerSample != 8) {
  110.                 OSYSDEBUG(("WAV_BITSPERSAMPLE_NOT_SUPPORTED\n"));
  111.                 return WAV_BITSPERSAMPLE_NOT_SUPPORTED;
  112.             }
  113.  
  114.             //
  115.             // Skip Extentded Infomation
  116.             //
  117.             addr += chunksize - FMTSIZE_WITHOUT_EXTINFO;
  118.             
  119.             OSYSDEBUG(( "fmt chunksize = %d\n", chunksize));
  120.             OSYSDEBUG(( "samplingRate  = %d\n", soundInfo.samplingRate));
  121.             OSYSDEBUG(( "bitsPerSample = %d\n", soundInfo.bitsPerSample));
  122.             
  123.         } else if(!strncmp(buf, "data", 4)) {
  124.  
  125.             //
  126.             // Data Chunk
  127.             //
  128.             OSYSDEBUG(( "data chunksize = %d\n", chunksize));
  129.             soundInfo.dataSize = chunksize;
  130.             dataStart = dataCurrent = addr;
  131.             dataEnd = dataStart + soundInfo.dataSize;
  132.             break;
  133.  
  134.         } else {
  135.  
  136.             //
  137.             // Fact Chunk
  138.             //
  139.             addr += chunksize;
  140.         }
  141.     }
  142.     
  143.     return WAV_SUCCESS;
  144. }
  145.  
  146. WAVError
  147. WAV::CopyTo(OSoundVectorData* data)
  148. {
  149.     if (dataCurrent >= dataEnd) return WAV_FAIL;
  150.     
  151.     OSoundInfo* sinfo = data->GetInfo(0);
  152.     if (SOUND_UNIT_SIZE > sinfo->maxDataSize) {
  153.         OSYSDEBUG(("WAV_SIZE_NOT_ENOUGH "));
  154.         return WAV_SIZE_NOT_ENOUGH;
  155.     }
  156.  
  157.     sinfo->dataSize      = SOUND_UNIT_SIZE;
  158.     sinfo->format        = soundInfo.format;
  159.     sinfo->channel       = soundInfo.channel;
  160.     sinfo->samplingRate  = soundInfo.samplingRate;
  161.     sinfo->bitsPerSample = soundInfo.bitsPerSample;
  162.  
  163.     byte* src  = dataCurrent;
  164.     byte* dest = data->GetData(0);
  165.     byte* end;
  166.     int num = (int)(dataEnd - dataCurrent);
  167.  
  168.     if (SOUND_UNIT_SIZE <= num) {
  169.     
  170.         end = dest + SOUND_UNIT_SIZE;
  171.         while (dest < end) {
  172.             *dest++ = *src++ ^ 0x80; // offset binary -> signed char
  173.         }
  174.         dataCurrent += SOUND_UNIT_SIZE;
  175.  
  176.     } else {
  177.  
  178.         end = dest + num;
  179.         while (dest < end) {
  180.             *dest++ = *src++ ^ 0x80; // offset binary -> signed char
  181.         }
  182.         memset(dest, 0x0, SOUND_UNIT_SIZE - num);
  183.         dataCurrent = dataEnd;
  184.  
  185.     }
  186.  
  187.     return WAV_SUCCESS;
  188. }
  189.  
  190. WAVError
  191. WAV::Rewind()
  192. {
  193.     dataCurrent = dataStart;
  194.     return WAV_SUCCESS;
  195. }
  196.  
  197. longword
  198. WAV::get_longword(byte* ptr)
  199. {
  200.     longword lw0 = (longword)ptr[0];
  201.     longword lw1 = (longword)ptr[1] << 8;
  202.     longword lw2 = (longword)ptr[2] << 16;
  203.     longword lw3 = (longword)ptr[3] << 24;
  204.     return lw0 + lw1 + lw2 + lw3;
  205. }
  206.  
  207. word
  208. WAV::get_word(byte* ptr)
  209. {
  210.     word w0 = (word)ptr[0];
  211.     word w1 = (word)ptr[1] << 8;
  212.     return w0 + w1;
  213. }
  214.