support AudioUnit Generators without global Channel Info

This commit is contained in:
Robin Gareus 2015-02-22 23:37:18 +01:00
parent 10e183f518
commit e070701f14
2 changed files with 41 additions and 1 deletions

View File

@ -348,6 +348,42 @@ int CAAudioUnit::GetChannelInfo (AUChannelInfo** chaninfo, UInt32& cnt)
{
return 1;
}
else if (Comp().Desc().IsGenerator() || Comp().Desc().IsMusicDevice()) {
// directly query Bus Formats
// Note that that these may refer to different subBusses
// (eg. Kick, Snare,.. on a Drummachine)
// eventually the Bus-Name for each configuration should be exposed
// for the User to select..
UInt32 elCountIn, elCountOut, elCount;
if (GetElementCount (kAudioUnitScope_Input, elCountIn)) return 1;
if (GetElementCount (kAudioUnitScope_Output, elCountOut)) return 1;
elCount = std::max(elCountIn, elCountOut);
*chaninfo = (AUChannelInfo*) malloc (sizeof (AUChannelInfo) * elCount);
for (unsigned int i = 0; i < elCountIn; ++i) {
UInt32 numChans;
if (NumberChannels (kAudioUnitScope_Input, i, numChans)) return 1;
(*chaninfo)[i].inChannels = numChans;
}
for (unsigned int i = elCountIn; i < elCount; ++i) {
(*chaninfo)[i].inChannels = 0;
}
for (unsigned int i = 0; i < elCountOut; ++i) {
UInt32 numChans;
if (NumberChannels (kAudioUnitScope_Output, i, numChans)) return 1;
(*chaninfo)[i].outChannels = numChans;
}
for (unsigned int i = elCountOut; i < elCount; ++i) {
(*chaninfo)[i].outChannels = 0;
}
return 0;
}
else
{
// the au should either really tell us about this

View File

@ -1037,7 +1037,11 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out)
//configurations in most cases. so first lets see
//if there's a configuration that keeps out==in
audio_out = audio_in;
if (in.n_midi() > 0 && audio_in == 0) {
audio_out = -1;
} else {
audio_out = audio_in;
}
for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {