|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2015 - ROLI Ltd.
-
- Permission is granted to use this software under the terms of either:
- a) the GPL v2 (or any later version)
- b) the Affero GPL v3
-
- Details of these licenses can be found at: www.gnu.org/licenses
-
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.juce.com for more information.
-
- ==============================================================================
- */
-
- #ifndef JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED
- #define JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED
-
-
- //==============================================================================
- /**
- An AudioSource that takes the audio from another source, and re-maps its
- input and output channels to a different arrangement.
-
- You can use this to increase or decrease the number of channels that an
- audio source uses, or to re-order those channels.
-
- Call the reset() method before using it to set up a default mapping, and then
- the setInputChannelMapping() and setOutputChannelMapping() methods to
- create an appropriate mapping, otherwise no channels will be connected and
- it'll produce silence.
-
- @see AudioSource
- */
- class ChannelRemappingAudioSource : public AudioSource
- {
- public:
- //==============================================================================
- /** Creates a remapping source that will pass on audio from the given input.
-
- @param source the input source to use. Make sure that this doesn't
- get deleted before the ChannelRemappingAudioSource object
- @param deleteSourceWhenDeleted if true, the input source will be deleted
- when this object is deleted, if false, the caller is
- responsible for its deletion
- */
- ChannelRemappingAudioSource (AudioSource* source,
- bool deleteSourceWhenDeleted);
-
- /** Destructor. */
- ~ChannelRemappingAudioSource();
-
- //==============================================================================
- /** Specifies a number of channels that this audio source must produce from its
- getNextAudioBlock() callback.
- */
- void setNumberOfChannelsToProduce (int requiredNumberOfChannels);
-
- /** Clears any mapped channels.
-
- After this, no channels are mapped, so this object will produce silence. Create
- some mappings with setInputChannelMapping() and setOutputChannelMapping().
- */
- void clearAllMappings();
-
- /** Creates an input channel mapping.
-
- When the getNextAudioBlock() method is called, the data in channel sourceChannelIndex of the incoming
- data will be sent to destChannelIndex of our input source.
-
- @param destChannelIndex the index of an input channel in our input audio source (i.e. the
- source specified when this object was created).
- @param sourceChannelIndex the index of the input channel in the incoming audio data buffer
- during our getNextAudioBlock() callback
- */
- void setInputChannelMapping (int destChannelIndex,
- int sourceChannelIndex);
-
- /** Creates an output channel mapping.
-
- When the getNextAudioBlock() method is called, the data returned in channel sourceChannelIndex by
- our input audio source will be copied to channel destChannelIndex of the final buffer.
-
- @param sourceChannelIndex the index of an output channel coming from our input audio source
- (i.e. the source specified when this object was created).
- @param destChannelIndex the index of the output channel in the incoming audio data buffer
- during our getNextAudioBlock() callback
- */
- void setOutputChannelMapping (int sourceChannelIndex,
- int destChannelIndex);
-
- /** Returns the channel from our input that will be sent to channel inputChannelIndex of
- our input audio source.
- */
- int getRemappedInputChannel (int inputChannelIndex) const;
-
- /** Returns the output channel to which channel outputChannelIndex of our input audio
- source will be sent to.
- */
- int getRemappedOutputChannel (int outputChannelIndex) const;
-
-
- //==============================================================================
- /** Returns an XML object to encapsulate the state of the mappings.
- @see restoreFromXml
- */
- XmlElement* createXml() const;
-
- /** Restores the mappings from an XML object created by createXML().
- @see createXml
- */
- void restoreFromXml (const XmlElement&);
-
- //==============================================================================
- void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override;
- void releaseResources() override;
- void getNextAudioBlock (const AudioSourceChannelInfo&) override;
-
-
- private:
- //==============================================================================
- OptionalScopedPointer<AudioSource> source;
- Array<int> remappedInputs, remappedOutputs;
- int requiredNumberOfChannels;
-
- AudioSampleBuffer buffer;
- AudioSourceChannelInfo remappedInfo;
- CriticalSection lock;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelRemappingAudioSource)
- };
-
-
- #endif // JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED
|