static Boolean MyFileFormatRequiresBigEndian(AudioFileTypeID audioFileType, int bitdepth) { AudioFileTypeAndFormatID ftf; UInt32 propertySize; OSStatus err; Boolean requiresBigEndian; ftf.mFileType = audioFileType; ftf.mFormatID = kAudioFormatLinearPCM; err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, sizeof(ftf), &ftf, &propertySize); if (err) return FALSE; AudioStreamBasicDescription *formats = (AudioStreamBasicDescription *)malloc(propertySize); err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, sizeof(ftf), &ftf, &propertySize, formats); requiresBigEndian = TRUE; if (err == noErr) { int i, nFormats = propertySize / sizeof(AudioStreamBasicDescription); for (i = 0; i < nFormats; ++i) { if (formats[i].mBitsPerChannel == bitdepth && !(formats[i].mFormatFlags & kLinearPCMFormatFlagIsBigEndian)) { requiresBigEndian = FALSE; break; } } } free(formats); return requiresBigEndian; }
void SourceFile::registerSelf() { static const int32_t SOURCE_PRIORITY = 2; IoRegistrar::SourceCreationFunc sourceFunc = SourceFile::createRef; OSStatus err; UInt32 propertySize = 0; err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_ReadableTypes, 0, NULL, &propertySize); if( err ) { //registers no types on error return; } uint32_t * audioTypes = (uint32_t *)malloc(propertySize); err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ReadableTypes, 0, NULL, &propertySize, audioTypes ); if( err ) { //registers no types on error free(audioTypes); return; } int nTypes = propertySize / sizeof(uint32_t); for( int i = 0; i < nTypes; i++ ) { CFArrayRef extensions = NULL; propertySize = sizeof(extensions); err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ExtensionsForType, sizeof(uint32_t), (UInt32 *)&audioTypes[i], &propertySize, &extensions); if ( ! err ) { CFIndex nExtensions = CFArrayGetCount(extensions); for( int j = 0; j < nExtensions; j++ ) { CFStringRef cfext = (CFStringRef)CFArrayGetValueAtIndex(extensions, j); Boolean res = FALSE; char * ext = NULL; uint8_t extLen = 3; while( ! res && extLen < 5 ) { ext = new char[extLen]; res = CFStringGetCString( cfext, ext, extLen * sizeof(char), kCFStringEncodingASCII ); if( res ) { IoRegistrar::registerSourceType( ext, sourceFunc, SOURCE_PRIORITY ); } delete ext; ext = NULL; extLen++; } } } } free(audioTypes); IoRegistrar::registerSourceGeneric( sourceFunc, SOURCE_PRIORITY ); }
CAAudioFileFormats::CAAudioFileFormats(bool loadDataFormats) : mNumFileFormats(0), mFileFormats(NULL) { OSStatus err; UInt32 size; UInt32 *fileTypes = NULL; // get all file types err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size); if (err != noErr) goto bail; mNumFileFormats = size / sizeof(UInt32); mFileFormats = new FileFormatInfo[mNumFileFormats]; fileTypes = new UInt32[mNumFileFormats]; err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size, fileTypes); if (err != noErr) goto bail; // get info for each file type for (int i = 0; i < mNumFileFormats; ++i) { FileFormatInfo *ffi = &mFileFormats[i]; OSType filetype = fileTypes[i]; ffi->mFileTypeID = filetype; // file type name ffi->mFileTypeName = NULL; size = sizeof(CFStringRef); err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_FileTypeName, sizeof(UInt32), &filetype, &size, &ffi->mFileTypeName); if (err == noErr && ffi->mFileTypeName) CFRetain(ffi->mFileTypeName); // file extensions size = sizeof(CFArrayRef); err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ExtensionsForType, sizeof(OSType), &filetype, &size, &ffi->mExtensions); if (err) ffi->mExtensions = NULL; // file data formats ffi->mNumDataFormats = 0; ffi->mDataFormats = NULL; if (loadDataFormats) ffi->LoadDataFormats(); } // sort file formats by name qsort(mFileFormats, mNumFileFormats, sizeof(FileFormatInfo), CompareFileFormatNames); bail: delete[] fileTypes; }
CAAudioFileFormats::CAAudioFileFormats() : mNumFileFormats(0), mFileFormats(NULL) { OSStatus err; UInt32 size; UInt32 *fileTypes = NULL, *writableFormats = NULL, *readableFormats = NULL; int nWritableFormats, nReadableFormats; // get all file types err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size); if (err != noErr) goto bail; mNumFileFormats = size / sizeof(UInt32); mFileFormats = new FileFormatInfo[mNumFileFormats]; fileTypes = new UInt32[mNumFileFormats]; err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_WritableTypes, 0, NULL, &size, fileTypes); if (err != noErr) goto bail; // get all writable formats err = AudioFormatGetPropertyInfo(kAudioFormatProperty_EncodeFormatIDs, 0, NULL, &size); if (err != noErr) goto bail; nWritableFormats = size / sizeof(UInt32); writableFormats = new UInt32[nWritableFormats]; err = AudioFormatGetProperty(kAudioFormatProperty_EncodeFormatIDs, 0, NULL, &size, writableFormats); if (err != noErr) goto bail; // get all readable formats err = AudioFormatGetPropertyInfo(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size); if (err != noErr) goto bail; nReadableFormats = size / sizeof(UInt32); readableFormats = new UInt32[nReadableFormats]; err = AudioFormatGetProperty(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size, readableFormats); if (err != noErr) goto bail; // get info for each file type for (int i = 0; i < mNumFileFormats; ++i) { FileFormatInfo *ffi = &mFileFormats[i]; OSType filetype = fileTypes[i]; ffi->mFileTypeID = filetype; // file type name ffi->mFileTypeName = NULL; size = sizeof(CFStringRef); err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_FileTypeName, sizeof(UInt32), &filetype, &size, &ffi->mFileTypeName); if (ffi->mFileTypeName) CFRetain(ffi->mFileTypeName); // file extensions size = sizeof(CFArrayRef); err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_ExtensionsForType, sizeof(OSType), &filetype, &size, &ffi->mExtensions); if (err) ffi->mExtensions = NULL; // file data formats ffi->mNumDataFormats = 0; ffi->mDataFormats = NULL; err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableFormatIDs, sizeof(UInt32), &filetype, &size); if (err == noErr) { ffi->mNumDataFormats = size / sizeof(OSType); OSType *formatIDs = new OSType[ffi->mNumDataFormats]; err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableFormatIDs, sizeof(UInt32), &filetype, &size, formatIDs); if (err == noErr) { ffi->mDataFormats = new DataFormatInfo[ffi->mNumDataFormats]; for (int j = 0; j < ffi->mNumDataFormats; ++j) { int k; bool anyBigEndian = false, anyLittleEndian = false; DataFormatInfo *dfi = &ffi->mDataFormats[j]; dfi->mFormatID = formatIDs[j]; dfi->mReadable = (dfi->mFormatID == kAudioFormatLinearPCM); dfi->mWritable = (dfi->mFormatID == kAudioFormatLinearPCM); for (k = 0; k < nReadableFormats; ++k) if (readableFormats[k] == dfi->mFormatID) { dfi->mReadable = true; break; } for (k = 0; k < nWritableFormats; ++k) if (writableFormats[k] == dfi->mFormatID) { dfi->mWritable = true; break; } dfi->mNumVariants = 0; AudioFileTypeAndFormatID tf = { filetype, dfi->mFormatID }; err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, sizeof(AudioFileTypeAndFormatID), &tf, &size); if (err == noErr) { dfi->mNumVariants = size / sizeof(AudioStreamBasicDescription); dfi->mVariants = new AudioStreamBasicDescription[dfi->mNumVariants]; err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, sizeof(AudioFileTypeAndFormatID), &tf, &size, dfi->mVariants); if (err) { dfi->mNumVariants = 0; delete[] dfi->mVariants; dfi->mVariants = NULL; } else { for (k = 0; k < dfi->mNumVariants; ++k) { AudioStreamBasicDescription *desc = &dfi->mVariants[k]; if (desc->mBitsPerChannel > 8) { if (desc->mFormatFlags & kAudioFormatFlagIsBigEndian) anyBigEndian = true; else anyLittleEndian = true; } } } } dfi->mEitherEndianPCM = (anyBigEndian && anyLittleEndian); } } delete[] formatIDs; } } // sort file formats by name qsort(mFileFormats, mNumFileFormats, sizeof(FileFormatInfo), CompareFileFormatNames); bail: delete[] fileTypes; delete[] readableFormats; delete[] writableFormats; }
void CAAudioFileFormats::FileFormatInfo::LoadDataFormats() { if (mDataFormats != NULL) return; UInt32 *writableFormats = NULL, *readableFormats = NULL; int nWritableFormats, nReadableFormats; // get all writable formats UInt32 size; OSStatus err = AudioFormatGetPropertyInfo(kAudioFormatProperty_EncodeFormatIDs, 0, NULL, &size); if (err != noErr) goto bail; nWritableFormats = size / sizeof(UInt32); writableFormats = new UInt32[nWritableFormats]; err = AudioFormatGetProperty(kAudioFormatProperty_EncodeFormatIDs, 0, NULL, &size, writableFormats); if (err != noErr) goto bail; // get all readable formats err = AudioFormatGetPropertyInfo(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size); if (err != noErr) goto bail; nReadableFormats = size / sizeof(UInt32); readableFormats = new UInt32[nReadableFormats]; err = AudioFormatGetProperty(kAudioFormatProperty_DecodeFormatIDs, 0, NULL, &size, readableFormats); if (err != noErr) goto bail; err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableFormatIDs, sizeof(UInt32), &mFileTypeID, &size); if (err == noErr) { mNumDataFormats = size / sizeof(OSType); OSType *formatIDs = new OSType[mNumDataFormats]; err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableFormatIDs, sizeof(UInt32), &mFileTypeID, &size, formatIDs); if (err == noErr) { mDataFormats = new DataFormatInfo[mNumDataFormats]; for (int j = 0; j < mNumDataFormats; ++j) { int k; bool anyBigEndian = false, anyLittleEndian = false; DataFormatInfo *dfi = &mDataFormats[j]; dfi->mFormatID = formatIDs[j]; dfi->mReadable = (dfi->mFormatID == kAudioFormatLinearPCM); dfi->mWritable = (dfi->mFormatID == kAudioFormatLinearPCM); for (k = 0; k < nReadableFormats; ++k) if (readableFormats[k] == dfi->mFormatID) { dfi->mReadable = true; break; } for (k = 0; k < nWritableFormats; ++k) if (writableFormats[k] == dfi->mFormatID) { dfi->mWritable = true; break; } dfi->mNumVariants = 0; AudioFileTypeAndFormatID tf = { mFileTypeID, dfi->mFormatID }; err = AudioFileGetGlobalInfoSize(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, sizeof(AudioFileTypeAndFormatID), &tf, &size); if (err == noErr) { dfi->mNumVariants = size / sizeof(AudioStreamBasicDescription); dfi->mVariants = new AudioStreamBasicDescription[dfi->mNumVariants]; err = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, sizeof(AudioFileTypeAndFormatID), &tf, &size, dfi->mVariants); if (err) { dfi->mNumVariants = 0; delete[] dfi->mVariants; dfi->mVariants = NULL; } else { for (k = 0; k < dfi->mNumVariants; ++k) { AudioStreamBasicDescription *desc = &dfi->mVariants[k]; if (desc->mBitsPerChannel > 8) { if (desc->mFormatFlags & kAudioFormatFlagIsBigEndian) anyBigEndian = true; else anyLittleEndian = true; } } } } dfi->mEitherEndianPCM = (anyBigEndian && anyLittleEndian); } } delete[] formatIDs; } bail: delete[] readableFormats; delete[] writableFormats; }