@@ -36,20 +36,23 @@ template <typename ClientType> class FlucomaAlgorithm : public IAlgorithm {
3636 bool StartProcessItemAsync (MediaItem *item) override final {
3737
3838 SetMediaItemInfo_Value (item, " C_LOCK" , true );
39- UpdateTimeline ();
4039
4140 if (!item || !mApiProvider )
4241 return false ;
4342 mIsFinishedFlag = false ;
4443 mProgress = 0.0 ;
4544
4645 MediaItem_Take *take = GetActiveTake (item);
47- if (!take)
46+ if (!take) {
47+ SetMediaItemInfo_Value (item, " C_LOCK" , false );
4848 return false ;
49+ }
4950
5051 PCM_source *source = GetMediaItemTake_Source (take);
51- if (!source)
52+ if (!source) {
53+ SetMediaItemInfo_Value (item, " C_LOCK" , false );
5254 return false ;
55+ }
5356
5457 const int sampleRate = GetMediaSourceSampleRate (source);
5558 const int numChannels = GetMediaSourceNumChannels (source);
@@ -113,6 +116,8 @@ template <typename ClientType> class FlucomaAlgorithm : public IAlgorithm {
113116 if (!mItemForAsync || item != mItemForAsync )
114117 return false ;
115118
119+ SetMediaItemInfo_Value (item, " C_LOCK" , false );
120+
116121 bool success = HandleResults (mItemForAsync , mTakeForAsync ,
117122 mNumChannelsForAsync , mSampleRateForAsync );
118123
@@ -123,8 +128,6 @@ template <typename ClientType> class FlucomaAlgorithm : public IAlgorithm {
123128 mItemForAsync = nullptr ;
124129 mTakeForAsync = nullptr ;
125130
126- SetMediaItemInfo_Value (item, " C_LOCK" , false );
127-
128131 if (success) {
129132 UpdateTimeline ();
130133 }
@@ -159,8 +162,10 @@ template <typename ClientType> class FlucomaAlgorithm : public IAlgorithm {
159162 return ;
160163
161164 double itemPos = GetMediaItemInfo_Value (item, " D_POSITION" );
165+ double itemLen = GetMediaItemInfo_Value (item, " D_LENGTH" );
162166 double startOffs = GetMediaItemTakeInfo_Value (take, " D_STARTOFFS" );
163167 double playrate = GetMediaItemTakeInfo_Value (take, " D_PLAYRATE" );
168+ double epsilon = 0.0001 ; // Avoid splitting at the very start or end
164169
165170 // Collect marker positions (in source time) and convert to project time
166171 std::vector<double > splitPositions;
@@ -171,11 +176,19 @@ template <typename ClientType> class FlucomaAlgorithm : public IAlgorithm {
171176 // project_time = item_position + (marker_source_time -
172177 // take_offset) / playrate
173178 double projectTime = itemPos + (srcPos - startOffs) / playrate;
174- splitPositions.push_back (projectTime);
179+
180+ // Only split if within item bounds (with small epsilon)
181+ if (projectTime > itemPos + epsilon &&
182+ projectTime < itemPos + itemLen - epsilon) {
183+ splitPositions.push_back (projectTime);
184+ }
175185 }
176186 }
177187
178188 std::sort (splitPositions.begin (), splitPositions.end ());
189+ splitPositions.erase (
190+ std::unique (splitPositions.begin (), splitPositions.end ()),
191+ splitPositions.end ());
179192
180193 // Split from right to left so earlier positions remain valid
181194 for (int i = static_cast <int >(splitPositions.size ()) - 1 ; i >= 0 ; i--) {
@@ -282,6 +295,8 @@ class AudioOutputAlgorithm : public FlucomaAlgorithm<ClientType> {
282295 GetSetMediaItemTakeInfo (newTake, " P_SOURCE" , newSource);
283296 GetSetMediaItemTakeInfo (newTake, " P_NAME" ,
284297 (char *)takeName.c_str ());
298+ double zero = 0.0 ;
299+ GetSetMediaItemTakeInfo (newTake, " D_STARTOFFS" , &zero);
285300 }
286301 }
287302 }
0 commit comments