added playback speed and time lalbe

This commit is contained in:
Martin Rotter 2023-11-24 09:50:17 +01:00
parent fed4560268
commit be6b8984c0
4 changed files with 186 additions and 39 deletions

View File

@ -4504,87 +4504,127 @@ Login tokens expiration: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="167"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="35"/>
<source>Play/pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="42"/>
<source>Stop</source>
<translation type="unfinished">Stop</translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="49"/>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="77"/>
<source>Progress</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="87"/>
<source>Duration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="94"/>
<source>Mute/unmute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="107"/>
<source>Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.ui" line="126"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="199"/>
<source>Cannot load media (missing codecs)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="170"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="202"/>
<source>Unrecognized format</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="173"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="205"/>
<source>Network problem</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="176"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="208"/>
<source>Access denied</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="180"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="212"/>
<source>Service is missing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="183"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="215"/>
<source>This is playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="187"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="219"/>
<source>No errors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="190"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="222"/>
<source>Unknown error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="205"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="237"/>
<source>No media</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="208"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="240"/>
<source>Loading...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="211"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="243"/>
<source>Media loaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="214"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="246"/>
<source>Media stalled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="217"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="249"/>
<source>Buffering...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="220"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="252"/>
<source>Loaded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="223"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="255"/>
<source>Ended</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="226"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="258"/>
<source>Media is invalid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="229"/>
<location filename="../src/librssguard/gui/reusable/mediaplayer.cpp" line="261"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>

View File

