//_____________________________________________________________________________ // bool AUPannerBase::OutputChannelConfigIsSupported(UInt32 inNumberChannels) { const AUChannelInfo* cinfo = NULL; UInt32 numConfigs = SupportedNumChannels(&cinfo); for (UInt32 i = 0; i < numConfigs; ++i) { if (cinfo[i].outChannels == (SInt16)inNumberChannels) return true; } return false; }
//_____________________________________________________________________________ // bool AUPannerBase::ChannelConfigIsSupported() { UInt32 inChannels = GetNumberOfInputChannels(); UInt32 outChannels = GetNumberOfOutputChannels(); const AUChannelInfo* cinfo = NULL; UInt32 numConfigs = SupportedNumChannels(&cinfo); for (UInt32 i = 0; i < numConfigs; ++i) { if (cinfo[i].inChannels == (SInt16)inChannels && cinfo[i].outChannels == (SInt16)outChannels) return true; } return false; }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // AUInstrumentBase::ValidFormat // //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ bool AUInstrumentBase::ValidFormat( AudioUnitScope inScope, AudioUnitElement inElement, const CAStreamBasicDescription & inNewFormat) { // if the AU supports this, then we should just let this go through to the Init call if (SupportedNumChannels (NULL)) return MusicDeviceBase::ValidFormat(inScope, inElement, inNewFormat); bool isGood = MusicDeviceBase::ValidFormat (inScope, inElement, inNewFormat); if (!isGood) return false; // if we get to here, then the basic criteria is that the // num channels cannot change on an existing bus AUIOElement *el = GetIOElement (inScope, inElement); return (el->GetStreamFormat().NumberChannels() == inNewFormat.NumberChannels()); }
//_____________________________________________________________________________ // OSStatus AUEffectBase::Initialize() { // get our current numChannels for input and output SInt16 auNumInputs = (SInt16) GetInput(0)->GetStreamFormat().mChannelsPerFrame; SInt16 auNumOutputs = (SInt16) GetOutput(0)->GetStreamFormat().mChannelsPerFrame; // does the unit publish specific information about channel configurations? const AUChannelInfo *auChannelConfigs = NULL; UInt32 numIOconfigs = SupportedNumChannels(&auChannelConfigs); if ((numIOconfigs > 0) && (auChannelConfigs != NULL)) { bool foundMatch = false; for (UInt32 i = 0; (i < numIOconfigs) && !foundMatch; ++i) { SInt16 configNumInputs = auChannelConfigs[i].inChannels; SInt16 configNumOutputs = auChannelConfigs[i].outChannels; if ((configNumInputs < 0) && (configNumOutputs < 0)) { // unit accepts any number of channels on input and output if (((configNumInputs == -1) && (configNumOutputs == -2)) || ((configNumInputs == -2) && (configNumOutputs == -1))) { foundMatch = true; // unit accepts any number of channels on input and output IFF they are the same number on both scopes } else if (((configNumInputs == -1) && (configNumOutputs == -1)) && (auNumInputs == auNumOutputs)) { foundMatch = true; // unit has specified a particular number of channels on both scopes } else continue; } else { // the -1 case on either scope is saying that the unit doesn't care about the // number of channels on that scope bool inputMatch = (auNumInputs == configNumInputs) || (configNumInputs == -1); bool outputMatch = (auNumOutputs == configNumOutputs) || (configNumOutputs == -1); if (inputMatch && outputMatch) foundMatch = true; } } if (!foundMatch) return kAudioUnitErr_FormatNotSupported; } else { // there is no specifically published channel info // so for those kinds of effects, the assumption is that the channels (whatever their number) // should match on both scopes if ((auNumOutputs != auNumInputs) || (auNumOutputs == 0)) { return kAudioUnitErr_FormatNotSupported; } } MaintainKernels(); mMainOutput = GetOutput(0); mMainInput = GetInput(0); const CAStreamBasicDescription& format = GetStreamFormat(kAudioUnitScope_Output, 0); format.IdentifyCommonPCMFormat(mCommonPCMFormat, NULL); mBytesPerFrame = format.mBytesPerFrame; return noErr; }