74 if (info.nodeGraphToReplace !=
nullptr)
75 if (
auto oldNode = findNodeWithID<ContainerClipNode> (*info.nodeGraphToReplace, getNodeProperties().nodeID))
76 playerContext = oldNode->playerContext;
81 playerContext->player.setNumThreads (0);
85 if (
auto tempoSequence = getProcessState().getTempoSequence())
86 playerContext->processState.setTempoSequence (tempoSequence);
91 assert (playerContext->player.getSampleRate() == info.sampleRate);
97 [localProcessState = &playerContext->processState] (
auto& node)
99 if (auto ten = dynamic_cast<TracktionEngineNode*> (&node))
100 ten->setProcessState (*localProcessState);
102 for (auto internalNode : node.getInternalNodes())
103 if (auto ten = dynamic_cast<TracktionEngineNode*> (internalNode))
104 ten->setProcessState (*localProcessState);
107 playerContext->player.setNode (std::move (input),
108 info.sampleRate, info.blockSize);
118 const auto sectionEditBeatRange = getEditBeatRange();
119 const auto sectionEditSampleRange = getTimelineSampleRange();
121 if (sectionEditBeatRange.getEnd() <= clipPosition.getStart()
122 || sectionEditBeatRange.getStart() >= clipPosition.getEnd())
131 auto& player = playerContext->player;
132 const auto sampleRate = getSampleRate();
134 auto& editPlayHead = getPlayHead();
135 auto& editPlayHeadState = getPlayHeadState();
136 auto& localPlayHead = playerContext->playHead;
139 const auto editStartBeatOfLocalTimeline = clipPosition.getStart() - clipOffset;
140 const auto editStartTimeOfLocalTimeline = tempoPosition->set (editStartBeatOfLocalTimeline);
142 const TimeRange loopTimeRange (tempoPosition->set (loopRange.getStart()),
143 tempoPosition->set (loopRange.getEnd()));
144 const auto loopRangeSamples = toSamples (loopTimeRange, sampleRate);
148 localPlayHead.setReferenceSampleRange (pc.referenceSampleRange);
151 if (! loopRangeSamples.isEmpty() && localPlayHead.getLoopRange() != loopRangeSamples)
152 localPlayHead.setLoopRange (
true, loopRangeSamples,
false);
155 const auto playheadOffset = toSamples (editStartTimeOfLocalTimeline, sampleRate);
156 playerContext->processState.setPlaybackSpeedRatio (getPlaybackSpeedRatio());
158 int64_t newPosition = editPlayHead.getPosition() - playheadOffset + loopRangeSamples.getStart();
160 if (localPlayHead.isLooping())
161 newPosition = localPlayHead.linearPositionToLoopPosition (newPosition, localPlayHead.getLoopRange());
163 if (editPlayHeadState.isContiguousWithPreviousBlock())
164 localPlayHead.overridePosition (newPosition);
166 localPlayHead.setPosition (newPosition);
169 if (editPlayHead.isStopped() && ! localPlayHead.isStopped())
170 localPlayHead.stop();
172 if (editPlayHead.isPlaying() && ! localPlayHead.isPlaying())
173 localPlayHead.play();
175 assert (! localPlayHead.isLooping() || localPlayHead.getLoopRange().contains (localPlayHead.getPosition()));
179 { pc.buffers.audio, pc.buffers.midi } };
180 player.process (localPC);
184 const TimeRange clipTimeRange (tempoPosition->set (clipPosition.getStart()),
185 tempoPosition->set (clipPosition.getEnd()));
186 const auto editPositionInSamples = toSamples ({ clipTimeRange.getStart(), clipTimeRange.getEnd() }, sampleRate);
188 const auto destBuffer = pc.buffers.audio;
189 auto numSamplesToClearAtStart =
std::min (editPositionInSamples.getStart() - sectionEditSampleRange.getStart(), (SampleCount) destBuffer.getNumFrames());
190 auto numSamplesToClearAtEnd =
std::min (sectionEditSampleRange.getEnd() - editPositionInSamples.getEnd(), (SampleCount) destBuffer.getNumFrames());
192 if (numSamplesToClearAtStart > 0)
193 destBuffer.getStart ((choc::buffer::FrameCount) numSamplesToClearAtStart).clear();
195 if (numSamplesToClearAtEnd > 0)
196 destBuffer.getEnd ((choc::buffer::FrameCount) numSamplesToClearAtEnd).clear();
Struct to describe a single iteration of a process call.