diff --git a/Source/PS_Source/Input/AInputS.h b/Source/PS_Source/Input/AInputS.h index 151789d..54d1010 100644 --- a/Source/PS_Source/Input/AInputS.h +++ b/Source/PS_Source/Input/AInputS.h @@ -117,12 +117,20 @@ public: if (m_afreader) inchans = m_afreader->numChannels; else inchans = m_readbuf.getNumChannels(); - int64_t subsect_t0 = (int64_t)(m_activerange.getStart()*info.nsamples); - int64_t subsect_t1 = (int64_t)(m_activerange.getEnd()*info.nsamples); - int64_t subsectlen = subsect_t1 - subsect_t0; - int xfadelen = m_xfadelen; - if (xfadelen >= subsectlen) - xfadelen = int(subsectlen - 2); + int64_t subsect_t0 = 0; + int64_t subsect_t1 = 0; + int64_t subsectlen = 0; + int xfadelen = 0; + auto updatesamplepositions = [&,this]() + { + subsect_t0 = (int64_t)(m_activerange.getStart()*info.nsamples); + subsect_t1 = (int64_t)(m_activerange.getEnd()*info.nsamples); + subsectlen = subsect_t1 - subsect_t0; + xfadelen = m_xfadelen; + if (xfadelen >= subsectlen) + xfadelen = int(subsectlen - 2); + }; + updatesamplepositions(); auto getSampleLambda=[this](int64_t pos, int ch) { if (m_cached_file_range.contains(pos)) @@ -182,7 +190,14 @@ public: //Logger::writeToLog("Doing seek " + String(m_seekfade.requestedpos)); m_seekfade.counter = 0; m_seekfade.state = 3; - seekImpl(m_seekfade.requestedpos); + if (m_seekfade.requestedrange.isEmpty() == false) + { + setActiveRangeImpl(m_seekfade.requestedrange); + updatesamplepositions(); + if (m_activerange.contains(getCurrentPositionPercent()) == false) + seekImpl(m_activerange.getStart()); + } + } } if (m_seekfade.state == 3) @@ -196,6 +211,7 @@ public: m_seekfade.counter = 0; m_seekfade.state = 0; m_seekfade.requestedpos = 0.0; + m_seekfade.requestedrange = Range(); } } for (int j = 0; j < numchans; ++j) @@ -299,7 +315,7 @@ public: m_cached_crossfade_range = Range((int64_t)(m_activerange.getStart()*info.nsamples),(int64_t)(m_activerange.getStart()*info.nsamples+m_xfadelen)); } - void setActiveRange(Range rng) override + void setActiveRangeImpl(Range rng) { if (rng.getEnd() < rng.getStart()) rng = { 0.0,1.0 }; @@ -307,7 +323,18 @@ public: rng = { 0.0,1.0 }; m_activerange = rng; m_loopcount = 0; - updateXFadeCache(); + updateXFadeCache(); + } + void setActiveRange(Range rng) override + { + std::lock_guard locker(m_mutex); + m_seekfade.requestedrange = rng; + if (m_seekfade.state == 0) + { + m_seekfade.counter = 0; + m_seekfade.state = 1; + } + m_seekfade.length = 16384; } void setLoopEnabled(bool b) override { @@ -362,5 +389,6 @@ private: int counter = 0; int length = 44100; double requestedpos = 0.0; + Range requestedrange; } m_seekfade; }; diff --git a/Source/PS_Source/StretchSource.cpp b/Source/PS_Source/StretchSource.cpp index d2d83c1..59c4590 100644 --- a/Source/PS_Source/StretchSource.cpp +++ b/Source/PS_Source/StretchSource.cpp @@ -649,8 +649,8 @@ void StretchAudioSource::setPlayRange(Range playrange, bool isloop) m_stream_end_reached = false; m_inputfile->setActiveRange(m_playrange); m_inputfile->setLoopEnabled(isloop); - if (m_playrange.contains(m_seekpos) == false) - m_inputfile->seek(m_playrange.getStart()); + //if (m_playrange.contains(m_seekpos) == false) + // m_inputfile->seek(m_playrange.getStart()); m_seekpos = m_playrange.getStart(); ++m_param_change_count; m_cs.exit();