|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2022 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- The code included in this file is provided under the terms of the ISC license
- http://www.isc.org/downloads/software-support-policy/isc-license. Permission
- To use, copy, modify, and/or distribute this software for any purpose with or
- without fee is hereby granted provided that the above copyright notice and
- this permission notice appear in all copies.
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- //==============================================================================
- /**
- A type of AudioSource that takes an input source and changes its sample rate.
-
- @see AudioSource, LagrangeInterpolator, CatmullRomInterpolator
-
- @tags{Audio}
- */
- class JUCE_API ResamplingAudioSource : public AudioSource
- {
- public:
- //==============================================================================
- /** Creates a ResamplingAudioSource for a given input source.
-
- @param inputSource the input source to read from
- @param deleteInputWhenDeleted if true, the input source will be deleted when
- this object is deleted
- @param numChannels the number of channels to process
- */
- ResamplingAudioSource (AudioSource* inputSource,
- bool deleteInputWhenDeleted,
- int numChannels = 2);
-
- /** Destructor. */
- ~ResamplingAudioSource() override;
-
- /** Changes the resampling ratio.
-
- (This value can be changed at any time, even while the source is running).
-
- @param samplesInPerOutputSample if set to 1.0, the input is passed through; higher
- values will speed it up; lower values will slow it
- down. The ratio must be greater than 0
- */
- void setResamplingRatio (double samplesInPerOutputSample);
-
- /** Returns the current resampling ratio.
-
- This is the value that was set by setResamplingRatio().
- */
- double getResamplingRatio() const noexcept { return ratio; }
-
- /** Clears any buffers and filters that the resampler is using. */
- void flushBuffers();
-
- //==============================================================================
- void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override;
- void releaseResources() override;
- void getNextAudioBlock (const AudioSourceChannelInfo&) override;
-
- private:
- //==============================================================================
- OptionalScopedPointer<AudioSource> input;
- double ratio = 1.0, lastRatio = 1.0;
- AudioBuffer<float> buffer;
- int bufferPos = 0, sampsInBuffer = 0;
- double subSampleOffset = 0.0;
- double coefficients[6];
- SpinLock ratioLock;
- CriticalSection callbackLock;
- const int numChannels;
- HeapBlock<float*> destBuffers;
- HeapBlock<const float*> srcBuffers;
-
- void setFilterCoefficients (double c1, double c2, double c3, double c4, double c5, double c6);
- void createLowPass (double proportionalRate);
-
- struct FilterState
- {
- double x1, x2, y1, y2;
- };
-
- HeapBlock<FilterState> filterStates;
- void resetFilters();
-
- void applyFilter (float* samples, int num, FilterState& fs);
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResamplingAudioSource)
- };
-
- } // namespace juce
|