Audacity 3.2.0
Mix.h
Go to the documentation of this file.
1/**********************************************************************
2
3 Audacity: A Digital Audio Editor
4
5 Mix.h
6
7 Dominic Mazzoni
8 Markus Meyer
9
10***********************************************************************/
11
12#ifndef __AUDACITY_MIX__
13#define __AUDACITY_MIX__
14
15#include "AudioGraphBuffers.h"
16#include "AudioGraphSource.h"
17#include "MixerOptions.h"
18#include "SampleFormat.h"
19#include <optional>
20
21class sampleCount;
22class BoundedEnvelope;
23class EffectStage;
24class MixerSource;
25class TrackList;
27
28class MIXER_API Mixer : public AudioGraph::Source
29{
30public:
35 using Stages = std::vector<MixerOptions::StageSpecification>;
36
37 struct Input {
39 std::shared_ptr<const WideSampleSequence> pSequence = {},
40 Stages stages = {}
41 ) : pSequence{ move(pSequence) }, stages{ move(stages) }
42 {}
43
44 std::shared_ptr<const WideSampleSequence> pSequence;
46 };
47 using Inputs = std::vector<Input>;
48
49 enum class ApplyGain
50 {
51 Discard,//< No source gain is applied
52 MapChannels, //< Apply gains per source's channel
53 Mixdown, //< Average gains from all channels in the source, numOutChannels should be 1
54 };
55
56 //
57 // Constructor / Destructor
58 //
59
66 Mixer(
67 Inputs inputs, std::optional<Stages> masterEffects, bool mayThrow,
68 const WarpOptions& warpOptions, double startTime, double stopTime,
69 unsigned numOutChannels, size_t outBufferSize, bool outInterleaved,
70 double outRate, sampleFormat outFormat, bool highQuality = true,
72 MixerSpec* mixerSpec = nullptr,
73 ApplyGain applyGain = ApplyGain::MapChannels);
74
75 Mixer(const Mixer&) = delete;
76 Mixer &operator=(const Mixer&) = delete;
77
78 virtual ~ Mixer();
79
80 size_t BufferSize() const { return mBufferSize; }
81
82 //
83 // Processing
84 //
85
88
94 size_t Process(size_t maxSamples);
95
99 size_t Process() { return Process(BufferSize()); }
100
102 void Reposition(double t, bool bSkipping = false);
103
105 void SetTimesAndSpeed(
106 double t0, double t1, double speed, bool bSkipping = false);
107 void SetSpeedForKeyboardScrubbing(double speed, double startTime);
108
110
111 double MixGetCurrentTime();
112
114 constSamplePtr GetBuffer();
115
117 constSamplePtr GetBuffer(int channel);
118
120 sampleFormat EffectiveFormat() const;
121
122 private:
123
124 void Clear();
125
126 // AudioGraph::Source
127private:
128 bool AcceptsBuffers(const Buffers& buffers) const override;
129 bool AcceptsBlockSize(size_t blockSize) const override;
130 std::optional<size_t> Acquire(Buffers& data, size_t bound) override;
131 sampleCount Remaining() const override;
132 bool Release() override;
133
134private:
135 std::unique_ptr<EffectStage>& RegisterEffectStage(
136 AudioGraph::Source& upstream,
137 const MixerOptions::StageSpecification& stage, double outRate);
138
139 // Input
140 const unsigned mNumChannels;
142 const std::optional<Stages> mMasterEffects;
143
144 // Transformations
145 const size_t mBufferSize;
146
147 std::pair<bool, sampleFormat>
148 NeedsDither(bool needsDither, double rate) const;
149
150 private:
151
152 // Output
154 const bool mHighQuality; // dithering
155 const sampleFormat mFormat; // output format also influences dithering
156 const bool mInterleaved;
157
158 // INPUT
161 bool mHasMixerSpec{false};
162
163 const std::shared_ptr<TimesAndSpeed> mTimesAndSpeed;
164
165 // BUFFERS
166
167 // Resample into these buffers, or produce directly when not resampling
169
170 // Each channel's data is transformed, including application of
171 // gains and pans, and then (maybe many-to-one) mixer specifications
172 // determine where in mTemp it is accumulated
174
175 // Final result applies dithering and interleaving
176 const std::vector<SampleBuffer> mBuffer;
177
178 std::vector<MixerSource> mSources;
179 std::vector<EffectSettings> mSettings;
180 std::vector<AudioGraph::Buffers> mStageBuffers;
181 std::vector<std::unique_ptr<EffectStage>> mStages;
182 std::vector<AudioGraph::Source*> mMasterStages;
183
185 std::vector<Source> mDecoratedSources;
186};
187#endif
constexpr int BufferSize
static const AttachedProjectObjects::RegisteredFactory masterEffects
sampleFormat
The ordering of these values with operator < agrees with the order of increasing bit width.
Definition: SampleFormat.h:30
const char * constSamplePtr
Definition: SampleFormat.h:58
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.
Decorates a source with a non-timewarping effect, which may have latency.
Definition: EffectStage.h:26
Functions for doing the mixdown of the tracks.
Definition: Mix.h:29
AudioGraph::Buffers mFloatBuffers
Definition: Mix.h:168
ApplyGain
Definition: Mix.h:50
const ApplyGain mApplyGain
Definition: Mix.h:153
std::vector< EffectSettings > mSettings
Definition: Mix.h:179
const std::vector< SampleBuffer > mBuffer
Definition: Mix.h:176
std::vector< AudioGraph::Source * > mMasterStages
Definition: Mix.h:182
std::vector< Input > Inputs
Definition: Mix.h:47
std::vector< std::unique_ptr< EffectStage > > mStages
Definition: Mix.h:181
std::vector< Source > mDecoratedSources
Definition: Mix.h:185
const sampleFormat mFormat
Definition: Mix.h:155
Inputs mInputs
Definition: Mix.h:141
AudioGraph::Buffers mTemp
Definition: Mix.h:173
const unsigned mNumChannels
Definition: Mix.h:140
sampleFormat mEffectiveFormat
Definition: Mix.h:159
std::vector< MixerOptions::StageSpecification > Stages
Definition: Mix.h:35
const std::optional< Stages > mMasterEffects
Definition: Mix.h:142
const bool mInterleaved
Definition: Mix.h:156
const size_t mBufferSize
Definition: Mix.h:145
bool mNeedsDither
Definition: Mix.h:160
Mixer(const Mixer &)=delete
std::vector< AudioGraph::Buffers > mStageBuffers
Definition: Mix.h:180
const bool mHighQuality
Definition: Mix.h:154
std::vector< MixerSource > mSources
Definition: Mix.h:178
size_t Process()
Definition: Mix.h:99
size_t BufferSize() const
Definition: Mix.h:80
Mixer & operator=(const Mixer &)=delete
const std::shared_ptr< TimesAndSpeed > mTimesAndSpeed
Definition: Mix.h:163
A matrix of booleans, one row per input channel, column per output.
Definition: MixerOptions.h:32
A flat linked list of tracks supporting Add, Remove, Clear, and Contains, serialization of the list o...
Definition: Track.h:850
Positions or offsets within audio files need a wide type.
Definition: SampleCount.h:19
Stages stages
Definition: Mix.h:45
Input(std::shared_ptr< const WideSampleSequence > pSequence={}, Stages stages={})
Definition: Mix.h:38
std::shared_ptr< const WideSampleSequence > pSequence
Definition: Mix.h:44
AudioGraph::Source & downstream
Definition: Mix.h:184
Immutable structure is an argument to Mixer's constructor.
Definition: MixerOptions.h:56