#ifndef __AIFF_SUPPORT_H__
#include "AIFFSupport.h"
#endif
#ifndef __APPLE_CDDA_FS_DEBUG_H__
#include "AppleCDDAFileSystemDebug.h"
#endif
#ifndef __APPLE_CDDA_FS_VNODE_OPS_H__
#include "AppleCDDAFileSystemVNodeOps.h"
#endif
#include <sys/systm.h>
#include <libkern/OSByteOrder.h>
#if defined(__LITTLE_ENDIAN__)
static void
SwapContainerChunk ( ContainerChunk * chunk );
static void
SwapFormatVersionChunk ( FormatVersionChunk * chunk );
static void
SwapExtCommonChunk ( ExtCommonChunk * chunk );
static void
SwapSoundDataChunk ( SoundDataChunk * chunk );
static void
SwapCDAIFFHeader ( CDAIFFHeader * header );
static void
SwapFloat80 ( Float80 * value );
static void
SwapContainerChunk ( ContainerChunk * chunk )
{
chunk->ckID = OSSwapInt32 ( chunk->ckID );
chunk->ckSize = OSSwapInt32 ( chunk->ckSize );
chunk->formType = OSSwapInt32 ( chunk->formType );
}
static void
SwapFormatVersionChunk ( FormatVersionChunk * chunk )
{
chunk->ckID = OSSwapInt32 ( chunk->ckID );
chunk->ckSize = OSSwapInt32 ( chunk->ckSize );
chunk->timeStamp = OSSwapInt32 ( chunk->timeStamp );
}
static void
SwapExtCommonChunk ( ExtCommonChunk * chunk )
{
SwapFloat80 ( &chunk->sampleRate );
chunk->ckID = OSSwapInt32 ( chunk->ckID );
chunk->ckSize = OSSwapInt32 ( chunk->ckSize );
chunk->numChannels = OSSwapInt16 ( chunk->numChannels );
chunk->numSampleFrames = OSSwapInt32 ( chunk->numSampleFrames );
chunk->sampleSize = OSSwapInt16 ( chunk->sampleSize );
chunk->compressionType = OSSwapInt32 ( chunk->compressionType );
}
static void
SwapSoundDataChunk ( SoundDataChunk * chunk )
{
chunk->ckID = OSSwapInt32 ( chunk->ckID );
chunk->ckSize = OSSwapInt32 ( chunk->ckSize );
chunk->offset = OSSwapInt32 ( chunk->offset );
chunk->blockSize = OSSwapInt32 ( chunk->blockSize );
}
static void
SwapCDAIFFHeader ( CDAIFFHeader * header )
{
SwapContainerChunk ( &header->containerChunk );
SwapFormatVersionChunk ( &header->formatVersionChunk );
SwapExtCommonChunk ( &header->commonChunk );
SwapSoundDataChunk ( &header->soundDataChunk );
}
static void
SwapFloat80 ( Float80 * data )
{
data->exp = OSSwapInt16 ( data->exp );
data->man[0] = OSSwapInt16 ( data->man[0] );
data->man[1] = OSSwapInt16 ( data->man[1] );
data->man[2] = OSSwapInt16 ( data->man[2] );
data->man[3] = OSSwapInt16 ( data->man[3] );
}
#endif
void
BuildCDAIFFHeader ( CDAIFFHeader * header, uint32_t fileSize )
{
ExtCommonChunk * commonChunkPtr = NULL;
SoundDataChunk * soundDataChunkPtr = NULL;
ContainerChunk * containerChunkPtr = NULL;
FormatVersionChunk * formatVersionChunkPtr = NULL;
uint32_t dataSize = fileSize - kPhysicalMediaBlockSize;
commonChunkPtr = &header->commonChunk;
soundDataChunkPtr = &header->soundDataChunk;
containerChunkPtr = &header->containerChunk;
formatVersionChunkPtr = &header->formatVersionChunk;
formatVersionChunkPtr->ckID = kFormatVersionID;
formatVersionChunkPtr->ckSize = ( uint32_t )( sizeof ( FormatVersionChunk ) - sizeof ( ChunkHeader ) );
formatVersionChunkPtr->timeStamp = kAIFCVersion1;
commonChunkPtr->ckID = kCommonID;
commonChunkPtr->ckSize = ( uint32_t )( sizeof ( ExtCommonChunk ) - sizeof ( ChunkHeader ) );
commonChunkPtr->numChannels = kStereo; commonChunkPtr->numSampleFrames = dataSize / 4; commonChunkPtr->sampleSize = k16BitsPerSample; commonChunkPtr->sampleRate.exp = 0x400E; commonChunkPtr->sampleRate.man[0] = 0xAC44; commonChunkPtr->sampleRate.man[1] = 0x0000; commonChunkPtr->sampleRate.man[2] = 0x0000; commonChunkPtr->sampleRate.man[3] = 0x0000;
commonChunkPtr->compressionType = k16BitLittleEndianFormat;
soundDataChunkPtr->ckID = kSoundDataID;
soundDataChunkPtr->offset = ( uint32_t ) ( kPhysicalMediaBlockSize - sizeof ( CDAIFFHeader ) );
soundDataChunkPtr->ckSize = ( uint32_t ) ( ( sizeof ( SoundDataChunk ) - sizeof ( ChunkHeader ) ) +
dataSize + soundDataChunkPtr->offset );
soundDataChunkPtr->blockSize = 0;
containerChunkPtr->ckID = kFormID;
containerChunkPtr->ckSize = ( uint32_t )
( ( sizeof ( ContainerChunk ) - sizeof ( ChunkHeader ) ) + ( formatVersionChunkPtr->ckSize + sizeof ( ChunkHeader ) ) + ( commonChunkPtr->ckSize + sizeof ( ChunkHeader ) ) + ( soundDataChunkPtr->ckSize + sizeof ( ChunkHeader ) ) );
containerChunkPtr->formType = kAIFCID;
#if defined(__LITTLE_ENDIAN__)
SwapCDAIFFHeader ( header );
#endif
}