1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * This header file defines the .aiff audio file format. 29 */ 30 31 #ifndef _AIFF_H 32 #define _AIFF_H 33 34 #include <sys/types.h> 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 /* 41 * Define the on-disk audio file header for the aiff file format. 42 * By definition .aiff files are big endian. Macros are provided 43 * to make the conversion easier. 44 * 45 * As many file formats, .aiff is composed of "chunks" of data grouped 46 * together. The aiff specification states that chunks may be in any 47 * order. Thus it is not possible to create a condensed header structure 48 * as is possible with .aif or .wav. 49 * 50 * The first chunk is always a FORM chunk. All other chunks have the 51 * following form: 52 * 53 * Chunk ID 54 * Chunk Data Size 55 * Data 56 * 57 * AIFF files must have FORM, COMM, and SSND chunks. All other chunks 58 * can be ignored. When a chunk with an unknown ID is found then the 59 * application should read the next integer to get the size and then 60 * seek past the unknown chunk to the next chunk. 61 * 62 * When building a .aiff header the size of the data isn't always known. 63 * The following define is used for that situation. 64 */ 65 #define AUDIO_AIFF_UNKNOWN_SIZE (~0) 66 67 struct aiff_hdr_chunk { 68 uint32_t aiff_hdr_ID; /* initial chunk ID */ 69 uint32_t aiff_hdr_size; /* file_size - aiff_hdr_chunk */ 70 uint32_t aiff_hdr_data_type; /* file data type */ 71 }; 72 typedef struct aiff_hdr_chunk aiff_hdr_chunk_t; 73 74 /* define for aiff_hdr_chunk.aiff_hdr_ID */ 75 #define AUDIO_AIFF_HDR_CHUNK_ID ((uint32_t)0x464f524d) /* 'FORM' */ 76 77 /* define for audio form type */ 78 #define AUDIO_AIFF_HDR_FORM_AIFF ((uint32_t)0x41494646) /* 'AIFF' */ 79 80 /* 81 * The COMMon chunk definitions. Due to an unfortunate layout, the integer 82 * aiff_comm_frames is not on a 4 byte boundary, which most compilers pad to 83 * put back onto an integer boundary. Thus it is implemented as 4 chars which 84 * gets around this. There are convenience macros to aid in getting and setting 85 * the value. Also, some compilers will pad the end of the data structure to 86 * place it on a 4 byte boundary, thus sizeof (aiff_comm_chunk_t) is off by 87 * 2 bytes. Use AIFF_COMM_CHUNK_SIZE instead. 88 */ 89 #define AUDIO_AIFF_COMM_SR_SIZE 10 90 #define AUDIO_AIFF_COMM_CHUNK_SIZE 26 91 92 struct aiff_comm_chunk { 93 uint32_t aiff_comm_ID; /* chunk ID */ 94 uint32_t aiff_comm_size; /* size without _ID and _size */ 95 uint16_t aiff_comm_channels; /* number of channels */ 96 uint8_t aiff_comm_frames[4]; /* sample frames */ 97 int16_t aiff_comm_sample_size; /* bits in each sample */ 98 uint8_t aiff_comm_sample_rate[AUDIO_AIFF_COMM_SR_SIZE]; 99 /* SR in float */ 100 }; 101 typedef struct aiff_comm_chunk aiff_comm_chunk_t; 102 103 /* define for aiff_comm_chunk.aiff_comm_ID */ 104 #define AUDIO_AIFF_COMM_ID ((uint32_t)0x434f4d4d) /* 'COMM' */ 105 106 /* define for aiff_comm_chunk.aiff_comm_size */ 107 #define AUDIO_AIFF_COMM_SIZE 18 108 109 /* define for aiff_comm_chunk.aiff_comm_channels */ 110 #define AUDIO_AIFF_COMM_CHANNELS_MONO 1 111 #define AUDIO_AIFF_COMM_CHANNELS_STEREO 2 112 113 /* defines to get and set the frame count */ 114 #define AUDIO_AIFF_COMM_FRAMES2INT(X) \ 115 (((X)[0] << 24) | ((X)[1] << 16) | ((X)[2] << 8) | (X)[3]) 116 #define AUDIO_AIFF_COMM_INT2FRAMES(X, D) \ 117 (X)[0] = (D) >> 24; (X)[1] = (D) >> 16; (X)[2] = (D) >> 8; (X)[3] = (D); 118 119 /* define for aiff_comm_chunk.aiff_comm_sample_size */ 120 #define AUDIO_AIFF_COMM_8_BIT_SAMPLE_SIZE 8 121 #define AUDIO_AIFF_COMM_16_BIT_SAMPLE_SIZE 16 122 123 124 /* 125 * The SSND chunk definitions. Sound data immediately follows this data 126 * structure. Use aiff_ssnd_block_size to move past the data. The size of 127 * audio is aiff_ssnd_size - 8. 128 */ 129 struct aiff_ssnd_chunk { 130 uint32_t aiff_ssnd_ID; /* chunk ID */ 131 uint32_t aiff_ssnd_size; /* size without _id and _size */ 132 uint32_t aiff_ssnd_offset; /* offset to frame beginning */ 133 uint32_t aiff_ssnd_block_size; /* block size */ 134 }; 135 typedef struct aiff_ssnd_chunk aiff_ssnd_chunk_t; 136 137 /* define for aiff_ssnd_chunk.aiff_ssnd_ID */ 138 #define AUDIO_AIFF_SSND_ID ((uint32_t)0x53534e44) /* 'SSND' */ 139 140 /* byte swapping macros */ 141 #if defined(__BIG_ENDIAN) 142 #define AUDIO_AIFF_FILE2HOST_INT(from, to) \ 143 *((int *)(to)) = *((int *)(from)) 144 #define AUDIO_AIFF_FILE2HOST_SHORT(from, to) \ 145 *((short *)(to)) = *((short *)(from)) 146 #define AUDIO_AIFF_HOST2FILE_INT(from, to) \ 147 *((int *)(to)) = *((int *)(from)) 148 #define AUDIO_AIFF_HOST2FILE_SHORT(from, to) \ 149 *((short *)(to)) = *((short *)(from)) 150 #elif defined(_LITTLE_ENDIAN) 151 #define AUDIO_AIFF_FILE2HOST_INT(from, to) \ 152 (*to) = ((((*from) >> 24) & 0xff) | (((*from) & 0xff) << 24) | \ 153 (((*from) >> 8) & 0xff00) | (((*from) & 0xff00) << 8)) 154 #define AUDIO_AIFF_FILE2HOST_SHORT(from, to) \ 155 (*to) = ((((*from) >> 8) & 0xff) | (((*from) & 0xff) << 8)) 156 #define AUDIO_AIFF_HOST2FILE_INT(from, to) \ 157 AUDIO_AIFF_FILE2HOST_INT((from), (to)) 158 #define AUDIO_AIFF_HOST2FILE_SHORT(from, to) \ 159 AUDIO_AIFF_FILE2HOST_SHORT((from), (to)) 160 #else 161 #error unknown machine type; 162 #endif /* byte swapping */ 163 164 165 #ifdef __cplusplus 166 } 167 #endif 168 169 #endif /* _AIFF_H */ 170