summaryrefslogtreecommitdiff
path: root/libs/appleutility
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-02-22 23:37:18 +0100
committerRobin Gareus <robin@gareus.org>2015-02-22 23:37:18 +0100
commite070701f14e9b705f7477d6e6718ee759caa1c46 (patch)
treea70f2db0c71952ed101364557f2613fa140612ba /libs/appleutility
parent10e183f518f1a26c081afa191f30968f40211b0f (diff)
support AudioUnit Generators without global Channel Info
Diffstat (limited to 'libs/appleutility')
-rw-r--r--libs/appleutility/CAAudioUnit.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/libs/appleutility/CAAudioUnit.cpp b/libs/appleutility/CAAudioUnit.cpp
index 131969b66c..c1ab13454e 100644
--- a/libs/appleutility/CAAudioUnit.cpp
+++ b/libs/appleutility/CAAudioUnit.cpp
@@ -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