@ -82,6 +82,10 @@ void MediaPlayer::muteUnmute() {
m_muted = !m_muted;
}
void MediaPlayer::setSpeed(int speed) {
m_player->setPlaybackRate(convertSpeed(speed));
}
void MediaPlayer::setVolume(int volume) {
#if QT_VERSION_MAJOR == 6
m_player->audioOutput()->setVolume(convertSliderVolume(volume));
@ -96,19 +100,36 @@ void MediaPlayer::seek(int position) {
m_player->setPosition(convertSliderProgress(position));
}
void MediaPlayer::onPlaybackRateChanged(qreal speed) {
m_ui.m_spinSpeed->blockSignals(true);
m_ui.m_spinSpeed->setValue(convertSpinSpeed(speed));
m_ui.m_spinSpeed->blockSignals(false);
}
void MediaPlayer::onDurationChanged(qint64 duration) {
m_ui.m_slidProgress->blockSignals(true);
m_ui.m_slidProgress->setMaximum(duration / 1000);
m_ui.m_slidProgress->setMaximum(convertDuration(duration));
m_ui.m_slidProgress->blockSignals(false);
updateTimeAndProgress(convertToSliderProgress(m_player->position()), convertDuration(duration));
}
void MediaPlayer::onPositionChanged(qint64 position) {
m_ui.m_slidProgress->blockSignals(true);
m_ui.m_slidProgress->setValue(convertToSliderProgress(position));
m_ui.m_slidProgress->blockSignals(false);
updateTimeAndProgress(convertToSliderProgress(position), convertDuration(m_player->duration()));
}
void MediaPlayer::updateTimeAndProgress(int progress, int total) {
m_ui.m_lblTime->setText(QSL("%1/%2").arg(QDateTime::fromSecsSinceEpoch(progress).toUTC().toString("hh:mm:ss"),
QDateTime::fromSecsSinceEpoch(total).toUTC().toString("hh:mm:ss")));
}
void MediaPlayer::onErrorOccurred(QMediaPlayer::Error error, const QString& error_string) {
if (error_string.isEmpty()) {
m_ui.m_lblStatus->setText(errorToString(error));
}
else {
m_ui.m_lblStatus->setText(error_string);
}
QString err = error_string.isEmpty() ? errorToString(error) : error_string;
m_ui.m_lblStatus->setStatus(WidgetWithStatus::StatusType::Error, err, err);
}
void MediaPlayer::onAudioAvailable(bool available) {
@ -121,7 +142,12 @@ void MediaPlayer::onVideoAvailable(bool available) {
}
void MediaPlayer::onMediaStatusChanged(QMediaPlayer::MediaStatus status) {
m_ui.m_lblStatus->setText(mediaStatusToString(status));
QString st = mediaStatusToString(status);
m_ui.m_lblStatus->setStatus(status == QMediaPlayer::MediaStatus::InvalidMedia
? WidgetWithStatus::StatusType::Error
: WidgetWithStatus::StatusType::Information,
st,
st);
}
void MediaPlayer::onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state) {
@ -143,16 +169,22 @@ void MediaPlayer::onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state) {
}
}
void MediaPlayer::onPositionChanged(qint64 position) {
m_ui.m_slidProgress->blockSignals(true);
m_ui.m_slidProgress->setValue(convertToSliderProgress(position));
m_ui.m_slidProgress->blockSignals(false);
}
int MediaPlayer::convertToSliderProgress(qint64 player_progress) const {
return player_progress / 1000;
}
int MediaPlayer::convertDuration(qint64 duration) const {
return duration / 1000;
}
qreal MediaPlayer::convertSpeed(int speed) const {
return speed / 100.0;
}
int MediaPlayer::convertSpinSpeed(qreal speed) const {
return speed * 100;
}
void MediaPlayer::onSeekableChanged(bool seekable) {
m_ui.m_slidProgress->setEnabled(seekable);
@ -264,6 +296,7 @@ void MediaPlayer::createConnections() {
connect(m_player, &QMediaPlayer::mediaStatusChanged, this, &MediaPlayer::onMediaStatusChanged);
connect(m_player, &QMediaPlayer::positionChanged, this, &MediaPlayer::onPositionChanged);
connect(m_player, &QMediaPlayer::seekableChanged, this, &MediaPlayer::onSeekableChanged);
connect(m_player, &QMediaPlayer::playbackRateChanged, this, &MediaPlayer::onPlaybackRateChanged);
connect(m_ui.m_btnPlayPause, &PlainToolButton::clicked, this, &MediaPlayer::playPause);
connect(m_ui.m_btnStop, &PlainToolButton::clicked, this, &MediaPlayer::stop);
@ -271,4 +304,5 @@ void MediaPlayer::createConnections() {
connect(m_ui.m_btnVolume, &PlainToolButton::clicked, this, &MediaPlayer::muteUnmute);
connect(m_ui.m_slidVolume, &QSlider::valueChanged, this, &MediaPlayer::setVolume);
connect(m_ui.m_slidProgress, &QSlider::valueChanged, this, &MediaPlayer::seek);
connect(m_ui.m_spinSpeed, &QSpinBox::valueChanged, this, &MediaPlayer::setSpeed);
}

View File

@ -36,6 +36,7 @@ class MediaPlayer : public TabContent {
void stop();
void download();
void muteUnmute();
void setSpeed(int speed);
// NOTE: Volume is from 0 to 100 taken directly from slider or
// elsewhere.
@ -45,14 +46,13 @@ class MediaPlayer : public TabContent {
// for "int" data type, therefore we seek by second.
void seek(int position);
void onPlaybackRateChanged(qreal speed);
void onDurationChanged(qint64 duration);
void onErrorOccurred(QMediaPlayer::Error error, const QString& error_string = {});
void onAudioAvailable(bool available);
void onVideoAvailable(bool available);
void onMediaStatusChanged(QMediaPlayer::MediaStatus status);
void onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state);
void onPositionChanged(qint64 position);
void onSeekableChanged(bool seekable);
@ -63,10 +63,14 @@ class MediaPlayer : public TabContent {
float convertSliderVolume(int slider_volume) const;
qint64 convertSliderProgress(int slider_progress) const;
int convertToSliderProgress(qint64 player_progress) const;
int convertDuration(qint64 duration) const;
qreal convertSpeed(int speed) const;
int convertSpinSpeed(qreal speed) const;
QString errorToString(QMediaPlayer::Error error) const;
QString mediaStatusToString(QMediaPlayer::MediaStatus status) const;
void updateTimeAndProgress(int progress, int total);
void setupIcons();
void createConnections();

View File

@ -27,26 +27,73 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="m_lblStatus"/>
<widget class="LabelWithStatus" name="m_lblStatus" native="true"/>
</item>
<item>
<widget class="PlainToolButton" name="m_btnPlayPause"/>
<widget class="PlainToolButton" name="m_btnPlayPause">
<property name="toolTip">
<string>Play/pause</string>
</property>
</widget>
</item>
<item>
<widget class="PlainToolButton" name="m_btnStop"/>
<widget class="PlainToolButton" name="m_btnStop">
<property name="toolTip">
<string>Stop</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="m_spinSpeed">
<property name="toolTip">
<string>Speed</string>
</property>
<property name="accelerated">
<bool>true</bool>
</property>
<property name="correctionMode">
<enum>QAbstractSpinBox::CorrectToNearestValue</enum>
</property>
<property name="suffix">
<string notr="true"> %</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="m_slidProgress">
<property name="toolTip">
<string>Progress</string>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="m_lblTime"/>
<widget class="QLabel" name="m_lblTime">
<property name="toolTip">
<string>Duration</string>
</property>
</widget>
</item>
<item>
<widget class="PlainToolButton" name="m_btnVolume"/>
<widget class="PlainToolButton" name="m_btnVolume">
<property name="toolTip">
<string>Mute/unmute</string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="m_slidVolume">
@ -56,6 +103,9 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Volume</string>
</property>
<property name="maximum">
<number>100</number>
</property>
@ -71,7 +121,11 @@
</widget>
</item>
<item>
<widget class="PlainToolButton" name="m_btnDownload"/>
<widget class="PlainToolButton" name="m_btnDownload">
<property name="toolTip">
<string>Download</string>
</property>
</widget>
</item>
</layout>
</item>
@ -89,7 +143,22 @@
<extends>QToolButton</extends>
<header>plaintoolbutton.h</header>
</customwidget>
<customwidget>
<class>LabelWithStatus</class>
<extends>QWidget</extends>
<header>labelwithstatus.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>m_btnPlayPause</tabstop>
<tabstop>m_btnStop</tabstop>
<tabstop>m_spinSpeed</tabstop>
<tabstop>m_slidProgress</tabstop>
<tabstop>m_btnVolume</tabstop>
<tabstop>m_slidVolume</tabstop>
<tabstop>m_btnDownload</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>