audiowaveformview: on validation, only update visible sections

This commit is contained in:
itsmattkc
2020-11-30 08:57:51 +11:00
parent b39565cff4
commit d82f484c4c
2 changed files with 30 additions and 3 deletions
+28 -3
View File
@@ -43,7 +43,7 @@ AudioWaveformView::AudioWaveformView(QWidget *parent) :
void AudioWaveformView::SetViewer(AudioPlaybackCache *playback)
{
if (playback_) {
disconnect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdate);
disconnect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdateOfRange);
disconnect(playback_, &AudioPlaybackCache::ParametersChanged, this, &AudioWaveformView::BackendParamsChanged);
SetTimebase(0);
@@ -52,7 +52,7 @@ void AudioWaveformView::SetViewer(AudioPlaybackCache *playback)
playback_ = playback;
if (playback_) {
connect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdate);
connect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdateOfRange);
connect(playback_, &AudioPlaybackCache::ParametersChanged, this, &AudioWaveformView::BackendParamsChanged);
SetTimebase(playback_->GetParameters().time_base());
@@ -86,7 +86,6 @@ void AudioWaveformView::paintEvent(QPaintEvent *event)
ActiveCache& cache = cached_waveform_[i];
int slice_start = width()/cached_waveform_.size() * i;
int slice_end = width()/cached_waveform_.size() * (i+1);
if (cache.info == wanted_info) {
@@ -95,6 +94,8 @@ void AudioWaveformView::paintEvent(QPaintEvent *event)
} else if (cache.caching_info != wanted_info) {
int slice_end = width()/cached_waveform_.size() * (i+1);
// Pixmap is obsolete, will need to draw again
// Delete any existing watcher so we don't receive the signal
@@ -183,6 +184,27 @@ void AudioWaveformView::ForceUpdate()
update();
}
void AudioWaveformView::ForceUpdateOfRange(const TimeRange &range)
{
int in = TimeToScreen(range.in());
int out = TimeToScreen(range.out());
// Don't need to redraw anything
if (out < 0 || in >= width()) {
return;
}
int start_invalidate = in/cached_waveform_.size();
int end_invalidate = qMin(cached_waveform_.size()-1, out/cached_waveform_.size());
for (int i=start_invalidate; i<=end_invalidate; i++) {
// Invalidate these
cached_waveform_[i].info.size = QSize();
}
update();
}
void AudioWaveformView::BackgroundCacheFinished()
{
// Retrieve sender
@@ -203,6 +225,9 @@ void AudioWaveformView::BackgroundCacheFinished()
cached_waveform_[index].pixmap = watcher->result();
cached_waveform_[index].watcher = nullptr;
// Reset size
cached_waveform_[index].caching_info.size = QSize();
// Update with new pixmap
update();
}
+2
View File
@@ -83,6 +83,8 @@ private slots:
void ForceUpdate();
void ForceUpdateOfRange(const TimeRange& range);
void BackgroundCacheFinished();
};