tracktion-engine 3.0-10-g034fdde4aa5
Tracktion Engine — High level data model for audio applications

« « « Anklang Documentation
Loading...
Searching...
No Matches
tracktion_TimedMutingAudioNode.h
Go to the documentation of this file.
1 /*
2 ,--. ,--. ,--. ,--.
3 ,-' '-.,--.--.,--,--.,---.| |,-.,-' '-.`--' ,---. ,--,--, Copyright 2024
4 '-. .-'| .--' ,-. | .--'| /'-. .-',--.| .-. || \ Tracktion Software
5 | | | | \ '-' \ `--.| \ \ | | | |' '-' '| || | Corporation
6 `---' `--' `--`--'`---'`--'`--' `---' `--' `---' `--''--' www.tracktion.com
7
8 Tracktion Engine uses a GPL/commercial licence - see LICENCE.md for details.
9*/
10
11#pragma once
12
13#include "tracktion_AudioNode.h"
14
15
16namespace tracktion { inline namespace engine
17{
18
20{
21public:
23 : SingleInputAudioNode (inp), muteTimes (muteTimes_)
24 {
25 }
26
27 void renderSection (const AudioRenderContext& rc, legacy::EditTimeRange editTime)
28 {
29 for (auto r : muteTimes)
30 {
31 if (r.overlaps (editTime))
32 {
33 auto mute = r.getIntersectionWith (editTime);
34
35 if (! mute.isEmpty())
36 {
37 if (mute == editTime)
38 {
39 muteBuffer (rc, 0, rc.bufferNumSamples);
40 }
41 else if (editTime.contains (mute))
42 {
43 auto startSample = timeToSample (rc, mute.getStart() - editTime.getStart());
44 auto numSamples = timeToSample (rc, mute.getEnd() - mute.getStart());
45 muteBuffer (rc, startSample, numSamples);
46 }
47 else if (mute.getEnd() <= editTime.getEnd())
48 {
49 muteBuffer (rc, 0, timeToSample (rc, editTime.getEnd() - mute.getEnd()));
50 }
51 else if (mute.getStart() >= editTime.getStart())
52 {
53 auto startSample = timeToSample (rc, mute.getStart() - editTime.getStart());
54 muteBuffer (rc, startSample, rc.bufferNumSamples - startSample);
55 }
56 }
57 }
58
59 if (r.getEnd() >= editTime.getEnd())
60 return;
61 }
62 }
63
64 void renderOver (const AudioRenderContext& rc) override
65 {
66 input->renderOver (rc);
67
68 if (renderingNeeded (rc))
69 invokeSplitRender (rc, *this);
70 }
71
72 void renderAdding (const AudioRenderContext& rc) override
73 {
74 if (renderingNeeded (rc))
75 callRenderOver (rc);
76 else
77 input->renderAdding (rc);
78 }
79
80private:
82
83 bool renderingNeeded (const AudioRenderContext& rc) const
84 {
85 if (rc.destBuffer == nullptr || ! rc.playhead.isPlaying())
86 return false;
87
88 return true;
89 }
90
91 void muteBuffer (const AudioRenderContext& rc, int startSample, int numSamples)
92 {
93 for (int i = rc.destBuffer->getNumChannels(); --i >= 0;)
94 juce::FloatVectorOperations::clear (rc.destBuffer->getWritePointer (i, rc.bufferStartSample + startSample), numSamples);
95 }
96
97 static int timeToSample (const AudioRenderContext& rc, double t)
98 {
99 auto length = rc.streamTime.getLength();
100
101 if (length > 0.0)
102 return (int) (rc.bufferNumSamples * (t / length) + 0.5);
103
104 return 0;
105 }
106
108};
109
110}} // namespace tracktion { inline namespace engine
Type * getWritePointer(int channelNumber) noexcept
int getNumChannels() const noexcept
Base class for nodes in an audio playback graph.
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
int bufferNumSamples
The number of samples to write into the audio buffer.
int bufferStartSample
The index of the start point in the audio buffer from which data must be written.
PlayHead & playhead
The playhead provides information about current time, tempo etc at the block being rendered.
juce::AudioBuffer< float > * destBuffer
The target audio buffer which needs to be filled.
legacy::EditTimeRange streamTime
The time window which needs to be rendered into the current block.