home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-12-05 | 4.9 KB | 178 lines | [TEXT/MPS ] |
- /*
- File: mtb11.c
- Contains: Sound Functions
- Written by: DTS and QT Engineering
- Copyright: © 1992-1994 by Apple Computer, Inc., all rights reserved.
- Change History (most recent first):
- <1> 12/4/94 khs changed the format of the file to the new look and feel
- To Do:
- */
-
-
- // INCLUDES
- #include "mtb.h"
-
-
- // DEFINES
- /* for the following constants, please consult the Macintosh
- Audio Compression and Expansion Toolkit, specifically pages
- 38 and 39 */
- #define kMACEBeginningNumberOfBytes 6
- #define kMACE31MonoPacketSize 2
- #define kMACE31StereoPacketSize 4
- #define kMACE61MonoPacketSize 1
- #define kMACE61StereoPacketSize 2
-
-
- // FUNCTIONS
- void CreateSoundDescription(Handle sndHandle,
- SoundDescriptionHandle sndDesc,
- long* sndDataOffset,
- long* numSamples,
- long* sndDataSize)
- {
- long sndHdrOffset = 0;
- long sampleDataOffset;
- SoundHeaderPtr sndHdrPtr = nil;
- long numFrames;
- long samplesPerFrame;
- long bytesPerFrame;
- SoundDescriptionPtr sndDescPtr;
-
- *sndDataOffset = 0;
- *numSamples = 0;
- *sndDataSize = 0;
-
- SetHandleSize((Handle)sndDesc, sizeof(SoundDescription));
- CheckError(MemError(), "\pSetHandleSize");
-
- sndHdrOffset = GetSndHdrOffset(sndHandle);
- if (sndHdrOffset == 0)
- CheckError(-1, "\pGetSndHdrOffset ");
-
- // we can use pointers since we don't move memory
- sndHdrPtr = (SoundHeaderPtr)(*sndHandle + sndHdrOffset);
- sndDescPtr = *sndDesc;
-
- sndDescPtr->descSize = sizeof(SoundDescription);
- // total size of sound description structure
- sndDescPtr->resvd1 = 0;
- sndDescPtr->resvd2 = 0;
- sndDescPtr->dataRefIndex = 1;
- sndDescPtr->compressionID = 0;
- sndDescPtr->packetSize = 0;
- sndDescPtr->version = 0;
- sndDescPtr->revlevel = 0;
- sndDescPtr->vendor = 0;
-
- switch (sndHdrPtr->encode)
- {
- case stdSH:
- sndDescPtr->dataFormat = 'raw ';
- // uncompressed offset-binary data
- sndDescPtr->numChannels = 1;
- // number of channels of sound
- sndDescPtr->sampleSize = 8;
- // number of bits per sample
- sndDescPtr->sampleRate = sndHdrPtr->sampleRate;
- // sample rate
- *numSamples = sndHdrPtr->length;
- *sndDataSize = *numSamples;
- bytesPerFrame = 1;
- samplesPerFrame = 1;
- sampleDataOffset = (Ptr) & sndHdrPtr->sampleArea - (Ptr)sndHdrPtr;
- break;
-
- case extSH:
- {
- ExtSoundHeaderPtr extSndHdrP;
-
- extSndHdrP = (ExtSoundHeaderPtr)sndHdrPtr;
-
- sndDescPtr->dataFormat = 'raw ';
- // uncompressed offset-binary data
- sndDescPtr->numChannels = extSndHdrP->numChannels;
- // number of channels of sound
- sndDescPtr->sampleSize = extSndHdrP->sampleSize;
- // number of bits per sample
- sndDescPtr->sampleRate = extSndHdrP->sampleRate;
- // sample rate
- numFrames = extSndHdrP->numFrames;
- *numSamples = numFrames;
- bytesPerFrame = extSndHdrP->numChannels * (extSndHdrP->sampleSize / 8);
- samplesPerFrame = 1;
- *sndDataSize = numFrames * bytesPerFrame;
- sampleDataOffset = (Ptr)(&extSndHdrP->sampleArea) - (Ptr)extSndHdrP;
- }
- break;
-
- case cmpSH:
- {
- CmpSoundHeaderPtr cmpSndHdrP;
-
- cmpSndHdrP = (CmpSoundHeaderPtr)sndHdrPtr;
- sndDescPtr->numChannels = cmpSndHdrP->numChannels;
- // number of channels of sound
- sndDescPtr->sampleSize = cmpSndHdrP->sampleSize;
- // number of bits per sample before compression
- sndDescPtr->sampleRate = cmpSndHdrP->sampleRate;
- // sample rate
- numFrames = cmpSndHdrP->numFrames;
- sampleDataOffset = (Ptr)(&cmpSndHdrP->sampleArea) - (Ptr)cmpSndHdrP;
- switch (cmpSndHdrP->compressionID)
- {
- case threeToOne:
- sndDescPtr->dataFormat = 'MAC3';
- // compressed 3:1 data
- samplesPerFrame = kMACEBeginningNumberOfBytes;
- *numSamples = numFrames * samplesPerFrame;
- switch (cmpSndHdrP->numChannels)
- {
- case 1:
- bytesPerFrame = cmpSndHdrP->numChannels * kMACE31MonoPacketSize;
- break;
- case 2:
- bytesPerFrame = cmpSndHdrP->numChannels * kMACE31StereoPacketSize;
- break;
- default:
- CheckError(-1, "\pCorrupt sound data");
- break;
- }
- *sndDataSize = numFrames * bytesPerFrame;
- break;
- case sixToOne:
- sndDescPtr->dataFormat = 'MAC6';
- // compressed 6:1 data
- samplesPerFrame = kMACEBeginningNumberOfBytes;
- *numSamples = numFrames * samplesPerFrame;
- switch (cmpSndHdrP->numChannels)
- {
- case 1:
- bytesPerFrame = cmpSndHdrP->numChannels * kMACE61MonoPacketSize;
- break;
- case 2:
- bytesPerFrame = cmpSndHdrP->numChannels * kMACE61StereoPacketSize;
- break;
- default:
- CheckError(-1, "\pCorrupt sound data");
- break;
- }
- *sndDataSize = (*numSamples) * bytesPerFrame;
- break;
- default:
- CheckError(-1, "\pCorrupt sound data");
- break;
- }
- } // switch cmpSndHdrP->compressionID:*/
- break; // of cmpSH:
-
- default:
- CheckError(-1, "\pCorrupt sound data");
- break;
-
- } // switch sndHdrPtr->encode*/
- *sndDataOffset = sndHdrOffset + sampleDataOffset;
- }
-
-
-