From c99efcf9e3d00897088318177d6cd020cc6f49cf Mon Sep 17 00:00:00 2001 From: Dark Steveneq Date: Thu, 16 Oct 2025 23:20:10 +0200 Subject: [PATCH] Reimplement streaming --- .vscode/settings.json | 6 ++++- Main.qml | 8 ------ player.cpp | 59 ++++++++++++++++++++++++++++++++++++++++--- player.h | 41 ++++++++++++++++++++++++++++-- 4 files changed, 99 insertions(+), 15 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 748131f..308e47e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,10 @@ { "files.associations": { "flake.lock": "json", - "qobject": "cpp" + "qobject": "cpp", + "chrono": "cpp", + "variant": "cpp", + "qtmultimedia": "cpp", + "qdebug": "cpp" } } \ No newline at end of file diff --git a/Main.qml b/Main.qml index 8bc2f8c..ff8fdb6 100755 --- a/Main.qml +++ b/Main.qml @@ -121,14 +121,6 @@ ApplicationWindow { text: qsTr("Settings") } } - // Button { - // text: "S" - // onClicked: function() { - // var component = Qt.createComponent("ViewSettings.qml") - // var window = component.createObject(root) - // window.show() - // } - // } } } diff --git a/player.cpp b/player.cpp index 181bb6e..fdf153c 100644 --- a/player.cpp +++ b/player.cpp @@ -1,7 +1,23 @@ #include "player.h" -Player::Player(QObject *parent) : QObject(parent) +// Public +Player::Player(QObject *parent) : QObject(parent), + player(this), + output(this) { + QObject::connect(&this->player, &QMediaPlayer::playbackStateChanged, this, [this] () { + qDebug("Player::Player()->Lambda: Playing got changed!"); + emit this->playingChanged(); + }); + + QObject::connect(&this->output, &QAudioOutput::volumeChanged, this, [this] () { + qDebug("Player::Player()->Lambda: Volume got changed!"); + emit this->volumeChanged(); + }); + + this->output.setVolume(0.3); + this->player.setAudioOutput(&this->output); + qDebug("Player::Player(): Constructed"); } @@ -10,12 +26,47 @@ Player::~Player() qDebug("Player::~Player(): Destructed"); } -void Player::startPlaying(int index) +bool Player::playing() const { - qDebug("Player::startPlaying(): Success, I can call between both environments!"); + return this->player.playbackState() == QMediaPlayer::PlayingState; +} + + +float Player::volume() const +{ + return this->output.volume(); +} + +void Player::setVolume(float newVolume) +{ + this->output.setVolume(newVolume); +} + + +// Public slots +void Player::startPlaying(u_int8_t index) +{ + if (index < 0 || index >= maxStations) + { + qWarning("Player::startPlaying(): Tried accessing out of bounds."); + return; + } + if (this->playing()) { + this->stopPlaying(); + } + this->player.setSource(QUrl(streamPrefix + stations[index].slug)); + this->player.play(); + qDebug("Player::startPlaying(): Starting playing"); } void Player::stopPlaying() { - qDebug("Player::stopPlaying(): Success, I can even tell C++ to stop!"); + if (this->playing()) + { + qWarning("Player::stopPlaying(): Prevented redundant stopPlaying() call."); + return; + } + this->player.stop(); + this->player.setSource(QUrl("")); + qDebug("Player::stopPlaying(): Stopping playback..."); } \ No newline at end of file diff --git a/player.h b/player.h index 66da0ff..72daca1 100644 --- a/player.h +++ b/player.h @@ -1,18 +1,55 @@ #pragma once +#include #include #include #include +constexpr std::string_view metadataEndpoint = "https://youradio.nonamesoft.xyz/youradio/api/status-json.xsl"; +constexpr std::string_view streamPrefix = "https://youradio.nonamesoft.xyz/youradio/api/"; + +struct Station +{ + const char name[16]; + const char slug[16]; + QString* songTitle; + u_int8_t listeners; +}; + +constexpr u_int8_t maxStations = 3; + +const Station stations[maxStations] = { + { "Autoradio", "autoradio" , nullptr, 0 }, + { "Live Mix", "livemix" , nullptr, 0 }, + { "Deep Bass", "bassboosted", nullptr, 0 } +}; + class Player : public QObject { Q_OBJECT QML_SINGLETON QML_ELEMENT + + Q_PROPERTY(bool playing READ playing NOTIFY playingChanged) + Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged) + public: Player(QObject *parent = nullptr); ~Player(); - Q_INVOKABLE void startPlaying(int index); - Q_INVOKABLE void stopPlaying(); + bool playing() const; + float volume() const; + void setVolume(float newVolume); + +public slots: + void startPlaying(u_int8_t index); + void stopPlaying(); + +signals: + void playingChanged(); + void volumeChanged(); + +private: + QMediaPlayer player; + QAudioOutput output; };