| @@ -1064,18 +1064,43 @@ private: | |||||
| for (int i = 0; i < numWrapperBuses; ++i) | for (int i = 0; i < numWrapperBuses; ++i) | ||||
| { | { | ||||
| std::unique_ptr<AUAudioUnitBus, NSObjectDeleter> audioUnitBus; | |||||
| using AVAudioFormatPtr = std::unique_ptr<AVAudioFormat, NSObjectDeleter>; | |||||
| const auto audioFormat = [&]() -> AVAudioFormatPtr | |||||
| { | { | ||||
| const auto channels = numProcessorBuses <= i ? 2 : processor.getChannelCountOfBus (isInput, i); | |||||
| std::unique_ptr<AVAudioFormat, NSObjectDeleter> defaultFormat ([[AVAudioFormat alloc] initStandardFormatWithSampleRate: kDefaultSampleRate | |||||
| channels: static_cast<AVAudioChannelCount> (channels)]); | |||||
| const auto tag = i < numProcessorBuses ? CoreAudioLayouts::toCoreAudio (processor.getChannelLayoutOfBus (isInput, i)) | |||||
| : kAudioChannelLayoutTag_Stereo; | |||||
| const std::unique_ptr<AVAudioChannelLayout, NSObjectDeleter> layout { [[AVAudioChannelLayout alloc] initWithLayoutTag: tag] }; | |||||
| audioUnitBus.reset ([[AUAudioUnitBus alloc] initWithFormat: defaultFormat.get() | |||||
| error: nullptr]); | |||||
| } | |||||
| if (auto format = AVAudioFormatPtr { [[AVAudioFormat alloc] initStandardFormatWithSampleRate: kDefaultSampleRate | |||||
| channelLayout: layout.get()] }) | |||||
| return format; | |||||
| const auto channels = i < numProcessorBuses ? processor.getChannelCountOfBus (isInput, i) | |||||
| : 2; | |||||
| // According to the docs, this will fail if the number of channels is greater than 2. | |||||
| if (auto format = AVAudioFormatPtr { [[AVAudioFormat alloc] initStandardFormatWithSampleRate: kDefaultSampleRate | |||||
| channels: static_cast<AVAudioChannelCount> (channels)] }) | |||||
| return format; | |||||
| jassertfalse; | |||||
| return nullptr; | |||||
| }(); | |||||
| using AUAudioUnitBusPtr = std::unique_ptr<AUAudioUnitBus, NSObjectDeleter>; | |||||
| const auto audioUnitBus = [&]() -> AUAudioUnitBusPtr | |||||
| { | |||||
| if (audioFormat != nullptr) | |||||
| return AUAudioUnitBusPtr { [[AUAudioUnitBus alloc] initWithFormat: audioFormat.get() error: nullptr] }; | |||||
| jassertfalse; | |||||
| return nullptr; | |||||
| }(); | |||||
| [array.get() addObject: audioUnitBus.get()]; | |||||
| if (audioUnitBus != nullptr) | |||||
| [array.get() addObject: audioUnitBus.get()]; | |||||
| } | } | ||||
| (isInput ? inputBusses : outputBusses).reset ([[AUAudioUnitBusArray alloc] initWithAudioUnit: au | (isInput ? inputBusses : outputBusses).reset ([[AUAudioUnitBusArray alloc] initWithAudioUnit: au | ||||