/ src / CoreAudio / include / AudioToolbox / AudioFile.h
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