home *** CD-ROM | disk | FTP | other *** search
/ QuickTime 2.0 Developer Kit / QuickTime 2.0 Developer Kit.iso / mac / MAC / Programming Stuff / Sample Code / Movie Toolbox / Inside Mac Movie Toolbox Code / mtb11.c < prev    next >
Encoding:
Text File  |  1994-12-05  |  4.9 KB  |  178 lines  |  [TEXT/MPS ]

  1. /*
  2.   File:            mtb11.c
  3.   Contains:        Sound Functions
  4.   Written by:    DTS and QT Engineering
  5.   Copyright:    © 1992-1994 by Apple Computer, Inc., all rights reserved.
  6.   Change History (most recent first):
  7.   <1>         12/4/94    khs        changed the format of the file to the new look and feel
  8.   To Do:
  9. */
  10.  
  11.  
  12. // INCLUDES
  13. #include "mtb.h"
  14.  
  15.  
  16. // DEFINES
  17. /* for the following constants, please consult the Macintosh    
  18.   Audio Compression and Expansion Toolkit, specifically pages
  19.   38 and 39 */
  20. #define kMACEBeginningNumberOfBytes  6
  21. #define kMACE31MonoPacketSize  2
  22. #define kMACE31StereoPacketSize  4
  23. #define kMACE61MonoPacketSize  1
  24. #define kMACE61StereoPacketSize  2
  25.  
  26.  
  27. // FUNCTIONS
  28. void CreateSoundDescription(Handle sndHandle,
  29.                             SoundDescriptionHandle sndDesc,
  30.                             long* sndDataOffset,
  31.                             long* numSamples,
  32.                             long* sndDataSize)
  33. {
  34.     long sndHdrOffset = 0;
  35.     long sampleDataOffset;
  36.     SoundHeaderPtr sndHdrPtr = nil;
  37.     long numFrames;
  38.     long samplesPerFrame;
  39.     long bytesPerFrame;
  40.     SoundDescriptionPtr sndDescPtr;
  41.  
  42.     *sndDataOffset = 0;
  43.     *numSamples = 0;
  44.     *sndDataSize = 0;
  45.  
  46.     SetHandleSize((Handle)sndDesc, sizeof(SoundDescription));
  47.     CheckError(MemError(), "\pSetHandleSize");
  48.  
  49.     sndHdrOffset = GetSndHdrOffset(sndHandle);
  50.     if (sndHdrOffset == 0)
  51.         CheckError(-1, "\pGetSndHdrOffset ");
  52.  
  53.     // we can use pointers since we don't move memory
  54.     sndHdrPtr = (SoundHeaderPtr)(*sndHandle + sndHdrOffset);
  55.     sndDescPtr = *sndDesc;
  56.  
  57.     sndDescPtr->descSize = sizeof(SoundDescription);
  58.     // total size of sound description structure
  59.     sndDescPtr->resvd1 = 0;
  60.     sndDescPtr->resvd2 = 0;
  61.     sndDescPtr->dataRefIndex = 1;
  62.     sndDescPtr->compressionID = 0;
  63.     sndDescPtr->packetSize = 0;
  64.     sndDescPtr->version = 0;
  65.     sndDescPtr->revlevel = 0;
  66.     sndDescPtr->vendor = 0;
  67.  
  68.     switch (sndHdrPtr->encode)
  69.     {
  70.         case stdSH:
  71.             sndDescPtr->dataFormat = 'raw ';
  72.             // uncompressed offset-binary data
  73.             sndDescPtr->numChannels = 1;
  74.             // number of channels of sound
  75.             sndDescPtr->sampleSize = 8;
  76.             // number of bits per sample
  77.             sndDescPtr->sampleRate = sndHdrPtr->sampleRate;
  78.             // sample rate        
  79.             *numSamples = sndHdrPtr->length;
  80.             *sndDataSize = *numSamples;
  81.             bytesPerFrame = 1;
  82.             samplesPerFrame = 1;
  83.             sampleDataOffset = (Ptr) & sndHdrPtr->sampleArea - (Ptr)sndHdrPtr;
  84.             break;
  85.  
  86.         case extSH:
  87.             {
  88.                 ExtSoundHeaderPtr extSndHdrP;
  89.  
  90.                 extSndHdrP = (ExtSoundHeaderPtr)sndHdrPtr;
  91.  
  92.                 sndDescPtr->dataFormat = 'raw ';
  93.                 // uncompressed offset-binary data
  94.                 sndDescPtr->numChannels = extSndHdrP->numChannels;
  95.                 // number of channels of sound
  96.                 sndDescPtr->sampleSize = extSndHdrP->sampleSize;
  97.                 // number of bits per sample
  98.                 sndDescPtr->sampleRate = extSndHdrP->sampleRate;
  99.                 // sample rate            
  100.                 numFrames = extSndHdrP->numFrames;
  101.                 *numSamples = numFrames;
  102.                 bytesPerFrame = extSndHdrP->numChannels * (extSndHdrP->sampleSize / 8);
  103.                 samplesPerFrame = 1;
  104.                 *sndDataSize = numFrames * bytesPerFrame;
  105.                 sampleDataOffset = (Ptr)(&extSndHdrP->sampleArea) - (Ptr)extSndHdrP;
  106.             }
  107.             break;
  108.  
  109.         case cmpSH:
  110.             {
  111.                 CmpSoundHeaderPtr cmpSndHdrP;
  112.  
  113.                 cmpSndHdrP = (CmpSoundHeaderPtr)sndHdrPtr;
  114.                 sndDescPtr->numChannels = cmpSndHdrP->numChannels;
  115.                 // number of channels of sound
  116.                 sndDescPtr->sampleSize = cmpSndHdrP->sampleSize;
  117.                 // number of bits per sample before compression
  118.                 sndDescPtr->sampleRate = cmpSndHdrP->sampleRate;
  119.                 // sample rate
  120.                 numFrames = cmpSndHdrP->numFrames;
  121.                 sampleDataOffset = (Ptr)(&cmpSndHdrP->sampleArea) - (Ptr)cmpSndHdrP;
  122.                 switch (cmpSndHdrP->compressionID)
  123.                 {
  124.                     case threeToOne:
  125.                         sndDescPtr->dataFormat = 'MAC3';
  126.                         // compressed 3:1 data
  127.                         samplesPerFrame = kMACEBeginningNumberOfBytes;
  128.                         *numSamples = numFrames * samplesPerFrame;
  129.                         switch (cmpSndHdrP->numChannels)
  130.                         {
  131.                             case 1:
  132.                                 bytesPerFrame = cmpSndHdrP->numChannels * kMACE31MonoPacketSize;
  133.                                 break;
  134.                             case 2:
  135.                                 bytesPerFrame = cmpSndHdrP->numChannels * kMACE31StereoPacketSize;
  136.                                 break;
  137.                             default:
  138.                                 CheckError(-1, "\pCorrupt sound data");
  139.                                 break;
  140.                         }
  141.                         *sndDataSize = numFrames * bytesPerFrame;
  142.                         break;
  143.                     case sixToOne:
  144.                         sndDescPtr->dataFormat = 'MAC6';
  145.                         // compressed 6:1 data
  146.                         samplesPerFrame = kMACEBeginningNumberOfBytes;
  147.                         *numSamples = numFrames * samplesPerFrame;
  148.                         switch (cmpSndHdrP->numChannels)
  149.                         {
  150.                             case 1:
  151.                                 bytesPerFrame = cmpSndHdrP->numChannels * kMACE61MonoPacketSize;
  152.                                 break;
  153.                             case 2:
  154.                                 bytesPerFrame = cmpSndHdrP->numChannels * kMACE61StereoPacketSize;
  155.                                 break;
  156.                             default:
  157.                                 CheckError(-1, "\pCorrupt sound data");
  158.                                 break;
  159.                         }
  160.                         *sndDataSize = (*numSamples) * bytesPerFrame;
  161.                         break;
  162.                     default:
  163.                         CheckError(-1, "\pCorrupt sound data");
  164.                         break;
  165.                 }
  166.             }                                    // switch cmpSndHdrP->compressionID:*/
  167.             break;                                // of cmpSH:
  168.  
  169.         default:
  170.             CheckError(-1, "\pCorrupt sound data");
  171.             break;
  172.  
  173.     }                                            // switch sndHdrPtr->encode*/
  174.     *sndDataOffset = sndHdrOffset + sampleDataOffset;
  175. }
  176.  
  177.  
  178.