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> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Cannot load media (missing codecs)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Unrecognized format</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Network problem</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Access denied</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Service is missing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>This is playlist</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>No errors</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Unknown error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>No media</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Loading...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Media loaded</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Media stalled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Buffering...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Loaded</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Ended</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Media is invalid</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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> <source>Unknown</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -82,6 +82,10 @@ void MediaPlayer::muteUnmute() {
m_muted = !m_muted; m_muted = !m_muted;
} }
void MediaPlayer::setSpeed(int speed) {
m_player->setPlaybackRate(convertSpeed(speed));
}
void MediaPlayer::setVolume(int volume) { void MediaPlayer::setVolume(int volume) {
#if QT_VERSION_MAJOR == 6 #if QT_VERSION_MAJOR == 6
m_player->audioOutput()->setVolume(convertSliderVolume(volume)); m_player->audioOutput()->setVolume(convertSliderVolume(volume));
@ -96,19 +100,36 @@ void MediaPlayer::seek(int position) {
m_player->setPosition(convertSliderProgress(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) { void MediaPlayer::onDurationChanged(qint64 duration) {
m_ui.m_slidProgress->blockSignals(true); 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); 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) { void MediaPlayer::onErrorOccurred(QMediaPlayer::Error error, const QString& error_string) {
if (error_string.isEmpty()) { QString err = error_string.isEmpty() ? errorToString(error) : error_string;
m_ui.m_lblStatus->setText(errorToString(error)); m_ui.m_lblStatus->setStatus(WidgetWithStatus::StatusType::Error, err, err);
}
else {
m_ui.m_lblStatus->setText(error_string);
}
} }
void MediaPlayer::onAudioAvailable(bool available) { void MediaPlayer::onAudioAvailable(bool available) {
@ -121,7 +142,12 @@ void MediaPlayer::onVideoAvailable(bool available) {
} }
void MediaPlayer::onMediaStatusChanged(QMediaPlayer::MediaStatus status) { 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) { 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 { int MediaPlayer::convertToSliderProgress(qint64 player_progress) const {
return player_progress / 1000; 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) { void MediaPlayer::onSeekableChanged(bool seekable) {
m_ui.m_slidProgress->setEnabled(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::mediaStatusChanged, this, &MediaPlayer::onMediaStatusChanged);
connect(m_player, &QMediaPlayer::positionChanged, this, &MediaPlayer::onPositionChanged); connect(m_player, &QMediaPlayer::positionChanged, this, &MediaPlayer::onPositionChanged);
connect(m_player, &QMediaPlayer::seekableChanged, this, &MediaPlayer::onSeekableChanged); 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_btnPlayPause, &PlainToolButton::clicked, this, &MediaPlayer::playPause);
connect(m_ui.m_btnStop, &PlainToolButton::clicked, this, &MediaPlayer::stop); 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_btnVolume, &PlainToolButton::clicked, this, &MediaPlayer::muteUnmute);
connect(m_ui.m_slidVolume, &QSlider::valueChanged, this, &MediaPlayer::setVolume); connect(m_ui.m_slidVolume, &QSlider::valueChanged, this, &MediaPlayer::setVolume);
connect(m_ui.m_slidProgress, &QSlider::valueChanged, this, &MediaPlayer::seek); 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 stop();
void download(); void download();
void muteUnmute(); void muteUnmute();
void setSpeed(int speed);
// NOTE: Volume is from 0 to 100 taken directly from slider or // NOTE: Volume is from 0 to 100 taken directly from slider or
// elsewhere. // elsewhere.
@ -45,14 +46,13 @@ class MediaPlayer : public TabContent {
// for "int" data type, therefore we seek by second. // for "int" data type, therefore we seek by second.
void seek(int position); void seek(int position);
void onPlaybackRateChanged(qreal speed);
void onDurationChanged(qint64 duration); void onDurationChanged(qint64 duration);
void onErrorOccurred(QMediaPlayer::Error error, const QString& error_string = {}); void onErrorOccurred(QMediaPlayer::Error error, const QString& error_string = {});
void onAudioAvailable(bool available); void onAudioAvailable(bool available);
void onVideoAvailable(bool available); void onVideoAvailable(bool available);
void onMediaStatusChanged(QMediaPlayer::MediaStatus status); void onMediaStatusChanged(QMediaPlayer::MediaStatus status);
void onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state); void onPlaybackStateChanged(QMediaPlayer::PLAYBACK_STATE state);
void onPositionChanged(qint64 position); void onPositionChanged(qint64 position);
void onSeekableChanged(bool seekable); void onSeekableChanged(bool seekable);
@ -63,10 +63,14 @@ class MediaPlayer : public TabContent {
float convertSliderVolume(int slider_volume) const; float convertSliderVolume(int slider_volume) const;
qint64 convertSliderProgress(int slider_progress) const; qint64 convertSliderProgress(int slider_progress) const;
int convertToSliderProgress(qint64 player_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 errorToString(QMediaPlayer::Error error) const;
QString mediaStatusToString(QMediaPlayer::MediaStatus status) const; QString mediaStatusToString(QMediaPlayer::MediaStatus status) const;
void updateTimeAndProgress(int progress, int total);
void setupIcons(); void setupIcons();
void createConnections(); void createConnections();

View File

@ -27,26 +27,73 @@
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="m_lblStatus"/> <widget class="LabelWithStatus" name="m_lblStatus" native="true"/>
</item> </item>
<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>
<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>
<item> <item>
<widget class="QSlider" name="m_slidProgress"> <widget class="QSlider" name="m_slidProgress">
<property name="toolTip">
<string>Progress</string>
</property>
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="m_lblTime"/> <widget class="QLabel" name="m_lblTime">
<property name="toolTip">
<string>Duration</string>
</property>
</widget>
</item> </item>
<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>
<item> <item>
<widget class="QSlider" name="m_slidVolume"> <widget class="QSlider" name="m_slidVolume">
@ -56,6 +103,9 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="toolTip">
<string>Volume</string>
</property>
<property name="maximum"> <property name="maximum">
<number>100</number> <number>100</number>
</property> </property>
@ -71,7 +121,11 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="PlainToolButton" name="m_btnDownload"/> <widget class="PlainToolButton" name="m_btnDownload">
<property name="toolTip">
<string>Download</string>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
@ -89,7 +143,22 @@
<extends>QToolButton</extends> <extends>QToolButton</extends>
<header>plaintoolbutton.h</header> <header>plaintoolbutton.h</header>
</customwidget> </customwidget>
<customwidget>
<class>LabelWithStatus</class>
<extends>QWidget</extends>
<header>labelwithstatus.h</header>
<container>1</container>
</customwidget>
</customwidgets> </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/> <resources/>
<connections/> <connections/>
</ui> </ui>