#ifndef __AIFF_SUPPORT_H__
#include "AIFFSupport.h"
#endif
#ifndef __APPLE_CDDA_FS_DEBUG_H__
#include "AppleCDDAFileSystemDebug.h"
#endif
#include <sys/systm.h>
ContainerChunk
EndianContainerChunk_LtoB ( ContainerChunk chunk )
{
chunk.ckID = EndianU32_LtoB ( chunk.ckID );
chunk.ckSize = EndianS32_LtoB ( chunk.ckSize );
chunk.formType = EndianU32_LtoB ( chunk.formType );
return chunk;
}
FormatVersionChunk
EndianFormatVersionChunk_LtoB ( FormatVersionChunk chunk )
{
chunk.ckID = EndianU32_LtoB ( chunk.ckID );
chunk.ckSize = EndianS32_LtoB ( chunk.ckSize );
chunk.timeStamp = EndianU32_LtoB ( chunk.timeStamp );
return chunk;
}
ExtCommonChunk
EndianExtCommonChunk_LtoB ( ExtCommonChunk chunk )
{
chunk.ckID = EndianU32_LtoB ( chunk.ckID );
chunk.ckSize = EndianS32_LtoB ( chunk.ckSize );
chunk.numChannels = EndianS16_LtoB ( chunk.numChannels );
chunk.numSampleFrames = EndianU32_LtoB ( chunk.numSampleFrames );
chunk.sampleSize = EndianS16_LtoB ( chunk.sampleSize );
chunk.compressionType = EndianU32_LtoB ( chunk.compressionType );
chunk.sampleRate = EndianFloat80_LtoB ( chunk.sampleRate );
return chunk;
}
SoundDataChunk
EndianSoundDataChunk_LtoB ( SoundDataChunk chunk )
{
chunk.ckID = EndianU32_LtoB ( chunk.ckID );
chunk.ckSize = EndianS32_LtoB ( chunk.ckSize );
chunk.offset = EndianU32_LtoB ( chunk.offset );
chunk.blockSize = EndianU32_LtoB ( chunk.blockSize );
return chunk;
}
CDAIFFHeader
EndianCDAIFFHeader_LtoB ( CDAIFFHeader header )
{
header.u.AIFFHeader.containerChunk = EndianContainerChunk_LtoB ( header.u.AIFFHeader.containerChunk );
header.u.AIFFHeader.formatVersionChunk = EndianFormatVersionChunk_LtoB ( header.u.AIFFHeader.formatVersionChunk );
header.u.AIFFHeader.commonChunk = EndianExtCommonChunk_LtoB ( header.u.AIFFHeader.commonChunk );
header.u.AIFFHeader.soundDataChunk = EndianSoundDataChunk_LtoB ( header.u.AIFFHeader.soundDataChunk );
return header;
}
Float80
EndianFloat80_LtoB ( Float80 data )
{
data.exp = EndianS16_LtoB ( data.exp );
data.man[0] = EndianU16_LtoB ( data.man[0] );
data.man[1] = EndianU16_LtoB ( data.man[1] );
data.man[2] = EndianU16_LtoB ( data.man[2] );
data.man[3] = EndianU16_LtoB ( data.man[3] );
return data;
}
CDAIFFHeader
BuildCDAIFFHeader ( UInt32 fileSize )
{
CDAIFFHeader header;
ExtCommonChunkPtr commonChunkPtr = NULL;
SoundDataChunkPtr soundDataChunkPtr = NULL;
ContainerChunkPtr containerChunkPtr = NULL;
FormatVersionChunkPtr formatVersionChunkPtr = NULL;
UInt32 dataSize = fileSize - sizeof ( CDAIFFHeader );
bzero ( &header, sizeof ( header ) );
commonChunkPtr = &header.u.AIFFHeader.commonChunk;
soundDataChunkPtr = &header.u.AIFFHeader.soundDataChunk;
containerChunkPtr = &header.u.AIFFHeader.containerChunk;
formatVersionChunkPtr = &header.u.AIFFHeader.formatVersionChunk;
formatVersionChunkPtr->ckID = kFormatVersionID;
formatVersionChunkPtr->ckSize = ( sizeof ( FormatVersionChunk ) - sizeof ( ChunkHeader ) );
formatVersionChunkPtr->timeStamp = kAIFCVersion1;
commonChunkPtr->ckID = kCommonID;
commonChunkPtr->ckSize = ( 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 = sizeof ( header.u.alignedHeader ) - sizeof ( header.u.AIFFHeader );
soundDataChunkPtr->ckSize = ( sizeof ( SoundDataChunk ) - sizeof ( ChunkHeader ) ) +
dataSize + soundDataChunkPtr->offset;
soundDataChunkPtr->blockSize = 0;
containerChunkPtr->ckID = kFormID;
containerChunkPtr->ckSize = ( sizeof ( ContainerChunk ) - sizeof ( ChunkHeader ) ) + ( formatVersionChunkPtr->ckSize + sizeof ( ChunkHeader ) ) + ( commonChunkPtr->ckSize + sizeof ( ChunkHeader ) ) + ( soundDataChunkPtr->ckSize + sizeof ( ChunkHeader ) );
containerChunkPtr->formType = kAIFCID;
header = EndianCDAIFFHeader_NtoB ( header );
return header;
}