27 const bool deleteSourceWhenDeleted)
28 : source (source_, deleteSourceWhenDeleted),
29 requiredNumberOfChannels (2)
31 remappedInfo.buffer = &buffer;
32 remappedInfo.startSample = 0;
40 const ScopedLock sl (lock);
41 requiredNumberOfChannels = requiredNumberOfChannels_;
46 const ScopedLock sl (lock);
48 remappedInputs.clear();
49 remappedOutputs.clear();
54 const ScopedLock sl (lock);
56 while (remappedInputs.size() < destIndex)
57 remappedInputs.add (-1);
59 remappedInputs.set (destIndex, sourceIndex);
64 const ScopedLock sl (lock);
66 while (remappedOutputs.size() < sourceIndex)
67 remappedOutputs.add (-1);
69 remappedOutputs.set (sourceIndex, destIndex);
74 const ScopedLock sl (lock);
76 if (inputChannelIndex >= 0 && inputChannelIndex < remappedInputs.size())
77 return remappedInputs.getUnchecked (inputChannelIndex);
84 const ScopedLock sl (lock);
86 if (outputChannelIndex >= 0 && outputChannelIndex < remappedOutputs.size())
87 return remappedOutputs .getUnchecked (outputChannelIndex);
95 source->prepareToPlay (samplesPerBlockExpected, sampleRate);
100 source->releaseResources();
105 const ScopedLock sl (lock);
107 buffer.setSize (requiredNumberOfChannels, bufferToFill.
numSamples,
false,
false,
true);
111 for (
int i = 0; i < buffer.getNumChannels(); ++i)
115 if (remappedChan >= 0 && remappedChan < numChans)
117 buffer.copyFrom (i, 0, *bufferToFill.
buffer,
128 remappedInfo.numSamples = bufferToFill.
numSamples;
130 source->getNextAudioBlock (remappedInfo);
134 for (
int i = 0; i < requiredNumberOfChannels; ++i)
138 if (remappedChan >= 0 && remappedChan < numChans)
150 auto e = std::make_unique<XmlElement> (
"MAPPINGS");
153 const ScopedLock sl (lock);
155 for (
int i = 0; i < remappedInputs.size(); ++i)
156 ins << remappedInputs.getUnchecked (i) <<
' ';
158 for (
int i = 0; i < remappedOutputs.size(); ++i)
159 outs << remappedOutputs.getUnchecked (i) <<
' ';
161 e->setAttribute (
"inputs", ins.
trimEnd());
162 e->setAttribute (
"outputs", outs.
trimEnd());
171 const ScopedLock sl (lock);
179 for (
int i = 0; i < ins.
size(); ++i)
180 remappedInputs.add (ins[i].getIntValue());
182 for (
int i = 0; i < outs.
size(); ++i)
183 remappedOutputs.add (outs[i].getIntValue());
int getNumChannels() const noexcept
void addFrom(int destChannel, int destStartSample, const AudioBuffer &source, int sourceChannel, int sourceStartSample, int numSamples, Type gainToApplyToSource=Type(1)) noexcept
void setOutputChannelMapping(int sourceChannelIndex, int destChannelIndex)
void getNextAudioBlock(const AudioSourceChannelInfo &) override
~ChannelRemappingAudioSource() override
void prepareToPlay(int samplesPerBlockExpected, double sampleRate) override
void setNumberOfChannelsToProduce(int requiredNumberOfChannels)
void restoreFromXml(const XmlElement &)
void releaseResources() override
int getRemappedInputChannel(int inputChannelIndex) const
int getRemappedOutputChannel(int outputChannelIndex) const
ChannelRemappingAudioSource(AudioSource *source, bool deleteSourceWhenDeleted)
std::unique_ptr< XmlElement > createXml() const
void setInputChannelMapping(int destChannelIndex, int sourceChannelIndex)
int size() const noexcept
int addTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
bool hasTagName(StringRef possibleTagName) const noexcept
const String & getStringAttribute(StringRef attributeName) const noexcept
void clearActiveBufferRegion() const
AudioBuffer< float > * buffer