Audacity 3.2.0
EffectStage.h
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 @file EffectStage.h
6 @brief decorator of a Sink with a non-time-warping effect
7
8 Dominic Mazzoni
9 Vaughan Johnson
10
11 Paul Licameli split from Effect.h
12
13**********************************************************************/
14
15#ifndef __AUDACITY_EFFECT_STAGE__
16#define __AUDACITY_EFFECT_STAGE__
17
18#include "AudioGraphSource.h" // to inherit
19#include "EffectInterface.h"
20#include "SampleCount.h"
21#include <functional>
22
24
26class MIXER_API EffectStage final : public AudioGraph::Source {
27 // To force usage of Create() instead
28 struct CreateToken {};
29public:
30 using Factory = std::function<std::shared_ptr<EffectInstance>()>;
31
33
44 EffectStage(CreateToken, int channel, Source &upstream, Buffers &inBuffers,
46 double sampleRate,
47 std::optional<sampleCount> genLength, const WideSampleSequence &sequence);
48
50 static std::unique_ptr<EffectStage> Create(int channel,
51 Source &upstream, Buffers &inBuffers,
53 double sampleRate,
54 std::optional<sampleCount> genLength, const WideSampleSequence &sequence);
55
56 EffectStage(const EffectStage&) = delete;
57 EffectStage &operator =(const EffectStage &) = delete;
59 ~EffectStage() override;
60
64 bool AcceptsBuffers(const Buffers &buffers) const override;
66 bool AcceptsBlockSize(size_t size) const override;
67
68 std::optional<size_t> Acquire(Buffers &data, size_t bound) override;
69 sampleCount Remaining() const override;
70 bool Release() override;
71
72private:
74 { return std::max<sampleCount>(0, mDelayRemaining); }
75
77
83 bool Process(EffectInstance &instance, size_t channel,
84 const Buffers &data, size_t curBlockSize, size_t outBufferOffset) const;
85
86 [[nodiscard]] std::optional<size_t> FetchProcessAndAdvance(
87 Buffers &data, size_t bound, bool doZeros, size_t outBufferOffset = 0);
88
89 Source &mUpstream;
92 const std::vector<std::shared_ptr<EffectInstance>> mInstances;
94 const double mSampleRate;
95 const bool mIsProcessor;
96
98 size_t mLastProduced{};
99 size_t mLastZeroes{};
100 bool mLatencyDone{ false };
101 bool mCleared{ false };
102};
103
104/*
105 @param channel selects one channel if non-negative; else all channels
106 @param[out] map terminated with ChannelNameEOL
107 @return 1 if `channel >= 0`, else the number of channels
108
109 @pre `channel < sequence.NChannels()`
110 */
111MIXER_API
112unsigned MakeChannelMap(const WideSampleSequence &sequence, int channel,
113 // TODO: more-than-two-channels
114 ChannelName map[3]);
115
116#endif
ChannelName
MIXER_API unsigned MakeChannelMap(const WideSampleSequence &sequence, int channel, ChannelName map[3])
static Settings & settings()
Definition: TrackInfo.cpp:69
Accumulates (non-interleaved) data during effect processing.
Upstream producer of sample streams, taking Buffers as external context.
virtual sampleCount Remaining() const =0
Result includes any amount Acquired and not yet Released.
virtual bool AcceptsBlockSize(size_t blockSize) const =0
virtual bool AcceptsBuffers(const Buffers &buffers) const =0
virtual std::optional< size_t > Acquire(Buffers &data, size_t bound)=0
Occupy vacant space in Buffers with some data.
virtual bool Release()=0
Caller is done examining last Acquire()d positions.
Performs effect computation.
Decorates a source with a non-timewarping effect, which may have latency.
Definition: EffectStage.h:26
Source & mUpstream
Definition: EffectStage.h:89
const std::vector< std::shared_ptr< EffectInstance > > mInstances
Definition: EffectStage.h:92
const double mSampleRate
Definition: EffectStage.h:94
sampleCount mDelayRemaining
Definition: EffectStage.h:97
EffectStage(const EffectStage &)=delete
std::function< std::shared_ptr< EffectInstance >()> Factory
Definition: EffectStage.h:30
Buffers & mInBuffers
Definition: EffectStage.h:91
sampleCount DelayRemaining() const
Definition: EffectStage.h:73
const bool mIsProcessor
Definition: EffectStage.h:95
EffectSettings & mSettings
Definition: EffectStage.h:93
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:19
static RegisteredToolbarFactory factory
Externalized state of a plug-in.