From 4a83f971f397b980721afb960d80c8631509d416 Mon Sep 17 00:00:00 2001 From: Anika Raemer Date: Sun, 14 Mar 2021 14:42:32 +0100 Subject: [PATCH] Add volume control --- LenaPi/LenaPi.pro.user | 2 +- LenaPi/MusicPlayer.qml | 31 +++++++++++++++--- LenaPi/Navigation.qml | 8 ++--- LenaPi/PlayerButtons.qml | 16 ++++----- .../{RoundButton.qml => RoundImageButton.qml} | 16 ++++++--- LenaPi/VolumeSlider.qml | 31 ++++++++++++++++++ LenaPi/controllers/MusicController.cpp | 22 ++++++++++--- LenaPi/controllers/MusicController.h | 16 +++++++-- LenaPi/lenapi.qrc | 2 ++ LenaPi/models/MusicModel.cpp | 15 +++++++++ LenaPi/models/MusicModel.h | 14 +++++++- LenaPi/qml.qrc | 3 +- LenaPi/resources/speaker_high_volume.png | Bin 0 -> 14260 bytes LenaPi/resources/speaker_low_volume.png | Bin 0 -> 12910 bytes 14 files changed, 144 insertions(+), 32 deletions(-) rename LenaPi/{RoundButton.qml => RoundImageButton.qml} (58%) create mode 100644 LenaPi/VolumeSlider.qml create mode 100644 LenaPi/resources/speaker_high_volume.png create mode 100644 LenaPi/resources/speaker_low_volume.png diff --git a/LenaPi/LenaPi.pro.user b/LenaPi/LenaPi.pro.user index 21cf67f..f9708ee 100644 --- a/LenaPi/LenaPi.pro.user +++ b/LenaPi/LenaPi.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/LenaPi/MusicPlayer.qml b/LenaPi/MusicPlayer.qml index 30dfc1c..41bc541 100644 --- a/LenaPi/MusicPlayer.qml +++ b/LenaPi/MusicPlayer.qml @@ -1,4 +1,5 @@ import QtQuick 2.0 +import QtQuick.Controls 2.4 import QtGraphicalEffects 1.0 Item{ @@ -6,7 +7,7 @@ Item{ property int margins: 20 - RoundButton{ + RoundImageButton{ id: backNavigation anchors.left: parent.left anchors.top: parent.top @@ -16,11 +17,15 @@ Item{ } } - RoundButton{ - id: closeApp + RoundImageButton{ + id: closeAppButton anchors.right: parent.right anchors.top: parent.top - anchors.margins: container.margins + anchors.margins: visible ? container.margins : 0 + + visible: container.height > 500 + diameter: visible ? defaultDiameter : 0 + imageSource: "qrc:/icon_close" onClicked: { Qt.quit(); @@ -49,6 +54,24 @@ Item{ } } + VolumeSlider{ + id: volumeSlider + anchors{ + right: parent.right + top: closeAppButton.bottom + bottom: controlPannel.top + margins: container.margins + topMargin: closeAppButton.visible ? 2*container.margins : container.margins + } + from: 34 // we cannot hear anything if lower than 35% + to: 100 + stepSize: 1 + value: musicModel.pAudioVolume + onValueChanged: { + console.log(musicModel.pAudioVolume, value); + musicModel.pAudioVolume = value; + } + } PlayerControlPannel { id: controlPannel anchors.left: parent.left diff --git a/LenaPi/Navigation.qml b/LenaPi/Navigation.qml index 2f6b0f3..f33382d 100644 --- a/LenaPi/Navigation.qml +++ b/LenaPi/Navigation.qml @@ -6,7 +6,7 @@ import QtQuick 2.0 Item { id: container property int margins: 20 - RoundButton{ + RoundImageButton{ id: back anchors.top: parent.top @@ -16,9 +16,9 @@ Item { visible: navigationList.pIsBackVisible onClicked: navigationList.navigateBack(); - } // RoundButton: navigate back + } // MyRoundButton: navigate back - RoundButton{ + RoundImageButton{ id: closeApp anchors.right: parent.right anchors.top: parent.top @@ -27,7 +27,7 @@ Item { onClicked: { Qt.quit(); } - } // RoundButton: closeApp + } // MyRoundButton: closeApp Rectangle{ anchors.left: parent.left diff --git a/LenaPi/PlayerButtons.qml b/LenaPi/PlayerButtons.qml index 7235629..8fe8b00 100644 --- a/LenaPi/PlayerButtons.qml +++ b/LenaPi/PlayerButtons.qml @@ -9,11 +9,11 @@ Item { anchors.centerIn: parent spacing: container.spacing - RoundButton{ + RoundImageButton{ id: previous anchors.verticalCenter: parent.verticalCenter - width: 60 + diameter: 60 imageSource: "qrc:/icon_previous" enabled: model.pHasPrevious @@ -22,21 +22,21 @@ Item { model.playPrevious(); } } - RoundButton{ + RoundImageButton{ id: playPause anchors.verticalCenter: parent.verticalCenter - width: 80 + diameter: 80 imageSource: model.pIsPlaying ? "qrc:/icon_pause" : "qrc:/icon_play" onClicked:{ model.playPause(); } } - RoundButton{ + RoundImageButton{ id: stop anchors.verticalCenter: parent.verticalCenter - width: 60 + diameter: 60 imageSource: "qrc:/icon_stop" enabled: model.pIsPlaying @@ -45,11 +45,11 @@ Item { model.stopMusic(); } } - RoundButton{ + RoundImageButton{ id: next anchors.verticalCenter: parent.verticalCenter - width: 60 + diameter: 60 imageSource: "qrc:/icon_next" enabled: model.pHasNext diff --git a/LenaPi/RoundButton.qml b/LenaPi/RoundImageButton.qml similarity index 58% rename from LenaPi/RoundButton.qml rename to LenaPi/RoundImageButton.qml index 1838e68..5334465 100644 --- a/LenaPi/RoundButton.qml +++ b/LenaPi/RoundImageButton.qml @@ -7,6 +7,12 @@ import QtQuick.Controls 2.4 Button { id: container property alias imageSource: image.source + // default button diameter -> default width, readonly + readonly property int defaultDiameter: 65 + // button diameter -> width + property int diameter: defaultDiameter + // diameter of content image -> width + property int imageDiameter: 0.5*diameter background: Rectangle{ @@ -15,14 +21,14 @@ Button { color: "white" - implicitWidth: 65 - implicitHeight: width - radius: width/2 + implicitWidth: container.diameter + implicitHeight: container.diameter + radius: container.diameter/2 Image{ id: image anchors.centerIn: parent - width: 30 + width: container.imageDiameter height: width source: "qrc:/icon_back" } @@ -31,7 +37,7 @@ Button { z: 1 visible: !container.enabled anchors.centerIn: parent - width: 30 + width: image.width height: width color: "#99ffffff" } diff --git a/LenaPi/VolumeSlider.qml b/LenaPi/VolumeSlider.qml new file mode 100644 index 0000000..1ca6c9b --- /dev/null +++ b/LenaPi/VolumeSlider.qml @@ -0,0 +1,31 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.3 + +ColumnLayout { + property alias from: slider.from + property alias to: slider.to + property alias stepSize: slider.stepSize + property alias value: slider.value + spacing: 5 + RoundImageButton{ + id: increaseButton + imageSource: "qrc:///icon_increase_volume" + onClicked: slider.increase(); + } + Slider{ + id: slider + Layout.fillHeight: true + Layout.alignment: Qt.AlignHCenter + orientation: Qt.Vertical + from: 34 // we cannot hear anything if lower than 35% + to: 100 + stepSize: 1 + value: 50 + } + RoundImageButton{ + id: decreaseButton + imageSource: "qrc:///icon_decrease_volume" + onClicked: slider.decrease(); + } +} diff --git a/LenaPi/controllers/MusicController.cpp b/LenaPi/controllers/MusicController.cpp index 47a23c2..4b51a00 100644 --- a/LenaPi/controllers/MusicController.cpp +++ b/LenaPi/controllers/MusicController.cpp @@ -10,17 +10,20 @@ MusicController::MusicController(QObject *parent) : QObject(parent) mVlc = new VlcInstance(VlcCommon::args(), this); mModel = new MusicModel(mVlc, this); mPlayer = new VlcMediaListPlayer(mVlc); + mVlcAudio = new VlcAudio(mPlayer->mediaPlayer()); - connect(mModel, &MusicModel::navigateTo, this, &MusicController::navigateTo); - connect(mModel, &MusicModel::navigateTo, [this](NavigationItemModel*){ - if(mModel->isPlaying()) mModel->playPause(); + connect(mModel, &MusicModel::navigateTo, this, &MusicController::onNavigationRequest); + + //connect(mModel, &MusicModel::play, mPlayer, &VlcMediaListPlayer::play); + connect(mModel, &MusicModel::play, [this](){ + mVlcAudio->setVolume(mModel->getAudioVolume()); + mPlayer->play(); }); - - connect(mModel, &MusicModel::play, mPlayer, &VlcMediaListPlayer::play); connect(mModel, &MusicModel::stop, mPlayer, &VlcMediaListPlayer::stop); connect(mModel, &MusicModel::previous, mPlayer, &VlcMediaListPlayer::previous); connect(mModel, &MusicModel::next, mPlayer, &VlcMediaListPlayer::next); connect(mModel, &MusicModel::pause, mPlayer->mediaPlayer(), &VlcMediaPlayer::pause); + connect(mModel, &MusicModel::audioVolumeChanged, mVlcAudio, &VlcAudio::setVolume); connect(mPlayer, SIGNAL(nextItemSet(VlcMedia*)), mModel, SLOT(onNextMediaSet(VlcMedia*))); connect(mPlayer->mediaPlayer(), &VlcMediaPlayer::lengthChanged, mModel, &MusicModel::onLengthChanged); @@ -33,6 +36,7 @@ MusicController::MusicController(QObject *parent) : QObject(parent) MusicController::~MusicController() { mPlayer->deleteLater(); + mVlcAudio->deleteLater(); } void MusicController::initPlayer(NavigationItemModel *item) @@ -58,3 +62,11 @@ void MusicController::setContextProperties() if(!mContext) return; mContext->setContextProperty("musicModel", mModel); } + +void MusicController::onNavigationRequest(NavigationItemModel *item) +{ + if(mModel->isPlaying()) { + mModel->playPause(); + } + emit navigateTo(item); +} diff --git a/LenaPi/controllers/MusicController.h b/LenaPi/controllers/MusicController.h index 8c2a64d..4bdf01f 100644 --- a/LenaPi/controllers/MusicController.h +++ b/LenaPi/controllers/MusicController.h @@ -8,6 +8,7 @@ #include #include #include +#include class MusicModel; @@ -31,12 +32,21 @@ private: QQmlContext* mContext = Q_NULLPTR; - MusicModel* mModel; + MusicModel* mModel = Q_NULLPTR; - VlcInstance* mVlc; - VlcMediaListPlayer* mPlayer; + VlcInstance* mVlc = Q_NULLPTR; + VlcMediaListPlayer* mPlayer = Q_NULLPTR; + VlcAudio* mVlcAudio = Q_NULLPTR; bool mIsMediaListSet = false; + + private slots: + /** + * @brief Stop player if necessary and forward signal navigatTo + * @param item target of navigation request + * @see navigateTo(NavigationItemModel* item); + */ + void onNavigationRequest(NavigationItemModel* item); }; #endif // MUSICCONTROLLER_H diff --git a/LenaPi/lenapi.qrc b/LenaPi/lenapi.qrc index bba9b5d..2a3ca97 100644 --- a/LenaPi/lenapi.qrc +++ b/LenaPi/lenapi.qrc @@ -9,5 +9,7 @@ resources/previous.jpg resources/stop.jpg resources/close.png + resources/speaker_high_volume.png + resources/speaker_low_volume.png diff --git a/LenaPi/models/MusicModel.cpp b/LenaPi/models/MusicModel.cpp index 530c558..9383ea4 100644 --- a/LenaPi/models/MusicModel.cpp +++ b/LenaPi/models/MusicModel.cpp @@ -6,6 +6,7 @@ MusicModel::MusicModel(VlcInstance* instance, QObject *parent) : QObject(parent), mVlc(instance), mMedia(new VlcMediaList(instance)) { + /* nothing */ } MusicModel::~MusicModel() @@ -101,6 +102,20 @@ bool MusicModel::hasPrevious() const return mHasPrevious; } +void MusicModel::setAudioVolume(int newVolume) +{ + if(newVolume != mAudioVolume){ + if(newVolume > 100){ + mAudioVolume = 100; + } else if(newVolume < 0){ + mAudioVolume = 0; + } else { + mAudioVolume = newVolume; + } + emit audioVolumeChanged(mAudioVolume); + } +} + double MusicModel::getProgress() const { return mCurrentMediaItemProgress; diff --git a/LenaPi/models/MusicModel.h b/LenaPi/models/MusicModel.h index 88504ee..764d79a 100644 --- a/LenaPi/models/MusicModel.h +++ b/LenaPi/models/MusicModel.h @@ -18,6 +18,7 @@ class MusicModel : public QObject Q_PROPERTY(QString pMediaLength READ getMediaLength NOTIFY mediaLengthChanged) Q_PROPERTY(QString pTime READ getTime NOTIFY progressChanged) Q_PROPERTY(QString pMediaTitle READ getMediaTitle NOTIFY mediaTitleChanged) + Q_PROPERTY(int pAudioVolume READ getAudioVolume WRITE setAudioVolume NOTIFY audioVolumeChanged) signals: void navigateTo(NavigationItemModel *item); @@ -33,6 +34,7 @@ signals: void progressChanged(); void mediaLengthChanged(); void mediaTitleChanged(); + void audioVolumeChanged(int newVolume); public: MusicModel(VlcInstance* instance, QObject *parent = Q_NULLPTR); @@ -54,6 +56,15 @@ public: bool hasNext() const; bool hasPrevious() const; + inline int getAudioVolume() const { return mAudioVolume; } + /** + * @brief Set audio volume. Information is transferred to VlcAudio + * @param newVolume value between 0 and 100 (audio level in percent) + * Ensures that volume is inbetween 0 and 100. If this range is exceeded, + * the volume is set to the lowest and highest allowed value, respectively. + */ + void setAudioVolume(int newVolume); + double getProgress() const; QString getMediaTitle() const; @@ -79,10 +90,11 @@ private: int mCurrentMediaItemLength = 0; int mCurrentTime = 0; double mCurrentMediaItemProgress = 0; + int mAudioVolume{50}; QString mMediaTitle = QString(""); NavigationItemModel* mCurrentItem = Q_NULLPTR; VlcMediaList* mMedia = Q_NULLPTR; - VlcInstance* mVlc; + VlcInstance* mVlc = Q_NULLPTR; }; #endif // MUSICMODEL_H diff --git a/LenaPi/qml.qrc b/LenaPi/qml.qrc index 2a2ac88..d93fa3e 100644 --- a/LenaPi/qml.qrc +++ b/LenaPi/qml.qrc @@ -4,11 +4,12 @@ MainForm.ui.qml NavigationListDelegate.qml MyScrollView.qml - RoundButton.qml + RoundImageButton.qml Navigation.qml MusicPlayer.qml MediaProgress.qml PlayerButtons.qml PlayerControlPannel.qml + VolumeSlider.qml diff --git a/LenaPi/resources/speaker_high_volume.png b/LenaPi/resources/speaker_high_volume.png new file mode 100644 index 0000000000000000000000000000000000000000..06a9bf886ec3624336a0c5dc89e5f6b105ad6e86 GIT binary patch literal 14260 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

-rK=HG_ZO+ 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 RIqN@<)ZS{nsZj!j{~xwk*=+y- literal 0 HcmV?d00001