diff --git a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp index 5d0c2785ac..b018b80a2e 100644 --- a/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -36,22 +36,69 @@ namespace { const char* const coreAudioFormatName = "CoreAudio supported file"; - StringArray findFileExtensionsForCoreAudioCodecs() + StringArray getStringInfo (AudioFilePropertyID property, UInt32 size, void* data) { - StringArray extensionsArray; CFObjectHolder extensions; UInt32 sizeOfArray = sizeof (extensions.object); - if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, nullptr, &sizeOfArray, &extensions.object) == noErr) - { - auto numValues = CFArrayGetCount (extensions.object); + const auto err = AudioFileGetGlobalInfo (property, + size, + data, + &sizeOfArray, + &extensions.object); - for (CFIndex i = 0; i < numValues; ++i) - extensionsArray.add ("." + String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (extensions.object, i))); - } + if (err != noErr) + return {}; + + const auto numValues = CFArrayGetCount (extensions.object); + + StringArray extensionsArray; + + for (CFIndex i = 0; i < numValues; ++i) + extensionsArray.add ("." + String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (extensions.object, i))); return extensionsArray; } + + StringArray findFileExtensionsForCoreAudioCodec (AudioFileTypeID type) + { + return getStringInfo (kAudioFileGlobalInfo_ExtensionsForType, sizeof (AudioFileTypeID), &type); + } + + StringArray findFileExtensionsForCoreAudioCodecs() + { + return getStringInfo (kAudioFileGlobalInfo_AllExtensions, 0, nullptr); + } + + static AudioFileTypeID toAudioFileTypeID (CoreAudioFormat::StreamKind kind) + { + using StreamKind = CoreAudioFormat::StreamKind; + + switch (kind) + { + case StreamKind::kAiff: return kAudioFileAIFFType; + case StreamKind::kAifc: return kAudioFileAIFCType; + case StreamKind::kWave: return kAudioFileWAVEType; + case StreamKind::kSoundDesigner2: return kAudioFileSoundDesigner2Type; + case StreamKind::kNext: return kAudioFileNextType; + case StreamKind::kMp3: return kAudioFileMP3Type; + case StreamKind::kMp2: return kAudioFileMP2Type; + case StreamKind::kMp1: return kAudioFileMP1Type; + case StreamKind::kAc3: return kAudioFileAC3Type; + case StreamKind::kAacAdts: return kAudioFileAAC_ADTSType; + case StreamKind::kMpeg4: return kAudioFileMPEG4Type; + case StreamKind::kM4a: return kAudioFileM4AType; + case StreamKind::kM4b: return kAudioFileM4BType; + case StreamKind::kCaf: return kAudioFileCAFType; + case StreamKind::k3gp: return kAudioFile3GPType; + case StreamKind::k3gp2: return kAudioFile3GP2Type; + case StreamKind::kAmr: return kAudioFileAMRType; + + case StreamKind::kNone: break; + } + + return {}; + } } //============================================================================== @@ -559,45 +606,18 @@ private: return noErr; } - static AudioFileTypeID toAudioFileTypeID (StreamKind kind) - { - switch (kind) - { - case StreamKind::kAiff: return kAudioFileAIFFType; - case StreamKind::kAifc: return kAudioFileAIFCType; - case StreamKind::kWave: return kAudioFileWAVEType; - case StreamKind::kSoundDesigner2: return kAudioFileSoundDesigner2Type; - case StreamKind::kNext: return kAudioFileNextType; - case StreamKind::kMp3: return kAudioFileMP3Type; - case StreamKind::kMp2: return kAudioFileMP2Type; - case StreamKind::kMp1: return kAudioFileMP1Type; - case StreamKind::kAc3: return kAudioFileAC3Type; - case StreamKind::kAacAdts: return kAudioFileAAC_ADTSType; - case StreamKind::kMpeg4: return kAudioFileMPEG4Type; - case StreamKind::kM4a: return kAudioFileM4AType; - case StreamKind::kM4b: return kAudioFileM4BType; - case StreamKind::kCaf: return kAudioFileCAFType; - case StreamKind::k3gp: return kAudioFile3GPType; - case StreamKind::k3gp2: return kAudioFile3GP2Type; - case StreamKind::kAmr: return kAudioFileAMRType; - - case StreamKind::kNone: break; - } - - return {}; - } - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioReader) }; //============================================================================== CoreAudioFormat::CoreAudioFormat() - : CoreAudioFormat (StreamKind::kNone) + : AudioFormat (coreAudioFormatName, findFileExtensionsForCoreAudioCodecs()), + streamKind (StreamKind::kNone) { } CoreAudioFormat::CoreAudioFormat (StreamKind kind) - : AudioFormat (coreAudioFormatName, findFileExtensionsForCoreAudioCodecs()), + : AudioFormat (coreAudioFormatName, findFileExtensionsForCoreAudioCodec (toAudioFileTypeID (kind))), streamKind (kind) { }