1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

CoreAudioFormat: Only register suitable file extensions for given StreamKind

This commit is contained in:
reuk 2021-11-01 20:29:20 +00:00
parent e247e06fb7
commit a4b92bd6c8
No known key found for this signature in database
GPG key ID: 9ADCD339CFC98A11

View file

@ -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<CFArrayRef> 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)
{
}