Signed-off-by: falkTX <falktx@falktx.com>pull/1933/merge
@@ -260,11 +260,8 @@ public: | |||||
kAudioUnitProperty_SupportedNumChannels, | kAudioUnitProperty_SupportedNumChannels, | ||||
kAudioUnitScope_Global, | kAudioUnitScope_Global, | ||||
0, &outDataSize, &outWritable) == noErr | 0, &outDataSize, &outWritable) == noErr | ||||
/* | |||||
&& outDataSize != 0 | && outDataSize != 0 | ||||
&& outDataSize % sizeof(AUChannelInfo) == 0 | |||||
*/ | |||||
) | |||||
&& outDataSize % sizeof(AUChannelInfo) == 0) | |||||
{ | { | ||||
const uint32_t numChannels = outDataSize / sizeof(AUChannelInfo); | const uint32_t numChannels = outDataSize / sizeof(AUChannelInfo); | ||||
AUChannelInfo* const channelInfo = new AUChannelInfo[numChannels]; | AUChannelInfo* const channelInfo = new AUChannelInfo[numChannels]; | ||||
@@ -279,12 +276,17 @@ public: | |||||
{ | { | ||||
AUChannelInfo* highestInfo = &channelInfo[0]; | AUChannelInfo* highestInfo = &channelInfo[0]; | ||||
carla_stdout("getProperty returns {%u,%u}... config", | |||||
carla_stdout("kAudioUnitProperty_SupportedNumChannels returns {%d,%d}... config", | |||||
channelInfo[0].inChannels, | channelInfo[0].inChannels, | ||||
channelInfo[0].outChannels); | channelInfo[0].outChannels); | ||||
for (uint32_t i=1; i<numChannels; ++i) | |||||
for (uint32_t i=0; i<numChannels; ++i) | |||||
{ | { | ||||
if (channelInfo[i].inChannels < 0) | |||||
channelInfo[i].inChannels = 2; | |||||
if (channelInfo[i].outChannels < 0) | |||||
channelInfo[i].outChannels = 2; | |||||
if (channelInfo[i].inChannels > highestInfo->inChannels | if (channelInfo[i].inChannels > highestInfo->inChannels | ||||
&& channelInfo[i].outChannels > highestInfo->outChannels) | && channelInfo[i].outChannels > highestInfo->outChannels) | ||||
{ | { | ||||
@@ -292,20 +294,69 @@ public: | |||||
} | } | ||||
} | } | ||||
audioIns = highestInfo->inChannels; | |||||
audioOuts = highestInfo->outChannels; | |||||
audioIns = std::min<int16_t>(64, highestInfo->inChannels); | |||||
audioOuts = std::min<int16_t>(64, highestInfo->outChannels); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
carla_stdout("getProperty failed"); | |||||
carla_stdout("kAudioUnitProperty_SupportedNumChannels failed"); | |||||
} | } | ||||
delete[] channelInfo; | delete[] channelInfo; | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
carla_stdout("kAudioUnitProperty_SupportedNumChannels returns no configs, assume stereo"); | |||||
audioIns = audioOuts = 2; | |||||
outDataSize = 0; | |||||
if (fFunctions.getPropertyInfo(fInterface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Input, | |||||
0, &outDataSize, &outWritable) == noErr | |||||
&& outDataSize == sizeof(UInt32)) | |||||
{ | |||||
UInt32 count = 0; | |||||
if (fFunctions.getProperty(fInterface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Input, | |||||
0, &count, &outDataSize) == noErr | |||||
&& outDataSize == sizeof(UInt32) && count != 0) | |||||
{ | |||||
AudioStreamBasicDescription desc; | |||||
std::memset(&desc, 0, sizeof(desc)); | |||||
outDataSize = sizeof(AudioStreamBasicDescription); | |||||
if (fFunctions.getProperty(fInterface, | |||||
kAudioUnitProperty_StreamFormat, | |||||
kAudioUnitScope_Input, | |||||
0, &desc, &outDataSize) == noErr) | |||||
audioIns = std::min<uint32_t>(64, desc.mChannelsPerFrame); | |||||
} | |||||
} | |||||
outDataSize = 0; | |||||
if (fFunctions.getPropertyInfo(fInterface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Output, | |||||
0, &outDataSize, &outWritable) == noErr | |||||
&& outDataSize == sizeof(UInt32)) | |||||
{ | |||||
UInt32 count = 0; | |||||
if (fFunctions.getProperty(fInterface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Output, | |||||
0, &count, &outDataSize) == noErr | |||||
&& outDataSize == sizeof(UInt32) && count != 0) | |||||
{ | |||||
AudioStreamBasicDescription desc; | |||||
std::memset(&desc, 0, sizeof(desc)); | |||||
outDataSize = sizeof(AudioStreamBasicDescription); | |||||
if (fFunctions.getProperty(fInterface, | |||||
kAudioUnitProperty_StreamFormat, | |||||
kAudioUnitScope_Output, | |||||
0, &desc, &outDataSize) == noErr) | |||||
audioOuts = std::min<uint32_t>(64, desc.mChannelsPerFrame); | |||||
} | |||||
} | |||||
} | } | ||||
if (audioIns > 0) | if (audioIns > 0) | ||||
@@ -2182,8 +2182,13 @@ static bool do_au_check(const char* const filename, const bool doInit) | |||||
{ | { | ||||
AUChannelInfo* highestInfo = &channelInfo[0]; | AUChannelInfo* highestInfo = &channelInfo[0]; | ||||
for (uint32_t i=1; i<numChannels; ++i) | |||||
for (uint32_t i=0; i<numChannels; ++i) | |||||
{ | { | ||||
if (channelInfo[i].inChannels < 0) | |||||
channelInfo[i].inChannels = 2; | |||||
if (channelInfo[i].outChannels < 0) | |||||
channelInfo[i].outChannels = 2; | |||||
if (channelInfo[i].inChannels > highestInfo->inChannels | if (channelInfo[i].inChannels > highestInfo->inChannels | ||||
&& channelInfo[i].outChannels > highestInfo->outChannels) | && channelInfo[i].outChannels > highestInfo->outChannels) | ||||
{ | { | ||||
@@ -2191,12 +2196,70 @@ static bool do_au_check(const char* const filename, const bool doInit) | |||||
} | } | ||||
} | } | ||||
audioIns = highestInfo->inChannels; | |||||
audioOuts = highestInfo->outChannels; | |||||
audioIns = std::min<int16_t>(64, highestInfo->inChannels); | |||||
audioOuts = std::min<int16_t>(64, highestInfo->outChannels); | |||||
} | } | ||||
delete[] channelInfo; | delete[] channelInfo; | ||||
} | } | ||||
else | |||||
{ | |||||
// unsupported for now | |||||
interface->Close(interface); | |||||
continue; | |||||
outDataSize = 0; | |||||
if (auGetPropertyInfo(interface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Input, | |||||
0, &outDataSize, &outWritable) == noErr | |||||
&& outDataSize == sizeof(UInt32)) | |||||
{ | |||||
UInt32 count = 0; | |||||
if (auGetProperty(interface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Input, | |||||
0, &count, &outDataSize) == noErr | |||||
&& outDataSize == sizeof(UInt32) && count != 0) | |||||
{ | |||||
AudioStreamBasicDescription desc; | |||||
std::memset(&desc, 0, sizeof(desc)); | |||||
outDataSize = sizeof(AudioStreamBasicDescription); | |||||
if (auGetProperty(interface, | |||||
kAudioUnitProperty_StreamFormat, | |||||
kAudioUnitScope_Input, | |||||
0, &desc, &outDataSize) == noErr) | |||||
audioIns = std::min<uint32_t>(64, desc.mChannelsPerFrame); | |||||
} | |||||
} | |||||
outDataSize = 0; | |||||
if (auGetPropertyInfo(interface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Output, | |||||
0, &outDataSize, &outWritable) == noErr | |||||
&& outDataSize == sizeof(UInt32)) | |||||
{ | |||||
UInt32 count = 0; | |||||
if (auGetProperty(interface, | |||||
kAudioUnitProperty_ElementCount, | |||||
kAudioUnitScope_Output, | |||||
0, &count, &outDataSize) == noErr | |||||
&& outDataSize == sizeof(UInt32) && count != 0) | |||||
{ | |||||
AudioStreamBasicDescription desc; | |||||
std::memset(&desc, 0, sizeof(desc)); | |||||
outDataSize = sizeof(AudioStreamBasicDescription); | |||||
if (auGetProperty(interface, | |||||
kAudioUnitProperty_StreamFormat, | |||||
kAudioUnitScope_Output, | |||||
0, &desc, &outDataSize) == noErr) | |||||
audioOuts = std::min<uint32_t>(64, desc.mChannelsPerFrame); | |||||
} | |||||
} | |||||
} | |||||
// parameter count | // parameter count | ||||
outDataSize = 0; | outDataSize = 0; | ||||
@@ -2292,17 +2355,7 @@ static bool do_au_check(const char* const filename, const bool doInit) | |||||
if (doInit) | if (doInit) | ||||
{ | { | ||||
// test valid scopes | |||||
outDataSize = 0; | |||||
if (auGetPropertyInfo(interface, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &outDataSize, &outWritable) == noErr && outDataSize == sizeof(UInt32)) | |||||
{ | |||||
UInt32 count = 0; | |||||
if (auGetProperty(interface, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &count, &outDataSize) == noErr && outDataSize == sizeof(UInt32) && count != 0) | |||||
{ | |||||
} | |||||
} | |||||
// TODO | |||||
// TODO tests | |||||
} | } | ||||
const CFIndex componentNameLen = CFStringGetLength(componentName); | const CFIndex componentNameLen = CFStringGetLength(componentName); | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* Carla State utils | * Carla State utils | ||||
* Copyright (C) 2012-2023 Filipe Coelho <falktx@falktx.com> | |||||
* Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com> | |||||
* | * | ||||
* This program is free software; you can redistribute it and/or | * This program is free software; you can redistribute it and/or | ||||
* modify it under the terms of the GNU General Public License as | * modify it under the terms of the GNU General Public License as | ||||
@@ -310,7 +310,7 @@ bool CarlaStateSave::fillFromXmlElement(const XmlElement* const xmlElement) | |||||
name = xmlSafeStringCharDup(text, false); | name = xmlSafeStringCharDup(text, false); | ||||
else if (tag == "Label" || tag == "URI" || tag == "Identifier" || tag == "Setup") | else if (tag == "Label" || tag == "URI" || tag == "Identifier" || tag == "Setup") | ||||
label = xmlSafeStringCharDup(text, false); | label = xmlSafeStringCharDup(text, false); | ||||
else if (tag == "Binary" || tag == "Filename") | |||||
else if (tag == "Binary" || tag == "Bundle" || tag == "Filename") | |||||
binary = xmlSafeStringCharDup(text, false); | binary = xmlSafeStringCharDup(text, false); | ||||
else if (tag == "UniqueID") | else if (tag == "UniqueID") | ||||
uniqueId = text.getLargeIntValue(); | uniqueId = text.getLargeIntValue(); | ||||
@@ -594,6 +594,7 @@ void CarlaStateSave::dumpToMemoryStream(MemoryOutputStream& content) const | |||||
infoXml << " <Label>" << xmlSafeString(label, true) << "</Label>\n"; | infoXml << " <Label>" << xmlSafeString(label, true) << "</Label>\n"; | ||||
break; | break; | ||||
case PLUGIN_AU: | case PLUGIN_AU: | ||||
infoXml << " <Bundle>" << xmlSafeString(binary, true) << "</Bundle>\n"; | |||||
infoXml << " <Identifier>" << xmlSafeString(label, true) << "</Identifier>\n"; | infoXml << " <Identifier>" << xmlSafeString(label, true) << "</Identifier>\n"; | ||||
break; | break; | ||||
case PLUGIN_CLAP: | case PLUGIN_CLAP: | ||||