Browse Source

A few more tweaks for AU hosting, WIP

Signed-off-by: falkTX <falktx@falktx.com>
pull/1933/merge
falkTX 1 month ago
parent
commit
e312817b6f
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
3 changed files with 132 additions and 27 deletions
  1. +62
    -11
      source/backend/plugin/CarlaPluginAU.cpp
  2. +67
    -14
      source/discovery/carla-discovery.cpp
  3. +3
    -2
      source/utils/CarlaStateUtils.cpp

+ 62
- 11
source/backend/plugin/CarlaPluginAU.cpp View File

@@ -260,11 +260,8 @@ public:
kAudioUnitProperty_SupportedNumChannels,
kAudioUnitScope_Global,
0, &outDataSize, &outWritable) == noErr
/*
&& outDataSize != 0
&& outDataSize % sizeof(AUChannelInfo) == 0
*/
)
&& outDataSize % sizeof(AUChannelInfo) == 0)
{
const uint32_t numChannels = outDataSize / sizeof(AUChannelInfo);
AUChannelInfo* const channelInfo = new AUChannelInfo[numChannels];
@@ -279,12 +276,17 @@ public:
{
AUChannelInfo* highestInfo = &channelInfo[0];

carla_stdout("getProperty returns {%u,%u}... config",
carla_stdout("kAudioUnitProperty_SupportedNumChannels returns {%d,%d}... config",
channelInfo[0].inChannels,
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
&& 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
{
carla_stdout("getProperty failed");
carla_stdout("kAudioUnitProperty_SupportedNumChannels failed");
}

delete[] channelInfo;
}
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)


+ 67
- 14
source/discovery/carla-discovery.cpp View File

@@ -2182,8 +2182,13 @@ static bool do_au_check(const char* const filename, const bool doInit)
{
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
&& 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;
}
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
outDataSize = 0;
@@ -2292,17 +2355,7 @@ static bool do_au_check(const char* const filename, const bool 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);


+ 3
- 2
source/utils/CarlaStateUtils.cpp View File

@@ -1,6 +1,6 @@
/*
* 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
* 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);
else if (tag == "Label" || tag == "URI" || tag == "Identifier" || tag == "Setup")
label = xmlSafeStringCharDup(text, false);
else if (tag == "Binary" || tag == "Filename")
else if (tag == "Binary" || tag == "Bundle" || tag == "Filename")
binary = xmlSafeStringCharDup(text, false);
else if (tag == "UniqueID")
uniqueId = text.getLargeIntValue();
@@ -594,6 +594,7 @@ void CarlaStateSave::dumpToMemoryStream(MemoryOutputStream& content) const
infoXml << " <Label>" << xmlSafeString(label, true) << "</Label>\n";
break;
case PLUGIN_AU:
infoXml << " <Bundle>" << xmlSafeString(binary, true) << "</Bundle>\n";
infoXml << " <Identifier>" << xmlSafeString(label, true) << "</Identifier>\n";
break;
case PLUGIN_CLAP:


Loading…
Cancel
Save