track/audioplaybackcache: re-did binary search algorithms
Fixes #1617 Fixes #1615
This commit is contained in:
@@ -377,26 +377,6 @@ Block *Track::NearestBlockAfter(const rational &time) const
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Block* BlockAtTimeBinarySearch(const QVector<Block*>& blocks, int first, int last, const rational& time)
|
|
||||||
{
|
|
||||||
int middle;
|
|
||||||
|
|
||||||
if (last >= first) {
|
|
||||||
middle = (first + last) / 2;
|
|
||||||
|
|
||||||
Block* block = blocks.at(middle);
|
|
||||||
if (block->in() <= time && block->out() > time) {
|
|
||||||
return block;
|
|
||||||
} else if (block->out() < time) {
|
|
||||||
return BlockAtTimeBinarySearch(blocks, middle + 1, last, time);
|
|
||||||
} else {
|
|
||||||
return BlockAtTimeBinarySearch(blocks, first, middle - 1, time);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Block *Track::BlockAtTime(const rational &time) const
|
Block *Track::BlockAtTime(const rational &time) const
|
||||||
{
|
{
|
||||||
if (IsMuted() || time > track_length() || blocks_.isEmpty()) {
|
if (IsMuted() || time > track_length() || blocks_.isEmpty()) {
|
||||||
@@ -404,7 +384,23 @@ Block *Track::BlockAtTime(const rational &time) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Use binary search to find block at time
|
// Use binary search to find block at time
|
||||||
Block* using_block = BlockAtTimeBinarySearch(blocks_, 0, blocks_.size(), time);
|
Block* using_block = nullptr;
|
||||||
|
|
||||||
|
int low = 0;
|
||||||
|
int high = blocks_.size() - 1;
|
||||||
|
while (low <= high) {
|
||||||
|
int mid = low + (high - low) / 2;
|
||||||
|
|
||||||
|
Block* block = blocks_.at(mid);
|
||||||
|
if (block->in() <= time && block->out() > time) {
|
||||||
|
using_block = block;
|
||||||
|
break;
|
||||||
|
} else if (block->out() <= time) {
|
||||||
|
low = mid + 1;
|
||||||
|
} else {
|
||||||
|
high = mid - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (using_block && !using_block->is_enabled()) {
|
if (using_block && !using_block->is_enabled()) {
|
||||||
using_block = nullptr;
|
using_block = nullptr;
|
||||||
|
|||||||
@@ -508,27 +508,23 @@ int AudioPlaybackCache::Playlist::GetIndexOfPosition(qint64 pos)
|
|||||||
return this->size() - 1;
|
return this->size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bottom = 0;
|
|
||||||
int top = this->size();
|
|
||||||
|
|
||||||
// Use a binary search to find the segment with the right offset
|
// Use a binary search to find the segment with the right offset
|
||||||
while (true) {
|
int low = 0;
|
||||||
int mid = bottom + (top - bottom)/2;
|
int high = this->size() - 1;
|
||||||
|
while (low <= high) {
|
||||||
|
int mid = low + (high - low) / 2;
|
||||||
|
|
||||||
const Segment& mid_segment = this->at(mid);
|
const Segment& mid_segment = this->at(mid);
|
||||||
|
if (mid_segment.offset() <= pos && mid_segment.offset() + mid_segment.size() > pos) {
|
||||||
if (mid_segment.offset() <= pos
|
|
||||||
&& mid_segment.offset() + mid_segment.size() > pos) {
|
|
||||||
return mid;
|
return mid;
|
||||||
}
|
} else if (mid_segment.offset() < pos) {
|
||||||
|
low = mid + 1;
|
||||||
if (mid_segment.offset() > pos) {
|
|
||||||
// Segment we're looking for must be lower
|
|
||||||
top = mid;
|
|
||||||
} else {
|
} else {
|
||||||
// Segment we're looking for must be higher
|
high = mid - 1;
|
||||||
bottom = mid;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 AudioPlaybackCache::Playlist::GetLength() const
|
qint64 AudioPlaybackCache::Playlist::GetLength() const
|
||||||
|
|||||||
Reference in New Issue
Block a user