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

« « « Anklang Documentation
Loading...
Searching...
No Matches
tracktion_WarpTimeManager.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
11namespace tracktion { inline namespace engine
12{
13
14//==============================================================================
15//==============================================================================
21{
23 WarpMarker() noexcept = default;
24
27 : sourceTime (s), warpTime (w) {}
28
30 WarpMarker (const juce::ValueTree& v) : state (v)
31 {
32 updateFrom (v, IDs::sourceTime);
33 updateFrom (v, IDs::warpTime);
34 }
35
38 {
39 if (i == IDs::sourceTime)
40 sourceTime = TimePosition::fromSeconds (double (v.getProperty (IDs::sourceTime)));
41 else if (i == IDs::warpTime)
42 warpTime = TimePosition::fromSeconds (double (v.getProperty (IDs::warpTime)));
43 }
44
46 HashCode getHash() const noexcept;
47
48 juce::ValueTree state;
49 TimePosition sourceTime, warpTime;
50};
51
52
53//==============================================================================
54//==============================================================================
62class WarpTimeManager : public juce::SingleThreadedReferenceCountedObject,
63 public RenderManager::Job::Listener
64{
65public:
66 //==============================================================================
68
71
75 WarpTimeManager (Edit&, const AudioFile& sourceFile, juce::ValueTree parentTree);
76
78 ~WarpTimeManager() override;
79
80 //==============================================================================
82 void setSourceFile (const AudioFile&);
83
85 AudioFile getSourceFile() const;
86
88 TimeDuration getSourceLength() const;
89
90 //==============================================================================
94 bool isWarpEndMarkerEnabled() const noexcept { return endMarkerEnabled; }
95
99 bool areEndMarkersLimited() const noexcept { return endMarkersLimited; }
100
102 const juce::Array<WarpMarker*>& getMarkers() const { return markers->objects; }
103
105 int insertMarker (WarpMarker);
106
108 void removeMarker (int index);
109
111 void removeAllMarkers();
112
114 TimePosition moveMarker (int index, TimePosition newWarpTime);
115
119 void setWarpEndMarkerTime (TimePosition endTime);
120
121 //==============================================================================
123 juce::Array<TimeRange> getWarpTimeRegions (TimeRange overallTimeRegion) const;
124
130
132 TimePosition warpTimeToSourceTime (TimePosition warpTime) const;
133
135 TimePosition sourceTimeToWarpTime (TimePosition sourceTime) const;
136
138 TimePosition getWarpedStart() const;
139
141 TimePosition getWarpedEnd() const;
142
144 TimePosition getWarpEndMarkerTime() const;
145
147 HashCode getHash() const;
148
150 void editFinishedLoading();
151
152 Edit& edit;
153 juce::ValueTree state;
154
155private:
156 struct WarpMarkerList : public ValueTreeObjectList<WarpMarker>
157 {
158 WarpMarkerList (const juce::ValueTree& v)
159 : ValueTreeObjectList<WarpMarker> (v), state (v)
160 {
161 rebuildObjects();
162 }
163
164 ~WarpMarkerList() override
165 {
166 freeObjects();
167 }
168
169 bool isSuitableType (const juce::ValueTree& v) const override { return v.hasType (IDs::WARPMARKER); }
170 WarpMarker* createNewObject (const juce::ValueTree& v) override { return new WarpMarker (v); }
171 void deleteObject (WarpMarker* wm) override { delete wm; }
172 void newObjectAdded (WarpMarker*) override {}
173 void objectRemoved (WarpMarker*) override {}
174 void objectOrderChanged() override {}
175
176 void valueTreePropertyChanged (juce::ValueTree& v, const juce::Identifier& i) override
177 {
178 if (v.hasType (IDs::WARPMARKER))
179 if (auto wm = getWarpMarkerFor (v))
180 wm->updateFrom (v, i);
181 }
182
183 juce::ValueTree state;
184
185 private:
186 WarpMarker* getWarpMarkerFor (const juce::ValueTree& v)
187 {
188 jassert (v.hasType (IDs::WARPMARKER));
189 return objects[v.getParent().indexOf (v)];
190 }
191
193 };
194
195 friend class WarpTimeFactory;
196
197 const AudioClipBase* clip = nullptr;
198 AudioFile sourceFile;
199 bool endMarkerEnabled = true, endMarkersLimited = false;
200
202 RenderManager::Job::Ptr transientDetectionJob;
203 std::pair<bool, juce::Array<TimePosition>> transientTimes { false, {} };
205
206 juce::UndoManager* getUndoManager() const;
207 void jobFinished (RenderManager::Job& job, bool completedOk) override;
208
210};
211
212
213//==============================================================================
214//==============================================================================
219{
220public:
222 WarpTimeFactory() = default;
223
225 ~WarpTimeFactory() { jassert (warpTimeManagers.isEmpty()); }
226
232 WarpTimeManager::Ptr getWarpTimeManager (const Clip&);
233
234private:
235 friend class WarpTimeManager;
236 juce::Array<WarpTimeManager*> warpTimeManagers;
237 juce::CriticalSection warpTimeLock;
238
239 void addWarpTimeManager (WarpTimeManager&);
240 void removeWarpTimeManager (WarpTimeManager&);
241
243};
244
245}} // namespace tracktion { inline namespace engine
Base class for Clips that produce some kind of audio e.g.
A clip in an edit.
The Tracktion Edit class!
Manages a set of reference counted render jobs and can be used to retrieve matching jobs or create ne...
A WarpTimeFactory manages WarpTimeManagers for Clips living in an Edit.
WarpTimeFactory()=default
Constructs the WarpTimeFactory.
A WarpTimeManager contains a list of WarpMarkers and some source material and maps times from a linea...
const juce::Array< WarpMarker * > & getMarkers() const
Returns a list of the current WarpMarkers.
bool isWarpEndMarkerEnabled() const noexcept
Returns true if the end marker is being used as the end of the source material.
std::pair< bool, juce::Array< TimePosition > > getTransientTimes() const
Returns an array of transient times that have been detected from the source file.
bool areEndMarkersLimited() const noexcept
Returns true if the markers are limited to the end of the source length.
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
Represents a duration in real-life time.
Represents a position in real-life time.
A WarpMarker is a point that maps from a linear "source" time to a "warped" time.
WarpMarker(const juce::ValueTree &v)
Loads a WarpMarker from a saved state.
void updateFrom(const juce::ValueTree &v, const juce::Identifier &i)
Updates this WarpMarker from a ValueTree property.
WarpMarker() noexcept=default
Creates an empty WarpMarker.
HashCode getHash() const noexcept
Returns a hash for this marker.