@@ -2125,28 +2125,44 @@ void IntersectProcessor::processBlock (juce::AudioBuffer<float>& buffer,
21252125 {
21262126 std::unique_ptr<SampleData::DecodedSample> decoded (rawDecoded);
21272127 const int currentToken = latestLoadToken.load (std::memory_order_acquire);
2128+ const auto currentLoadKind = (LoadKind) latestLoadKind.load (std::memory_order_acquire);
21282129 const bool isStateRestoreLoad = pendingStateRestoreToken.load (std::memory_order_acquire) == currentToken;
2129- clearVoicesBeforeSampleSwap ();
2130- sampleData.applyDecodedSample (std::move (decoded));
2131- sampleMissing.store (false );
2132- clearMissingFileInfo ();
2133- sampleAvailability.store ((int ) SampleStateLoaded, std::memory_order_relaxed);
2134-
2135- if (! isStateRestoreLoad
2136- && latestLoadKind.load (std::memory_order_acquire) == (int ) LoadKindReplace)
2137- sliceManager.clearAll ();
2138- else
2130+
2131+ const bool needsSampleRateRetry = decoded->filePath .isNotEmpty ()
2132+ && currentSampleRate > 0.0
2133+ && decoded->decodedSampleRate > 0.0
2134+ && std::abs (decoded->decodedSampleRate - currentSampleRate) > 0.01 ;
2135+
2136+ if (needsSampleRateRetry)
21392137 {
2140- applyPendingSliceTimelineRemap ( );
2141- clampSlicesToSampleBounds ();
2142- sliceManager. rebuildMidiMap ( );
2138+ const int retryToken = requestSampleLoad ( juce::File (decoded-> filePath ), currentLoadKind );
2139+ if (isStateRestoreLoad)
2140+ pendingStateRestoreToken. store (retryToken, std::memory_order_release );
21432141 }
2142+ else
2143+ {
2144+ clearVoicesBeforeSampleSwap ();
2145+ sampleData.applyDecodedSample (std::move (decoded));
2146+ sampleMissing.store (false );
2147+ clearMissingFileInfo ();
2148+ sampleAvailability.store ((int ) SampleStateLoaded, std::memory_order_relaxed);
2149+
2150+ if (! isStateRestoreLoad
2151+ && currentLoadKind == LoadKindReplace)
2152+ sliceManager.clearAll ();
2153+ else
2154+ {
2155+ applyPendingSliceTimelineRemap ();
2156+ clampSlicesToSampleBounds ();
2157+ sliceManager.rebuildMidiMap ();
2158+ }
21442159
2145- if (isStateRestoreLoad)
2146- pendingStateRestoreToken.store (0 , std::memory_order_release);
2160+ if (isStateRestoreLoad)
2161+ pendingStateRestoreToken.store (0 , std::memory_order_release);
21472162
2148- loadStateChanged = true ;
2149- uiSnapshotDirty.store (true , std::memory_order_release);
2163+ loadStateChanged = true ;
2164+ uiSnapshotDirty.store (true , std::memory_order_release);
2165+ }
21502166 }
21512167 }
21522168
0 commit comments