AudioFile.h
1 #ifndef AUDIOFILE_H 2 #define AUDIOFILE_H 3 4 #include <CoreServices/MacTypes.h> 5 #include <CoreFoundation/CFURL.h> 6 #include <CoreAudio/AudioHardware.h> 7 8 #ifdef __cplusplus 9 extern "C" { 10 #endif 11 12 typedef UInt32 AudioFileTypeID; 13 enum { 14 kAudioFileAIFFType = 'AIFF', 15 kAudioFileAIFCType = 'AIFC', 16 kAudioFileWAVEType = 'WAVE', 17 kAudioFileRF64Type = 'RF64', 18 kAudioFileSoundDesigner2Type = 'Sd2f', 19 kAudioFileNextType = 'NeXT', 20 kAudioFileMP3Type = 'MPG3', 21 kAudioFileMP2Type = 'MPG2', 22 kAudioFileMP1Type = 'MPG1', 23 kAudioFileAC3Type = 'ac-3', 24 kAudioFileAAC_ADTSType = 'adts', 25 kAudioFileMPEG4Type = 'mp4f', 26 kAudioFileM4AType = 'm4af', 27 kAudioFileM4BType = 'm4bf', 28 kAudioFileCAFType = 'caff', 29 kAudioFile3GPType = '3gpp', 30 kAudioFile3GP2Type = '3gp2', 31 kAudioFileAMRType = 'amrf', 32 kAudioFileFLACType = 'flac' 33 }; 34 enum { 35 kAudioFileUnspecifiedError = 'wht?', 36 kAudioFileUnsupportedFileTypeError = 'typ?', 37 kAudioFileUnsupportedDataFormatError = 'fmt?', 38 kAudioFileUnsupportedPropertyError = 'pty?', 39 kAudioFileBadPropertySizeError = '!siz', 40 kAudioFilePermissionsError = 'prm?', 41 kAudioFileNotOptimizedError = 'optm', 42 43 kAudioFileInvalidChunkError = 'chk?', 44 kAudioFileDoesNotAllow64BitDataSizeError = 'off?', 45 kAudioFileInvalidPacketOffsetError = 'pck?', 46 kAudioFileInvalidFileError = 'dta?', 47 kAudioFileOperationNotSupportedError = 0x6F703F3F, 48 49 kAudioFileNotOpenError = -38, 50 kAudioFileEndOfFileError = -39, 51 kAudioFilePositionError = -40, 52 kAudioFileFileNotFoundError = -43 53 }; 54 typedef UInt32 AudioFileFlags; enum { 55 kAudioFileFlags_EraseFile = 1, 56 kAudioFileFlags_DontPageAlignAudioData = 2 57 }; 58 59 typedef SInt8 AudioFilePermissions; enum { 60 kAudioFileReadPermission = 0x01, 61 kAudioFileWritePermission = 0x02, 62 kAudioFileReadWritePermission = 0x03 63 }; 64 typedef struct OpaqueAudioFileID *AudioFileID; 65 66 67 68 69 typedef UInt32 AudioFilePropertyID; 70 enum { 71 kAudioFileLoopDirection_NoLooping = 0, 72 kAudioFileLoopDirection_Forward = 1, 73 kAudioFileLoopDirection_ForwardAndBackward = 2, 74 kAudioFileLoopDirection_Backward = 3 75 }; 76 struct AudioFile_SMPTE_Time 77 { 78 SInt8 mHours; 79 UInt8 mMinutes; 80 UInt8 mSeconds; 81 UInt8 mFrames; 82 UInt32 mSubFrameSampleOffset; 83 }; 84 typedef struct AudioFile_SMPTE_Time AudioFile_SMPTE_Time; 85 86 87 88 89 90 91 92 enum { 93 kAudioFileMarkerType_Generic = 0, 94 }; 95 struct AudioFileMarker 96 { 97 Float64 mFramePosition; 98 99 CFStringRef _Nullable mName; 100 SInt32 mMarkerID; 101 102 AudioFile_SMPTE_Time mSMPTETime; 103 UInt32 mType; 104 UInt16 mReserved; 105 UInt16 mChannel; 106 }; 107 typedef struct AudioFileMarker AudioFileMarker; 108 struct AudioFileMarkerList 109 { 110 UInt32 mSMPTE_TimeType; 111 UInt32 mNumberMarkers; 112 AudioFileMarker mMarkers[1]; 113 }; 114 typedef struct AudioFileMarkerList AudioFileMarkerList; 115 static __inline__ __attribute__((always_inline)) size_t NumBytesToNumAudioFileMarkers(size_t inNumBytes) 116 { 117 return (inNumBytes<__builtin_offsetof(AudioFileMarkerList, mMarkers[0]) ? 0 : (inNumBytes - __builtin_offsetof(AudioFileMarkerList, mMarkers[0])) / sizeof(AudioFileMarker)); 118 } 119 static __inline__ __attribute__((always_inline)) size_t NumAudioFileMarkersToNumBytes(size_t inNumMarkers) 120 { 121 return (__builtin_offsetof(AudioFileMarkerList, mMarkers) + (inNumMarkers) * sizeof(AudioFileMarker)); 122 } 123 typedef UInt32 AudioFileRegionFlags; enum { 124 kAudioFileRegionFlag_LoopEnable = 1, 125 kAudioFileRegionFlag_PlayForward = 2, 126 kAudioFileRegionFlag_PlayBackward = 4 127 }; 128 struct AudioFileRegion 129 { 130 UInt32 mRegionID; 131 CFStringRef mName; 132 AudioFileRegionFlags mFlags; 133 UInt32 mNumberMarkers; 134 AudioFileMarker mMarkers[1]; 135 }; 136 typedef struct AudioFileRegion AudioFileRegion; 137 struct AudioFileRegionList 138 { 139 UInt32 mSMPTE_TimeType; 140 UInt32 mNumberRegions; 141 AudioFileRegion mRegions[1]; 142 }; 143 typedef struct AudioFileRegionList AudioFileRegionList; 144 static __inline__ __attribute__((always_inline)) AudioFileRegion *NextAudioFileRegion(const AudioFileRegion *inAFRegionPtr) 145 { 146 return ((AudioFileRegion*)((char*)inAFRegionPtr + __builtin_offsetof(AudioFileRegion, mMarkers) + (inAFRegionPtr->mNumberMarkers)*sizeof(AudioFileMarker))); 147 } 148 struct AudioFramePacketTranslation 149 { 150 SInt64 mFrame; 151 SInt64 mPacket; 152 UInt32 mFrameOffsetInPacket; 153 }; 154 typedef struct AudioFramePacketTranslation AudioFramePacketTranslation; 155 typedef UInt32 AudioBytePacketTranslationFlags; enum { 156 kBytePacketTranslationFlag_IsEstimate = 1 157 }; 158 struct AudioBytePacketTranslation 159 { 160 SInt64 mByte; 161 SInt64 mPacket; 162 UInt32 mByteOffsetInPacket; 163 AudioBytePacketTranslationFlags mFlags; 164 }; 165 typedef struct AudioBytePacketTranslation AudioBytePacketTranslation; 166 struct AudioFilePacketTableInfo 167 { 168 SInt64 mNumberValidFrames; 169 SInt32 mPrimingFrames; 170 SInt32 mRemainderFrames; 171 }; 172 typedef struct AudioFilePacketTableInfo AudioFilePacketTableInfo; 173 extern OSStatus 174 AudioFileCreateWithURL (CFURLRef inFileRef, 175 AudioFileTypeID inFileType, 176 const AudioStreamBasicDescription *inFormat, 177 AudioFileFlags inFlags, 178 AudioFileID _Nullable * _Nonnull outAudioFile); 179 extern OSStatus 180 AudioFileOpenURL ( CFURLRef inFileRef, 181 AudioFilePermissions inPermissions, 182 AudioFileTypeID inFileTypeHint, 183 AudioFileID _Nullable * _Nonnull outAudioFile); 184 typedef OSStatus (*AudioFile_ReadProc)( 185 void * inClientData, 186 SInt64 inPosition, 187 UInt32 requestCount, 188 void * buffer, 189 UInt32 * actualCount); 190 typedef OSStatus (*AudioFile_WriteProc)( 191 void * inClientData, 192 SInt64 inPosition, 193 UInt32 requestCount, 194 const void *buffer, 195 UInt32 * actualCount); 196 typedef SInt64 (*AudioFile_GetSizeProc)( 197 void * inClientData); 198 typedef OSStatus (*AudioFile_SetSizeProc)( 199 void * inClientData, 200 SInt64 inSize); 201 extern OSStatus 202 AudioFileInitializeWithCallbacks ( 203 void * inClientData, 204 AudioFile_ReadProc inReadFunc, 205 AudioFile_WriteProc inWriteFunc, 206 AudioFile_GetSizeProc inGetSizeFunc, 207 AudioFile_SetSizeProc inSetSizeFunc, 208 AudioFileTypeID inFileType, 209 const AudioStreamBasicDescription *inFormat, 210 AudioFileFlags inFlags, 211 AudioFileID _Nullable * _Nonnull outAudioFile); 212 extern OSStatus 213 AudioFileOpenWithCallbacks ( 214 void * inClientData, 215 AudioFile_ReadProc inReadFunc, 216 AudioFile_WriteProc _Nullable inWriteFunc, 217 AudioFile_GetSizeProc inGetSizeFunc, 218 AudioFile_SetSizeProc _Nullable inSetSizeFunc, 219 AudioFileTypeID inFileTypeHint, 220 AudioFileID _Nullable * _Nonnull outAudioFile); 221 extern OSStatus 222 AudioFileClose (AudioFileID inAudioFile); 223 extern OSStatus 224 AudioFileOptimize (AudioFileID inAudioFile); 225 extern OSStatus 226 AudioFileReadBytes ( AudioFileID inAudioFile, 227 Boolean inUseCache, 228 SInt64 inStartingByte, 229 UInt32 *ioNumBytes, 230 void *outBuffer); 231 extern OSStatus 232 AudioFileWriteBytes ( AudioFileID inAudioFile, 233 Boolean inUseCache, 234 SInt64 inStartingByte, 235 UInt32 *ioNumBytes, 236 const void *inBuffer); 237 extern OSStatus 238 AudioFileReadPacketData ( AudioFileID inAudioFile, 239 Boolean inUseCache, 240 UInt32 * ioNumBytes, 241 AudioStreamPacketDescription * _Nullable outPacketDescriptions, 242 SInt64 inStartingPacket, 243 UInt32 * ioNumPackets, 244 void * _Nullable outBuffer); 245 extern OSStatus 246 AudioFileReadPackets ( AudioFileID inAudioFile, 247 Boolean inUseCache, 248 UInt32 * outNumBytes, 249 AudioStreamPacketDescription * _Nullable outPacketDescriptions, 250 SInt64 inStartingPacket, 251 UInt32 * ioNumPackets, 252 void * _Nullable outBuffer); 253 extern OSStatus 254 AudioFileWritePackets ( AudioFileID inAudioFile, 255 Boolean inUseCache, 256 UInt32 inNumBytes, 257 const AudioStreamPacketDescription * _Nullable inPacketDescriptions, 258 SInt64 inStartingPacket, 259 UInt32 *ioNumPackets, 260 const void *inBuffer); 261 extern OSStatus 262 AudioFileCountUserData ( AudioFileID inAudioFile, 263 UInt32 inUserDataID, 264 UInt32 *outNumberItems); 265 extern OSStatus 266 AudioFileGetUserDataSize ( AudioFileID inAudioFile, 267 UInt32 inUserDataID, 268 UInt32 inIndex, 269 UInt32 *outUserDataSize); 270 extern OSStatus 271 AudioFileGetUserData ( AudioFileID inAudioFile, 272 UInt32 inUserDataID, 273 UInt32 inIndex, 274 UInt32 *ioUserDataSize, 275 void *outUserData); 276 extern OSStatus 277 AudioFileSetUserData ( AudioFileID inAudioFile, 278 UInt32 inUserDataID, 279 UInt32 inIndex, 280 UInt32 inUserDataSize, 281 const void *inUserData); 282 extern OSStatus 283 AudioFileRemoveUserData ( AudioFileID inAudioFile, 284 UInt32 inUserDataID, 285 UInt32 inIndex); 286 enum 287 { 288 kAudioFilePropertyFileFormat = 'ffmt', 289 kAudioFilePropertyDataFormat = 'dfmt', 290 kAudioFilePropertyIsOptimized = 'optm', 291 kAudioFilePropertyMagicCookieData = 'mgic', 292 kAudioFilePropertyAudioDataByteCount = 'bcnt', 293 kAudioFilePropertyAudioDataPacketCount = 'pcnt', 294 kAudioFilePropertyMaximumPacketSize = 'psze', 295 kAudioFilePropertyDataOffset = 'doff', 296 kAudioFilePropertyChannelLayout = 'cmap', 297 kAudioFilePropertyDeferSizeUpdates = 'dszu', 298 kAudioFilePropertyDataFormatName = 'fnme', 299 kAudioFilePropertyMarkerList = 'mkls', 300 kAudioFilePropertyRegionList = 'rgls', 301 kAudioFilePropertyPacketToFrame = 'pkfr', 302 kAudioFilePropertyFrameToPacket = 'frpk', 303 kAudioFilePropertyPacketToByte = 'pkby', 304 kAudioFilePropertyByteToPacket = 'bypk', 305 kAudioFilePropertyChunkIDs = 'chid', 306 kAudioFilePropertyInfoDictionary = 'info', 307 kAudioFilePropertyPacketTableInfo = 'pnfo', 308 kAudioFilePropertyFormatList = 'flst', 309 kAudioFilePropertyPacketSizeUpperBound = 'pkub', 310 kAudioFilePropertyReserveDuration = 'rsrv', 311 kAudioFilePropertyEstimatedDuration = 'edur', 312 kAudioFilePropertyBitRate = 'brat', 313 kAudioFilePropertyID3Tag = 'id3t', 314 kAudioFilePropertySourceBitDepth = 'sbtd', 315 kAudioFilePropertyAlbumArtwork = 'aart', 316 kAudioFilePropertyAudioTrackCount = 'atct', 317 kAudioFilePropertyUseAudioTrack = 'uatk' 318 }; 319 extern OSStatus 320 AudioFileGetPropertyInfo( AudioFileID inAudioFile, 321 AudioFilePropertyID inPropertyID, 322 UInt32 * _Nullable outDataSize, 323 UInt32 * _Nullable isWritable); 324 extern OSStatus 325 AudioFileGetProperty( AudioFileID inAudioFile, 326 AudioFilePropertyID inPropertyID, 327 UInt32 *ioDataSize, 328 void *outPropertyData); 329 extern OSStatus 330 AudioFileSetProperty( AudioFileID inAudioFile, 331 AudioFilePropertyID inPropertyID, 332 UInt32 inDataSize, 333 const void *inPropertyData); 334 enum 335 { 336 kAudioFileGlobalInfo_ReadableTypes = 'afrf', 337 kAudioFileGlobalInfo_WritableTypes = 'afwf', 338 kAudioFileGlobalInfo_FileTypeName = 'ftnm', 339 kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat = 'sdid', 340 kAudioFileGlobalInfo_AvailableFormatIDs = 'fmid', 341 342 kAudioFileGlobalInfo_AllExtensions = 'alxt', 343 kAudioFileGlobalInfo_AllHFSTypeCodes = 'ahfs', 344 kAudioFileGlobalInfo_AllUTIs = 'auti', 345 kAudioFileGlobalInfo_AllMIMETypes = 'amim', 346 347 kAudioFileGlobalInfo_ExtensionsForType = 'fext', 348 kAudioFileGlobalInfo_HFSTypeCodesForType = 'fhfs', 349 kAudioFileGlobalInfo_UTIsForType = 'futi', 350 kAudioFileGlobalInfo_MIMETypesForType = 'fmim', 351 352 kAudioFileGlobalInfo_TypesForMIMEType = 'tmim', 353 kAudioFileGlobalInfo_TypesForUTI = 'tuti', 354 kAudioFileGlobalInfo_TypesForHFSTypeCode = 'thfs', 355 kAudioFileGlobalInfo_TypesForExtension = 'text' 356 }; 357 struct AudioFileTypeAndFormatID 358 { 359 AudioFileTypeID mFileType; 360 UInt32 mFormatID; 361 }; 362 typedef struct AudioFileTypeAndFormatID AudioFileTypeAndFormatID; 363 extern OSStatus 364 AudioFileGetGlobalInfoSize( AudioFilePropertyID inPropertyID, 365 UInt32 inSpecifierSize, 366 void * _Nullable inSpecifier, 367 UInt32 *outDataSize); 368 extern OSStatus 369 AudioFileGetGlobalInfo( AudioFilePropertyID inPropertyID, 370 UInt32 inSpecifierSize, 371 void * _Nullable inSpecifier, 372 UInt32 *ioDataSize, 373 void *outPropertyData); 374 375 376 377 struct FSRef; 378 extern OSStatus 379 AudioFileCreate ( const struct FSRef *inParentRef, 380 CFStringRef inFileName, 381 AudioFileTypeID inFileType, 382 const AudioStreamBasicDescription *inFormat, 383 AudioFileFlags inFlags, 384 struct FSRef *outNewFileRef, 385 AudioFileID _Nullable * _Nonnull outAudioFile); 386 extern OSStatus 387 AudioFileInitialize ( const struct FSRef *inFileRef, 388 AudioFileTypeID inFileType, 389 const AudioStreamBasicDescription *inFormat, 390 AudioFileFlags inFlags, 391 AudioFileID _Nullable * _Nonnull outAudioFile); 392 extern OSStatus 393 AudioFileOpen ( const struct FSRef *inFileRef, 394 AudioFilePermissions inPermissions, 395 AudioFileTypeID inFileTypeHint, 396 AudioFileID _Nullable * _Nonnull outAudioFile); 397 398 #define kAFInfoDictionary_Album "album" 399 #define kAFInfoDictionary_ApproximateDurationInSeconds "approximate duration in seconds" 400 #define kAFInfoDictionary_Artist "artist" 401 #define kAFInfoDictionary_ChannelLayout "channel layout" 402 #define kAFInfoDictionary_Comments "comments" 403 #define kAFInfoDictionary_Composer "composer" 404 #define kAFInfoDictionary_Copyright "copyright" 405 #define kAFInfoDictionary_EncodingApplication "encoding application" 406 #define kAFInfoDictionary_Genre "genre" 407 #define kAFInfoDictionary_ISRC "ISRC" // International Standard Recording Code 408 #define kAFInfoDictionary_KeySignature "key signature" 409 #define kAFInfoDictionary_Lyricist "lyricist" 410 #define kAFInfoDictionary_NominalBitRate "nominal bit rate" 411 #define kAFInfoDictionary_RecordedDate "recorded date" 412 #define kAFInfoDictionary_SourceBitDepth "source bit depth" 413 #define kAFInfoDictionary_SourceEncoder "source encoder" 414 #define kAFInfoDictionary_SubTitle "subtitle" 415 #define kAFInfoDictionary_Tempo "tempo" 416 #define kAFInfoDictionary_TimeSignature "time signature" 417 #define kAFInfoDictionary_Title "title" 418 #define kAFInfoDictionary_TrackNumber "track number" 419 #define kAFInfoDictionary_Year "year" 420 421 422 #ifdef __cplusplus 423 } 424 #endif 425 426 #endif 427