/* Init() - initialize the decoder with the given configuration */ int32_t alac_decoder_init (ALAC_DECODER *p, void * inMagicCookie, uint32_t inMagicCookieSize) { int32_t status = ALAC_noErr; ALACSpecificConfig theConfig; uint8_t * theActualCookie = (uint8_t *)inMagicCookie; uint32_t theCookieBytesRemaining = inMagicCookieSize; // For historical reasons the decoder needs to be resilient to magic cookies vended by older encoders. // As specified in the ALACMagicCookieDescription.txt document, there may be additional data encapsulating // the ALACSpecificConfig. This would consist of format ('frma') and 'alac' atoms which precede the // ALACSpecificConfig. // See ALACMagicCookieDescription.txt for additional documentation concerning the 'magic cookie' // skip format ('frma') atom if present if (theActualCookie[4] == 'f' && theActualCookie[5] == 'r' && theActualCookie[6] == 'm' && theActualCookie[7] == 'a') { theActualCookie += 12; theCookieBytesRemaining -= 12; } // skip 'alac' atom header if present if (theActualCookie[4] == 'a' && theActualCookie[5] == 'l' && theActualCookie[6] == 'a' && theActualCookie[7] == 'c') { theActualCookie += 12; theCookieBytesRemaining -= 12; } // read the ALACSpecificConfig if (theCookieBytesRemaining >= sizeof(ALACSpecificConfig)) { theConfig.frameLength = Swap32BtoN(((ALACSpecificConfig *)theActualCookie)->frameLength); if (theConfig.frameLength > ALAC_FRAME_LENGTH) return fALAC_FrameLengthError ; theConfig.compatibleVersion = ((ALACSpecificConfig *)theActualCookie)->compatibleVersion; theConfig.bitDepth = ((ALACSpecificConfig *)theActualCookie)->bitDepth; theConfig.pb = ((ALACSpecificConfig *)theActualCookie)->pb; theConfig.mb = ((ALACSpecificConfig *)theActualCookie)->mb; theConfig.kb = ((ALACSpecificConfig *)theActualCookie)->kb; theConfig.numChannels = ((ALACSpecificConfig *)theActualCookie)->numChannels; theConfig.maxRun = Swap16BtoN(((ALACSpecificConfig *)theActualCookie)->maxRun); theConfig.maxFrameBytes = Swap32BtoN(((ALACSpecificConfig *)theActualCookie)->maxFrameBytes); theConfig.avgBitRate = Swap32BtoN(((ALACSpecificConfig *)theActualCookie)->avgBitRate); theConfig.sampleRate = Swap32BtoN(((ALACSpecificConfig *)theActualCookie)->sampleRate); p->mConfig = theConfig; RequireAction( p->mConfig.compatibleVersion <= kALACVersion, return kALAC_ParamError; );
extern "C" int apple_alac_decode_frame(unsigned char *sampleBuffer, uint32_t bufferLength, unsigned char *dest, int *outsize) { uint32_t numFrames = 0; BitBuffer theInputBuffer; BitBufferInit(&theInputBuffer, sampleBuffer, bufferLength); theDecoder->Decode(&theInputBuffer, dest, Swap32BtoN(cookie.config.frameLength), cookie.config.numChannels, &numFrames); *outsize = numFrames; return 0; }