Cider Isn't Darwin Emulation, Really
Something went wrong. Try again.
11 kB · 401 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402/*This file is part of Darling.
Copyright (C) 2020 Lubos Dolezel
Darling is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation, either version 3 of the License, or(at your option) any later version.
Darling is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.
You should have received a copy of the GNU General Public Licensealong with Darling. If not, see <http://www.gnu.org/licenses/>.*/
#include <AudioToolbox/AudioFile.h>#include <CoreServices/MacErrors.h>#include "AudioFileFormatManager.h"
OSStatus AudioFileCreateWithURL (CFURLRef inFileRef, AudioFileTypeID inFileType, const AudioStreamBasicDescription *inFormat, AudioFileFlags inFlags, AudioFileID _Nullable * _Nonnull outAudioFile){ return unimpErr;}
OSStatus AudioFileOpenURL ( CFURLRef inFileRef, AudioFilePermissions inPermissions, AudioFileTypeID inFileTypeHint, AudioFileID _Nullable * _Nonnull outAudioFile){ return unimpErr;}
OSStatus AudioFileInitializeWithCallbacks ( void * inClientData, AudioFile_ReadProc inReadFunc, AudioFile_WriteProc inWriteFunc, AudioFile_GetSizeProc inGetSizeFunc, AudioFile_SetSizeProc inSetSizeFunc, AudioFileTypeID inFileType, const AudioStreamBasicDescription *inFormat, AudioFileFlags inFlags, AudioFileID _Nullable * _Nonnull outAudioFile){ return unimpErr;}
OSStatus AudioFileOpenWithCallbacks ( void * inClientData, AudioFile_ReadProc inReadFunc, AudioFile_WriteProc _Nullable inWriteFunc, AudioFile_GetSizeProc inGetSizeFunc, AudioFile_SetSizeProc _Nullable inSetSizeFunc, AudioFileTypeID inFileTypeHint, AudioFileID _Nullable * _Nonnull outAudioFile){ return unimpErr;}
OSStatus AudioFileClose (AudioFileID inAudioFile){ return unimpErr;}
OSStatus AudioFileOptimize (AudioFileID inAudioFile){ return unimpErr;}
OSStatus AudioFileReadBytes ( AudioFileID inAudioFile, Boolean inUseCache, SInt64 inStartingByte, UInt32 *ioNumBytes, void *outBuffer){ return unimpErr;}
OSStatus AudioFileWriteBytes ( AudioFileID inAudioFile, Boolean inUseCache, SInt64 inStartingByte, UInt32 *ioNumBytes, const void *inBuffer){ return unimpErr;}
OSStatus AudioFileReadPacketData ( AudioFileID inAudioFile, Boolean inUseCache, UInt32 * ioNumBytes, AudioStreamPacketDescription * _Nullable outPacketDescriptions, SInt64 inStartingPacket, UInt32 * ioNumPackets, void * _Nullable outBuffer){ return unimpErr;}
OSStatus AudioFileReadPackets ( AudioFileID inAudioFile, Boolean inUseCache, UInt32 * outNumBytes, AudioStreamPacketDescription * _Nullable outPacketDescriptions, SInt64 inStartingPacket, UInt32 * ioNumPackets, void * _Nullable outBuffer){ return unimpErr;}
OSStatus AudioFileWritePackets ( AudioFileID inAudioFile, Boolean inUseCache, UInt32 inNumBytes, const AudioStreamPacketDescription * _Nullable inPacketDescriptions, SInt64 inStartingPacket, UInt32 *ioNumPackets, const void *inBuffer){ return unimpErr;}
OSStatus AudioFileCountUserData ( AudioFileID inAudioFile, UInt32 inUserDataID, UInt32 *outNumberItems){ return unimpErr;}
OSStatus AudioFileGetUserDataSize ( AudioFileID inAudioFile, UInt32 inUserDataID, UInt32 inIndex, UInt32 *outUserDataSize){ return unimpErr;}
OSStatus AudioFileGetUserData ( AudioFileID inAudioFile, UInt32 inUserDataID, UInt32 inIndex, UInt32 *ioUserDataSize, void *outUserData){ return unimpErr;}
OSStatus AudioFileSetUserData ( AudioFileID inAudioFile, UInt32 inUserDataID, UInt32 inIndex, UInt32 inUserDataSize, const void *inUserData){ return unimpErr;}
OSStatus AudioFileRemoveUserData ( AudioFileID inAudioFile, UInt32 inUserDataID, UInt32 inIndex){ return unimpErr;}
OSStatus AudioFileGetPropertyInfo( AudioFileID inAudioFile, AudioFilePropertyID inPropertyID, UInt32 * _Nullable outDataSize, UInt32 * _Nullable isWritable){ return unimpErr;}
OSStatus AudioFileGetProperty( AudioFileID inAudioFile, AudioFilePropertyID inPropertyID, UInt32 *ioDataSize, void *outPropertyData){ return unimpErr;}
OSStatus AudioFileSetProperty( AudioFileID inAudioFile, AudioFilePropertyID inPropertyID, UInt32 inDataSize, const void *inPropertyData){ return unimpErr;}
OSStatus AudioFileGetGlobalInfoSize( AudioFilePropertyID inPropertyID, UInt32 inSpecifierSize, void * _Nullable inSpecifier, UInt32 *outDataSize){ return AudioFileGetGlobalInfo(inPropertyID, inSpecifierSize, inSpecifier, outDataSize, nullptr);}
static void writeUInt32Set(const std::set<UInt32>& set, void *outPropertyData){ if (outPropertyData) { UInt32* out = static_cast<UInt32*>(outPropertyData); int i = 0; for (UInt32 v : set) out[i++] = v; }}
template <typename ContainerType>CFArrayRef stringContainerToArray(const ContainerType& t){ std::unique_ptr<CFStringRef[]> ptrs(new CFStringRef[t.size()]); int i = 0;
for (const std::string& str : t) ptrs[i++] = CFStringCreateWithCString(nullptr, str.c_str(), kCFStringEncodingUTF8); CFArrayRef rv = CFArrayCreate(nullptr, (const void**) ptrs.get(), t.size(), &kCFTypeArrayCallBacks);
for (int i = 0; i < t.size(); i++) CFRelease(ptrs[i]); return rv;}
OSStatus AudioFileGetGlobalInfo( AudioFilePropertyID inPropertyID, UInt32 inSpecifierSize, void * _Nullable inSpecifier, UInt32 *ioDataSize, void *outPropertyData){ switch (inPropertyID) { case kAudioFileGlobalInfo_ReadableTypes: case kAudioFileGlobalInfo_WritableTypes: { std::set<UInt32> types = AudioFileFormatManager::instance()->types(inPropertyID == kAudioFileGlobalInfo_WritableTypes);
*ioDataSize = types.size() * sizeof(UInt32); writeUInt32Set(types, outPropertyData); return noErr; } case kAudioFileGlobalInfo_FileTypeName: { const UInt32* fileType = static_cast<const UInt32*>(inSpecifier); if (inSpecifierSize != sizeof(*fileType)) return kAudioFileBadPropertySizeError;
const AudioFileFormatManager::ComponentInfo* ci;
ci = AudioFileFormatManager::instance()->fileType(*fileType); if (!ci) return kAudioFileUnsupportedFileTypeError;
CFStringRef* out = static_cast<CFStringRef*>(outPropertyData); *ioDataSize = sizeof(*out);
if (out) *out = CFStringCreateWithCString(nullptr, ci->name.c_str(), kCFStringEncodingUTF8);
return noErr; } case kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat: { const AudioFileTypeAndFormatID* spec = static_cast<const AudioFileTypeAndFormatID*>(inSpecifier); if (inSpecifierSize != sizeof(*spec)) return kAudioFileBadPropertySizeError; break; } case kAudioFileGlobalInfo_AvailableFormatIDs: { const UInt32* fileType = static_cast<const UInt32*>(inSpecifier); if (inSpecifierSize != sizeof(*fileType)) return kAudioFileBadPropertySizeError;
auto set = AudioFileFormatManager::instance()->availableFormatIDs(*fileType); *ioDataSize = set.size() * sizeof(UInt32);
writeUInt32Set(set, outPropertyData);
return noErr; } case kAudioFileGlobalInfo_AllHFSTypeCodes: case kAudioFileGlobalInfo_HFSTypeCodesForType: case kAudioFileGlobalInfo_TypesForHFSTypeCode: *ioDataSize = 0; return noErr; case kAudioFileGlobalInfo_AllExtensions: case kAudioFileGlobalInfo_AllUTIs: case kAudioFileGlobalInfo_AllMIMETypes: { *ioDataSize = sizeof(CFArrayRef);
if (outPropertyData) { std::set<std::string> set; AudioFileFormatManager* mgr = AudioFileFormatManager::instance();
if (inPropertyID == kAudioFileGlobalInfo_AllExtensions) set = mgr->allExtensions(); else if (inPropertyID == kAudioFileGlobalInfo_AllUTIs) set = mgr->allUTIs(); else if (inPropertyID == kAudioFileGlobalInfo_AllMIMETypes) set = mgr->allMIMEs();
*((CFArrayRef*)outPropertyData) = stringContainerToArray(set); }
return noErr; } case kAudioFileGlobalInfo_ExtensionsForType: case kAudioFileGlobalInfo_UTIsForType: case kAudioFileGlobalInfo_MIMETypesForType: { const UInt32* fileType = static_cast<const UInt32*>(inSpecifier); if (inSpecifierSize != sizeof(*fileType)) return kAudioFileBadPropertySizeError;
*ioDataSize = sizeof(CFArrayRef);
if (outPropertyData) { const std::vector<std::string>* vector; const AudioFileFormatManager::ComponentInfo* ci;
ci = AudioFileFormatManager::instance()->fileType(*fileType); if (!ci) return kAudioFileUnsupportedFileTypeError; if (inPropertyID == kAudioFileGlobalInfo_ExtensionsForType) vector = &ci->extensions; else if (inPropertyID == kAudioFileGlobalInfo_UTIsForType) vector = &ci->utis; else if (inPropertyID == kAudioFileGlobalInfo_MIMETypesForType) vector = &ci->mimeTypes;
*((CFArrayRef*)outPropertyData) = stringContainerToArray(*vector); }
return noErr; } case kAudioFileGlobalInfo_TypesForMIMEType: case kAudioFileGlobalInfo_TypesForUTI: case kAudioFileGlobalInfo_TypesForExtension: { CFStringRef str = static_cast<CFStringRef>(inSpecifier); if (inSpecifierSize != sizeof(str)) return kAudioFileBadPropertySizeError; AudioFileFormatManager* mgr = AudioFileFormatManager::instance(); const char* cstr = CFStringGetCStringPtr(str, kCFStringEncodingUTF8); std::set<UInt32> set;
if (inPropertyID == kAudioFileGlobalInfo_TypesForMIMEType) set = mgr->typesForMIME(cstr); else if (inPropertyID == kAudioFileGlobalInfo_TypesForUTI) set = mgr->typesForUTI(cstr); else if (inPropertyID == kAudioFileGlobalInfo_TypesForExtension) set = mgr->typesForExtension(cstr);
*ioDataSize = set.size() * sizeof(UInt32); writeUInt32Set(set, outPropertyData);
return noErr; } } return unimpErr;}
OSStatus AudioFileCreate ( const struct FSRef *inParentRef, CFStringRef inFileName, AudioFileTypeID inFileType, const AudioStreamBasicDescription *inFormat, AudioFileFlags inFlags, struct FSRef *outNewFileRef, AudioFileID _Nullable * _Nonnull outAudioFile){ return unimpErr;}
OSStatus AudioFileInitialize ( const struct FSRef *inFileRef, AudioFileTypeID inFileType, const AudioStreamBasicDescription *inFormat, AudioFileFlags inFlags, AudioFileID _Nullable * _Nonnull outAudioFile){ return unimpErr;}
OSStatus AudioFileOpen ( const struct FSRef *inFileRef, AudioFilePermissions inPermissions, AudioFileTypeID inFileTypeHint, AudioFileID _Nullable * _Nonnull outAudioFile){ return unimpErr;}