void AudioProcessor::setPlayConfigDetails (const int newNumIns, const int newNumOuts, const double newSampleRate, const int newBlockSize) { const int oldNumInputs = getTotalNumInputChannels(); const int oldNumOutputs = getTotalNumOutputChannels(); // if the user is using this method then they do not want any side-buses or aux outputs disableNonMainBuses (true); disableNonMainBuses (false); if (getTotalNumInputChannels() != newNumIns) setPreferredBusArrangement (true, 0, AudioChannelSet::canonicalChannelSet (newNumIns)); if (getTotalNumOutputChannels() != newNumOuts) setPreferredBusArrangement (false, 0, AudioChannelSet::canonicalChannelSet (newNumOuts)); // the processor may not support this arrangement at all jassert (newNumIns == getTotalNumInputChannels() && newNumOuts == getTotalNumOutputChannels()); setRateAndBufferSizeDetails (newSampleRate, newBlockSize); if (oldNumInputs != newNumIns || oldNumOutputs != newNumOuts) { updateSpeakerFormatStrings(); numChannelsChanged(); } }
AudioProcessor::AudioProcessor() : wrapperType (wrapperTypeBeingCreated.get()), playHead (nullptr), sampleRate (0), blockSize (0), latencySamples (0), #if JUCE_DEBUG textRecursionCheck (false), #endif suspended (false), nonRealtime (false), processingPrecision (singlePrecision) { #if ! JucePlugin_IsMidiEffect #ifdef JucePlugin_PreferredChannelConfigurations const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; #else const short channelConfigs[][2] = { {2, 2} }; #endif int numChannelConfigs = sizeof (channelConfigs) / sizeof (*channelConfigs); if (numChannelConfigs > 0) { #if ! JucePlugin_IsSynth busArrangement.inputBuses.add (AudioProcessorBus ("Input", AudioChannelSet::canonicalChannelSet (channelConfigs[0][0]))); #endif busArrangement.outputBuses.add (AudioProcessorBus ("Output", AudioChannelSet::canonicalChannelSet (channelConfigs[0][1]))); } #endif updateSpeakerFormatStrings(); }
void AudioProcessor::audioIOChanged (bool busNumberChanged, bool channelNumChanged) { const int numInputBuses = getBusCount (true); const int numOutputBuses = getBusCount (false); for (int dir = 0; dir < 2; ++dir) { const bool isInput = (dir == 0); const int n = (isInput ? numInputBuses : numOutputBuses); for (int i = 0; i < n; ++i) { if (Bus* bus = getBus (isInput, i)) bus->updateChannelCount(); } } cachedTotalIns = countTotalChannels (inputBuses); cachedTotalOuts = countTotalChannels (outputBuses); updateSpeakerFormatStrings(); if (busNumberChanged) numBusesChanged(); if (channelNumChanged) numChannelsChanged(); processorLayoutsChanged(); }
void AudioProcessor::initialise (const BusesProperties& ioConfig) { cachedTotalIns = 0; cachedTotalOuts = 0; wrapperType = wrapperTypeBeingCreated.get(); playHead = nullptr; currentSampleRate = 0; blockSize = 0; latencySamples = 0; #if JUCE_DEBUG textRecursionCheck = false; #endif suspended = false; nonRealtime = false; processingPrecision = singlePrecision; const int numInputBuses = ioConfig.inputLayouts.size(); const int numOutputBuses = ioConfig.outputLayouts.size(); for (int i = 0; i < numInputBuses; ++i) createBus (true, ioConfig.inputLayouts. getReference (i)); for (int i = 0; i < numOutputBuses; ++i) createBus (false, ioConfig.outputLayouts.getReference (i)); updateSpeakerFormatStrings(); }
AudioProcessor::AudioProcessor() : wrapperType (wrapperTypeBeingCreated.get()), playHead (nullptr), currentSampleRate (0), blockSize (0), latencySamples (0), #if JUCE_DEBUG textRecursionCheck (false), #endif suspended (false), nonRealtime (false), processingPrecision (singlePrecision) { #ifdef JucePlugin_PreferredChannelConfigurations const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; #else const short channelConfigs[][2] = { {2, 2} }; #endif #ifdef JucePlugin_MaxNumInputChannels const int maxInChannels = JucePlugin_MaxNumInputChannels; #else const int maxInChannels = std::numeric_limits<int>::max(); #endif ignoreUnused (maxInChannels); #ifdef JucePlugin_MaxNumOutputChannels const int maxOutChannels = JucePlugin_MaxNumOutputChannels; #else const int maxOutChannels = std::numeric_limits<int>::max(); #endif ignoreUnused (maxOutChannels); #if ! JucePlugin_IsMidiEffect // #if ! JucePlugin_IsSynth const int numInChannels = jmin (maxInChannels, (int) channelConfigs[0][0]); if (numInChannels > 0) busArrangement.inputBuses.add (AudioProcessorBus ("Input", AudioChannelSet::canonicalChannelSet (numInChannels))); // #endif const int numOutChannels = jmin (maxOutChannels, (int) channelConfigs[0][1]); if (numOutChannels > 0) busArrangement.outputBuses.add (AudioProcessorBus ("Output", AudioChannelSet::canonicalChannelSet (numOutChannels))); #ifdef JucePlugin_PreferredChannelConfigurations // #if ! JucePlugin_IsSynth AudioProcessor::setPreferredBusArrangement (true, 0, AudioChannelSet::stereo()); // #endif AudioProcessor::setPreferredBusArrangement (false, 0, AudioChannelSet::stereo()); #endif #endif updateSpeakerFormatStrings(); }
//============================================================================== bool AudioProcessor::setPreferredBusArrangement (bool isInput, int busIndex, const AudioChannelSet& preferredSet) { const int oldNumInputs = getTotalNumInputChannels(); const int oldNumOutputs = getTotalNumOutputChannels(); Array<AudioProcessorBus>& buses = isInput ? busArrangement.inputBuses : busArrangement.outputBuses; const int numBuses = buses.size(); if (! isPositiveAndBelow (busIndex, numBuses)) return false; #ifdef JucePlugin_MaxNumInputChannels if (isInput && preferredSet.size() > JucePlugin_MaxNumInputChannels) return false; #endif #ifdef JucePlugin_MaxNumOutputChannels if (! isInput && preferredSet.size() > JucePlugin_MaxNumOutputChannels) return false; #endif AudioProcessorBus& bus = buses.getReference (busIndex); #ifdef JucePlugin_PreferredChannelConfigurations // the user is using the deprecated way to specify channel configurations if (numBuses > 0 && busIndex == 0) { const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; const int numChannelConfigs = sizeof (channelConfigs) / sizeof (*channelConfigs); // we need the main bus in the opposite direction Array<AudioProcessorBus>& oppositeBuses = isInput ? busArrangement.outputBuses : busArrangement.inputBuses; AudioProcessorBus* oppositeBus = (busIndex < oppositeBuses.size()) ? &oppositeBuses.getReference (0) : nullptr; // get the target number of channels const int mainBusNumChannels = preferredSet.size(); const int mainBusOppositeChannels = (oppositeBus != nullptr) ? oppositeBus->channels.size() : 0; const int dir = isInput ? 0 : 1; // find a compatible channel configuration on the opposite bus which is the closest match // to the current number of channels on that bus int distance = std::numeric_limits<int>::max(); int bestConfiguration = -1; for (int i = 0; i < numChannelConfigs; ++i) { // is the configuration compatible with the preferred set if (channelConfigs[i][dir] == mainBusNumChannels) { const int configChannels = channelConfigs[i][dir^1]; const int channelDifference = std::abs (configChannels - mainBusOppositeChannels); if (channelDifference < distance) { distance = channelDifference; bestConfiguration = configChannels; // we can exit if we found a perfect match if (distance == 0) break; } } } // unable to find a good configuration if (bestConfiguration == -1) return false; // did the number of channels change on the opposite bus? if (mainBusOppositeChannels != bestConfiguration && oppositeBus != nullptr) { // if the channels on the opposite bus are the same as the preferred set // then also copy over the layout information. If not, then assume // a cononical channel layout if (bestConfiguration == mainBusNumChannels) oppositeBus->channels = preferredSet; else oppositeBus->channels = AudioChannelSet::canonicalChannelSet (bestConfiguration); } } #endif bus.channels = preferredSet; if (oldNumInputs != getTotalNumInputChannels() || oldNumOutputs != getTotalNumOutputChannels()) { updateSpeakerFormatStrings(); numChannelsChanged(); } return true; }