Skip to content

Commit 542c169

Browse files
committed
ASP and ATP: enabled double precision conversion support.
This adds the benefit of generically approaching these procs from a very high level, allowing double convs.
1 parent c3afe90 commit 542c169

File tree

4 files changed

+57
-5
lines changed

4 files changed

+57
-5
lines changed

modules/squarepine_audio/wrappers/squarepine_AudioSourceProcessor.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ void AudioSourceProcessor::prepareToPlay (const double newSampleRate, const int
1717

1818
if (audioSource != nullptr)
1919
audioSource->prepareToPlay (estimatedSamplesPerBlock, newSampleRate);
20+
21+
const auto numChans = jmax (2, getTotalNumInputChannels(), getTotalNumOutputChannels());
22+
23+
if (isUsingDoublePrecision())
24+
doubleFloatConv.setSize (numChans, estimatedSamplesPerBlock, false, true, false);
25+
else
26+
doubleFloatConv.setSize (0, 0, false, true, false);
2027
}
2128

2229
void AudioSourceProcessor::releaseResources()
@@ -39,3 +46,11 @@ void AudioSourceProcessor::processBlock (juce::AudioBuffer<float>& buffer, MidiB
3946
audioSource->getNextAudioBlock (info);
4047
}
4148
}
49+
50+
void AudioSourceProcessor::processBlock (juce::AudioBuffer<double>& buffer, MidiBuffer& midiMessages)
51+
{
52+
buffer.clear();
53+
doubleFloatConv.makeCopyOf (buffer, true);
54+
processBlock (doubleFloatConv, midiMessages);
55+
buffer.makeCopyOf (doubleFloatConv);
56+
}

modules/squarepine_audio/wrappers/squarepine_AudioSourceProcessor.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,17 @@ class AudioSourceProcessor final : public InternalProcessor
3030
/** @internal */
3131
void processBlock (juce::AudioBuffer<float>&, MidiBuffer&) override;
3232
/** @internal */
33+
void processBlock (juce::AudioBuffer<double>&, MidiBuffer&) override;
34+
/** @internal */
35+
bool supportsDoublePrecisionProcessing() const override { return true; }
36+
/** @internal */
3337
void releaseResources() override;
3438

3539
private:
3640
//==============================================================================
3741
OptionalScopedPointer<AudioSource> audioSource;
3842
AudioSourceChannelInfo info;
43+
juce::AudioBuffer<float> doubleFloatConv;
3944

4045
//==============================================================================
4146
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSourceProcessor)

modules/squarepine_audio/wrappers/squarepine_AudioTransportProcessor.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,16 @@ void AudioTransportProcessor::clear()
7171
source.reset();
7272
}
7373

74+
bool AudioTransportProcessor::isClear() const
75+
{
76+
return source == nullptr;
77+
}
78+
79+
bool AudioTransportProcessor::hasSource() const
80+
{
81+
return ! isClear();
82+
}
83+
7484
//==============================================================================
7585
void AudioTransportProcessor::setSource (PositionableAudioSource* const s,
7686
bool transportOwnsSource,
@@ -136,12 +146,12 @@ void AudioTransportProcessor::prepareToPlay (const double newSampleRate, const i
136146

137147
void AudioTransportProcessor::processBlock (juce::AudioBuffer<float>& buffer, MidiBuffer& midiMessages)
138148
{
139-
buffer.clear();
140-
141-
if (isSuspended() || isBypassed())
142-
return;
149+
process (buffer, midiMessages);
150+
}
143151

144-
audioSourceProcessor.processBlock (buffer, midiMessages);
152+
void AudioTransportProcessor::processBlock (juce::AudioBuffer<double>& buffer, MidiBuffer& midiMessages)
153+
{
154+
process (buffer, midiMessages);
145155
}
146156

147157
void AudioTransportProcessor::releaseResources()

modules/squarepine_audio/wrappers/squarepine_AudioTransportProcessor.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ class AudioTransportProcessor final : public InternalProcessor
4747
*/
4848
void clear();
4949

50+
/** @returns true if no source is present. */
51+
[[nodiscard]] bool isClear() const;
52+
53+
/** @returns true if a source is present. */
54+
[[nodiscard]] bool hasSource() const;
55+
5056
//==============================================================================
5157
/** Changes the current time to that of the specified seconds. */
5258
void setCurrentTime (double seconds);
@@ -129,6 +135,10 @@ class AudioTransportProcessor final : public InternalProcessor
129135
/** @internal */
130136
void processBlock (juce::AudioBuffer<float>&, MidiBuffer&) override;
131137
/** @internal */
138+
void processBlock (juce::AudioBuffer<double>&, MidiBuffer&) override;
139+
/** @internal */
140+
bool supportsDoublePrecisionProcessing() const override { return true; }
141+
/** @internal */
132142
void releaseResources() override;
133143

134144
private:
@@ -141,6 +151,18 @@ class AudioTransportProcessor final : public InternalProcessor
141151
AudioTransportSource* transport = nullptr;
142152
OptionalScopedPointer<PositionableAudioSource> source;
143153

154+
//==============================================================================
155+
template<typename SampleType>
156+
void process (juce::AudioBuffer<SampleType>& buffer, MidiBuffer& midiMessages)
157+
{
158+
buffer.clear();
159+
160+
if (isSuspended() || isBypassed())
161+
return;
162+
163+
audioSourceProcessor.processBlock (buffer, midiMessages);
164+
}
165+
144166
//==============================================================================
145167
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioTransportProcessor)
146168
};

0 commit comments

Comments
 (0)