Fix lag when media messages are shown and fix media controls

This commit is contained in:
Nicolas Werner 2024-01-08 01:23:55 +01:00
parent 87c063b112
commit eed23cdf11
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
4 changed files with 67 additions and 34 deletions

View file

@ -23,8 +23,6 @@
MxcMediaProxy::MxcMediaProxy(QObject *parent)
: QMediaPlayer(parent)
{
connect(this, &MxcMediaProxy::eventIdChanged, &MxcMediaProxy::startDownload);
connect(this, &MxcMediaProxy::roomChanged, &MxcMediaProxy::startDownload);
connect(
this, &QMediaPlayer::errorOccurred, this, [](QMediaPlayer::Error error, QString errorString) {
nhlog::ui()->debug("Media player error {} and errorStr {}",
@ -36,6 +34,17 @@ MxcMediaProxy::MxcMediaProxy(QObject *parent)
static_cast<int>(status),
static_cast<int>(this->error()));
});
connect(this, &MxcMediaProxy::playbackStateChanged, [this](QMediaPlayer::PlaybackState status) {
// We only set the output when starting the playback because otherwise the audio device
// lookup takes about 500ms, which causes a lot of stutter...
if (status == QMediaPlayer::PlayingState && !audioOutput()) {
nhlog::ui()->debug("Set audio output");
auto newOut = new QAudioOutput(this);
newOut->setMuted(muted_);
newOut->setVolume(volume_);
setAudioOutput(newOut);
}
});
connect(this, &MxcMediaProxy::metaDataChanged, [this]() { emit orientationChanged(); });
connect(ChatPage::instance()->timelineManager()->rooms(),
@ -55,7 +64,7 @@ MxcMediaProxy::orientation() const
}
void
MxcMediaProxy::startDownload()
MxcMediaProxy::startDownload(bool onlyCached)
{
if (!room_)
return;
@ -126,6 +135,9 @@ MxcMediaProxy::startDownload()
}
}
if (onlyCached)
return;
http::client()->download(url,
[filename, url, processBuffer](const std::string &data,
const std::string &,

View file

@ -4,6 +4,7 @@
#pragma once
#include <QAudioOutput>
#include <QBuffer>
#include <QMediaPlayer>
#include <QObject>
@ -26,9 +27,16 @@ class MxcMediaProxy : public QMediaPlayer
Q_PROPERTY(QString eventId READ eventId WRITE setEventId NOTIFY eventIdChanged)
Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged)
Q_PROPERTY(int orientation READ orientation NOTIFY orientationChanged)
Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged)
Q_PROPERTY(bool muted READ muted WRITE setMuted NOTIFY mutedChanged)
public:
MxcMediaProxy(QObject *parent = nullptr);
~MxcMediaProxy()
{
stop();
this->setSourceDevice(nullptr);
}
bool loaded() const { return buffer.size() > 0; }
QString eventId() const { return eventId_; }
@ -45,6 +53,25 @@ public:
}
int orientation() const;
float volume() const { return volume_; }
bool muted() const { return muted_; }
void setVolume(float val)
{
volume_ = val;
if (auto output = audioOutput()) {
output->setVolume(val);
}
emit volumeChanged();
}
void setMuted(bool val)
{
muted_ = val;
if (auto output = audioOutput()) {
output->setMuted(val);
}
emit mutedChanged();
}
signals:
void roomChanged();
void eventIdChanged();
@ -52,10 +79,12 @@ signals:
void newBuffer(QUrl, QIODevice *buf);
void orientationChanged();
void videoSurfaceChanged();
private slots:
void startDownload();
void volumeChanged();
void mutedChanged();
public slots:
void startDownload(bool onlyCached = false);
private:
TimelineModel *room_ = nullptr;
@ -63,4 +92,6 @@ private:
QString filename_;
QBuffer buffer;
QObject *m_surface = nullptr;
float volume_ = 1.f;
bool muted_ = false;
};