1 /*
2  * Copyright (c) 2011 Apple Inc. All rights reserved.
3  *
4  * @APPLE_APACHE_LICENSE_HEADER_START@
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * @APPLE_APACHE_LICENSE_HEADER_END@
19  */
20 
21 /*=============================================================================
22     File:		ALACBitUtilities.h
23 
24 	$NoKeywords: $
25 =============================================================================*/
26 
27 #ifndef __ALACBITUTILITIES_H
28 #define __ALACBITUTILITIES_H
29 
30 #include <stdint.h>
31 
32 #ifndef MIN
33 #define MIN(x, y) 			( (x)<(y) ?(x) :(y) )
34 #endif //MIN
35 #ifndef MAX
36 #define MAX(x, y) 			( (x)>(y) ?(x): (y) )
37 #endif //MAX
38 
39 #ifndef nil
40 #define nil NULL
41 #endif
42 
43 #define RequireAction(condition, action)			if (!(condition)) { action }
44 #define RequireActionSilent(condition, action)			if (!(condition)) { action }
45 #define RequireNoErr(condition, action)			if ((condition)) { action }
46 
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
51 enum
52 {
53     ALAC_noErr = 0
54 };
55 
56 
57 typedef enum
58 {
59 
60     ID_SCE = 0,						/* Single Channel Element   */
61     ID_CPE = 1,						/* Channel Pair Element     */
62     ID_CCE = 2,						/* Coupling Channel Element */
63     ID_LFE = 3,						/* LFE Channel Element      */
64     ID_DSE = 4,						/* not yet supported        */
65     ID_PCE = 5,
66     ID_FIL = 6,
67     ID_END = 7
68 } ELEMENT_TYPE;
69 
70 // types
71 typedef struct BitBuffer
72 {
73 	uint8_t *		cur;
74 	uint8_t *		end;
75 	uint32_t		bitIndex;
76 	uint32_t		byteSize;
77 
78 } BitBuffer;
79 
80 /*
81 	BitBuffer routines
82 	- these routines take a fixed size buffer and read/write to it
83 	- bounds checking must be done by the client
84 */
85 void	BitBufferInit( BitBuffer * bits, uint8_t * buffer, uint32_t byteSize );
86 uint32_t	BitBufferRead( BitBuffer * bits, uint8_t numBits );   // note: cannot read more than 16 bits at a time
87 uint8_t	BitBufferReadSmall( BitBuffer * bits, uint8_t numBits );
88 uint8_t	BitBufferReadOne( BitBuffer * bits );
89 uint32_t	BitBufferPeek( BitBuffer * bits, uint8_t numBits );   // note: cannot read more than 16 bits at a time
90 uint32_t	BitBufferPeekOne( BitBuffer * bits );
91 uint32_t	BitBufferUnpackBERSize( BitBuffer * bits );
92 uint32_t	BitBufferGetPosition( BitBuffer * bits );
93 void	BitBufferByteAlign( BitBuffer * bits, int32_t addZeros );
94 void	BitBufferAdvance( BitBuffer * bits, uint32_t numBits );
95 void	BitBufferRewind( BitBuffer * bits, uint32_t numBits );
96 void	BitBufferWrite( BitBuffer * bits, uint32_t value, uint32_t numBits );
97 void	BitBufferReset( BitBuffer * bits);
98 
99 
100 #ifdef __cplusplus
101 }
102 #endif
103 
104 #endif	/* __BITUTILITIES_H */
105