From bb771cef9754f51f5790f7826473d8aaf9f14262 Mon Sep 17 00:00:00 2001 From: Ashley Date: Sun, 12 Feb 2023 09:16:48 +0000 Subject: [PATCH] upload alac source code --- alac/codec/ALACAudioTypes.h | 197 ++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 alac/codec/ALACAudioTypes.h diff --git a/alac/codec/ALACAudioTypes.h b/alac/codec/ALACAudioTypes.h new file mode 100644 index 0000000..f30e334 --- /dev/null +++ b/alac/codec/ALACAudioTypes.h @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2011 Apple Inc. All rights reserved. + * + * @APPLE_APACHE_LICENSE_HEADER_START@ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @APPLE_APACHE_LICENSE_HEADER_END@ + */ + +/* + File: ALACAudioTypes.h +*/ + +#ifndef ALACAUDIOTYPES_H +#define ALACAUDIOTYPES_H + +#if PRAGMA_ONCE +#pragma once +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if PRAGMA_STRUCT_ALIGN + #pragma options align=mac68k +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack(push, 2) +#elif PRAGMA_STRUCT_PACK + #pragma pack(2) +#endif + +#include + +#if defined(__ppc__) +#define TARGET_RT_BIG_ENDIAN 1 +#elif defined(__ppc64__) +#define TARGET_RT_BIG_ENDIAN 1 +#endif + +#define kChannelAtomSize 12 + +enum +{ + kALAC_UnimplementedError = -4, + kALAC_FileNotFoundError = -43, + kALAC_ParamError = -50, + kALAC_MemFullError = -108 +}; + +enum +{ + kALACFormatAppleLossless = 'alac', + kALACFormatLinearPCM = 'lpcm' +}; + +enum +{ + kALACMaxChannels = 8, + kALACMaxEscapeHeaderBytes = 8, + kALACMaxSearches = 16, + kALACMaxCoefs = 16, + kALACDefaultFramesPerPacket = 4096 +}; + +typedef uint32_t ALACChannelLayoutTag; + +enum +{ + kALACFormatFlagIsFloat = (1 << 0), // 0x1 + kALACFormatFlagIsBigEndian = (1 << 1), // 0x2 + kALACFormatFlagIsSignedInteger = (1 << 2), // 0x4 + kALACFormatFlagIsPacked = (1 << 3), // 0x8 + kALACFormatFlagIsAlignedHigh = (1 << 4), // 0x10 +}; + +enum +{ +#if TARGET_RT_BIG_ENDIAN + kALACFormatFlagsNativeEndian = kALACFormatFlagIsBigEndian +#else + kALACFormatFlagsNativeEndian = 0 +#endif +}; + +// this is required to be an IEEE 64bit float +typedef double alac_float64_t; + +// These are the Channel Layout Tags used in the Channel Layout Info portion of the ALAC magic cookie +enum +{ + kALACChannelLayoutTag_Mono = (100<<16) | 1, // C + kALACChannelLayoutTag_Stereo = (101<<16) | 2, // L R + kALACChannelLayoutTag_MPEG_3_0_B = (113<<16) | 3, // C L R + kALACChannelLayoutTag_MPEG_4_0_B = (116<<16) | 4, // C L R Cs + kALACChannelLayoutTag_MPEG_5_0_D = (120<<16) | 5, // C L R Ls Rs + kALACChannelLayoutTag_MPEG_5_1_D = (124<<16) | 6, // C L R Ls Rs LFE + kALACChannelLayoutTag_AAC_6_1 = (142<<16) | 7, // C L R Ls Rs Cs LFE + kALACChannelLayoutTag_MPEG_7_1_B = (127<<16) | 8 // C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC) +}; + +// ALAC currently only utilizes these channels layouts. There is a one for one correspondance between a +// given number of channels and one of these layout tags +static const ALACChannelLayoutTag ALACChannelLayoutTags[kALACMaxChannels] = +{ + kALACChannelLayoutTag_Mono, // C + kALACChannelLayoutTag_Stereo, // L R + kALACChannelLayoutTag_MPEG_3_0_B, // C L R + kALACChannelLayoutTag_MPEG_4_0_B, // C L R Cs + kALACChannelLayoutTag_MPEG_5_0_D, // C L R Ls Rs + kALACChannelLayoutTag_MPEG_5_1_D, // C L R Ls Rs LFE + kALACChannelLayoutTag_AAC_6_1, // C L R Ls Rs Cs LFE + kALACChannelLayoutTag_MPEG_7_1_B // C Lc Rc L R Ls Rs LFE (doc: IS-13818-7 MPEG2-AAC) +}; + +// AudioChannelLayout from CoreAudioTypes.h. We never need the AudioChannelDescription so we remove it +struct ALACAudioChannelLayout +{ + ALACChannelLayoutTag mChannelLayoutTag; + uint32_t mChannelBitmap; + uint32_t mNumberChannelDescriptions; +}; +typedef struct ALACAudioChannelLayout ALACAudioChannelLayout; + +struct AudioFormatDescription +{ + alac_float64_t mSampleRate; + uint32_t mFormatID; + uint32_t mFormatFlags; + uint32_t mBytesPerPacket; + uint32_t mFramesPerPacket; + uint32_t mBytesPerFrame; + uint32_t mChannelsPerFrame; + uint32_t mBitsPerChannel; + uint32_t mReserved; +}; +typedef struct AudioFormatDescription AudioFormatDescription; + +/* Lossless Definitions */ + +enum +{ + kALACCodecFormat = 'alac', + kALACVersion = 0, + kALACCompatibleVersion = kALACVersion, + kALACDefaultFrameSize = 4096 +}; + +// note: this struct is wrapped in an 'alac' atom in the sample description extension area +// note: in QT movies, it will be further wrapped in a 'wave' atom surrounded by 'frma' and 'term' atoms +typedef struct ALACSpecificConfig +{ + uint32_t frameLength; + uint8_t compatibleVersion; + uint8_t bitDepth; // max 32 + uint8_t pb; // 0 <= pb <= 255 + uint8_t mb; + uint8_t kb; + uint8_t numChannels; + uint16_t maxRun; + uint32_t maxFrameBytes; + uint32_t avgBitRate; + uint32_t sampleRate; + +} ALACSpecificConfig; + + +// The AudioChannelLayout atom type is not exposed yet so define it here +enum +{ + AudioChannelLayoutAID = 'chan' +}; + +#if PRAGMA_STRUCT_ALIGN + #pragma options align=reset +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack(pop) +#elif PRAGMA_STRUCT_PACK + #pragma pack() +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ALACAUDIOTYPES_H */