123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- /*
- * 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 <stdint.h>
- #if defined(__ppc__)
- #define TARGET_RT_BIG_ENDIAN 1
- #elif defined(__ppc64__)
- #define TARGET_RT_BIG_ENDIAN 1
- #endif
- #define kChannelAtomSize 12
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wmultichar"
-
- 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'
- };
- #pragma GCC diagnostic pop
- #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 */
|