viewer: improved realtime audio playback

This commit is contained in:
itsmattkc
2021-09-28 21:38:40 -07:00
parent 40a1bba0e6
commit 90da62900c
2 changed files with 16 additions and 4 deletions
+14 -4
View File
@@ -47,6 +47,7 @@ namespace olive {
#define super TimeBasedWidget
QVector<ViewerWidget*> ViewerWidget::instances_;
const int ViewerWidget::kAudioPlaybackInterval = 2;
const int kMaxPreQueueSize = 8;
@@ -128,6 +129,11 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
instances_.append(this);
setAcceptDrops(true);
audio_queue_next_timer_ = new QTimer(this);
audio_queue_next_timer_->setInterval(kAudioPlaybackInterval * 1000);
audio_queue_next_timer_->setSingleShot(true);
connect(audio_queue_next_timer_, &QTimer::timeout, this, &ViewerWidget::QueueNextAudioBuffer);
}
ViewerWidget::~ViewerWidget()
@@ -422,7 +428,7 @@ void ViewerWidget::StartAudioOutput()
void ViewerWidget::QueueNextAudioBuffer()
{
// NOTE: Hardcoded 2 second interval
rational queue_end = audio_playback_queue_time_ + (2 * playback_speed_);
rational queue_end = audio_playback_queue_time_ + (kAudioPlaybackInterval * playback_speed_);
// Clamp queue end by zero and the audio length
queue_end = clamp(queue_end, rational(0), GetConnectedNode()->GetAudioLength());
@@ -441,7 +447,7 @@ void ViewerWidget::QueueNextAudioBuffer()
void ViewerWidget::ReceivedAudioBufferForPlayback()
{
while (!audio_playback_queue_.empty() && !audio_playback_queue_.front()->IsRunning()) {
while (!audio_playback_queue_.empty() && audio_playback_queue_.front()->HasResult()) {
RenderTicketWatcher *watcher = audio_playback_queue_.front();
audio_playback_queue_.pop_front();
@@ -478,7 +484,8 @@ void ViewerWidget::ReceivedAudioBufferForPlayback()
}
// Do this in the loop so that clearing the array effectively prevents a queue
QueueNextAudioBuffer();
audio_queue_next_timer_->stop();
audio_queue_next_timer_->start();
delete watcher;
}
@@ -664,7 +671,9 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only)
audio_playback_device_ = std::make_shared<PreviewAudioDevice>();
prequeuing_audio_ = true;
audio_playback_queue_time_ = GetTime();
QueueNextAudioBuffer();
for (int i=0; i<2; i++) {
QueueNextAudioBuffer();
}
}
void ViewerWidget::PauseInternal()
@@ -689,6 +698,7 @@ void ViewerWidget::PauseInternal()
if (tempo_processor_.IsOpen()) {
tempo_processor_.Close();
}
audio_queue_next_timer_->stop();
UpdateTextureFromNode();
}
+2
View File
@@ -261,6 +261,8 @@ private:
rational audio_playback_queue_time_;
PackedProcessor packed_processor_;
TempoProcessor tempo_processor_;
static const int kAudioPlaybackInterval;
QTimer *audio_queue_next_timer_;
static QVector<ViewerWidget*> instances_;