Skip to content

Commit

Permalink
Refactored audio players to remove duplicate functionality; fixed var…
Browse files Browse the repository at this point in the history
…ious minor bugs
  • Loading branch information
PhilInTheGaps committed Oct 6, 2023
1 parent a4695d7 commit da5ddb9
Show file tree
Hide file tree
Showing 41 changed files with 1,539 additions and 1,523 deletions.
10 changes: 9 additions & 1 deletion app/ui/tools/audio/AudioControlBar.qml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,15 @@ ToolBar {
// Play Pause
CustomToolBarButton {
anchors.margins: 0
iconText: AudioTool.isPaused ? FontAwesome.circlePlay : FontAwesome.circlePause
iconText: switch(AudioTool.playbackState){
case AudioPlayer.Playing:
return FontAwesome.circlePause
case AudioPlayer.Loading:
return FontAwesome.spinner
default:
return FontAwesome.circlePlay
}

onClicked: AudioTool.playPause()
pointSize: 24
}
Expand Down
4 changes: 2 additions & 2 deletions app/ui/tools/audio/MetaDataDisplay.qml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Column {
anchors.left: parent.left
anchors.right: parent.right
anchors.rightMargin: 5
text: AudioTool.metaData.type
text: AudioTool.currentElementName
font.bold: true
}

Expand All @@ -27,7 +27,7 @@ Column {
anchors.left: parent.left
anchors.right: parent.right
anchors.rightMargin: 5
text: AudioTool.metaData.artist
text: AudioTool.metaData.artist.join(", ")
}

CustomScrollLabel {
Expand Down
6 changes: 6 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ set(SRC_AUDIO
tools/audio/editor/unsplash/unsplashparser.cpp
tools/audio/players/audioplayer.h
tools/audio/players/audioplayer.cpp
tools/audio/players/bufferedaudioplayer.h
tools/audio/players/bufferedaudioplayer.cpp
tools/audio/players/musicplayer.h
tools/audio/players/musicplayer.cpp
tools/audio/players/soundplayer.h
Expand All @@ -41,6 +43,10 @@ set(SRC_AUDIO
tools/audio/players/spotifyplayer.cpp
tools/audio/playlist/audioplaylist.h
tools/audio/playlist/audioplaylist.cpp
tools/audio/playlist/audioplaylistfactory.h
tools/audio/playlist/audioplaylistfactory.cpp
tools/audio/playlist/resolvingaudioplaylist.h
tools/audio/playlist/resolvingaudioplaylist.cpp
tools/audio/project/audioproject.h
tools/audio/project/audioproject.cpp
tools/audio/project/audiocategory.h
Expand Down
2 changes: 1 addition & 1 deletion src/common/utils/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class Utils
return list;
}

template <typename T> static auto isInBounds(const QList<T> &list, int index) -> bool
template <typename T> static auto isInBounds(const QList<T> &list, qsizetype index) -> bool
{
return index > -1 && index < list.length();
}
Expand Down
8 changes: 6 additions & 2 deletions src/services/spotify/data/spotifytrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ auto SpotifyTrack::fromJsonArray(const QByteArray &data) -> std::vector<QSharedP
return SpotifyTrack::fromJsonArray(json["tracks"_L1].toArray());
}

auto SpotifyTrack::artistString() const -> QString
auto SpotifyTrack::artistNames() const -> QStringList
{
QStringList names;
names.reserve(artists.count());
Expand All @@ -64,8 +64,12 @@ auto SpotifyTrack::artistString() const -> QString
{
names << artist->name;
}
return names;
}

return names.join(u", "_s);
auto SpotifyTrack::artistString() const -> QString
{
return artistNames().join(u", "_s);
}

auto SpotifyTrack::image() const -> QSharedPointer<SpotifyImage>
Expand Down
1 change: 1 addition & 0 deletions src/services/spotify/data/spotifytrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ struct SpotifyTrack : public BaseSpotifyElement
QSharedPointer<SpotifyAlbumInfo> album;
QList<QSharedPointer<SpotifyArtist>> artists;

[[nodiscard]] auto artistNames() const -> QStringList;
[[nodiscard]] auto artistString() const -> QString;
[[nodiscard]] auto image() const -> QSharedPointer<SpotifyImage>;

Expand Down
121 changes: 51 additions & 70 deletions src/tools/audio/audiotool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ using namespace Qt::Literals::StringLiterals;
Q_LOGGING_CATEGORY(gmAudioTool, "gm.audio.tool")

AudioTool::AudioTool(QQmlEngine *engine, QObject *parent)
: AbstractTool(parent), m_editor(engine), musicPlayer(metaDataReader),
: AbstractTool(parent), m_editor(engine), musicPlayer(*engine->networkAccessManager(), metaDataReader),
soundPlayerController(*engine->networkAccessManager()),
radioPlayer(*engine->networkAccessManager(), metaDataReader)
{
qCDebug(gmAudioTool()) << "Loading ...";
Expand All @@ -23,35 +24,30 @@ AudioTool::AudioTool(QQmlEngine *engine, QObject *parent)
connect(Spotify::instance(), &Spotify::authorized, this, &AudioTool::onSpotifyAuthorized);

// Music Player
connect(&musicPlayer, &MusicPlayer::startedPlaying, this, &AudioTool::onStartedPlaying);
connect(&musicPlayer, &MusicPlayer::playlistChanged, this, [this](const QList<AudioFile *> &files) {
Q_UNUSED(files);
emit playlistChanged();
});
connect(&musicPlayer, &MusicPlayer::playlistChanged, this,
[](const QList<AudioFile *> &files) { qCDebug(gmAudioTool()) << "Playlist Changed!" << files.length(); });
connect(&musicPlayer, &MusicPlayer::currentIndexChanged, this, &AudioTool::currentIndexChanged);
connect(&musicPlayer, &MusicPlayer::stateChanged, this, &AudioTool::onStateChanged);
connect(&musicPlayer, &MusicPlayer::playlistChanged, this, &AudioTool::playlistChanged);
connect(&musicPlayer, &MusicPlayer::playlistIndexChanged, this, &AudioTool::currentIndexChanged);

// Radio Player
connect(&radioPlayer, &RadioPlayer::startedPlaying, this, &AudioTool::onStartedPlaying);

// Meta Data
connect(&metaDataReader, &MetaDataReader::metaDataChanged, this, &AudioTool::onMetaDataUpdated);
connect(&radioPlayer, &RadioPlayer::stateChanged, this, &AudioTool::onStateChanged);

#ifndef NO_DBUS
mprisManager.setMetaDataReader(&metaDataReader);
// Mpris
connect(&mprisManager, &MprisManager::play, this, [this]() {
if (m_isPaused) playPause();
if (playbackState() != AudioPlayer::State::Playing) playPause();
});
connect(&mprisManager, &MprisManager::playPause, this, [this]() { playPause(); });
connect(&mprisManager, &MprisManager::pause, this, [this]() {
if (!m_isPaused) playPause();
if (playbackState() == AudioPlayer::State::Playing) playPause();
});
connect(&mprisManager, &MprisManager::stop, this, [this]() {
if (!m_isPaused) playPause();
if (playbackState() == AudioPlayer::State::Playing) playPause();
});
connect(&mprisManager, &MprisManager::next, this, [this]() { next(); });
connect(&mprisManager, &MprisManager::previous, this, [this]() { again(); });
connect(&mprisManager, &MprisManager::changeVolume, this, [this](double volume) { setMusicVolume(volume); });
#endif
}

auto AudioTool::create(QQmlEngine *qmlEngine, QJSEngine *jsEngine) -> AudioTool *
Expand Down Expand Up @@ -145,36 +141,40 @@ void AudioTool::play(AudioElement *element)
return;
}

auto prepareMusic = [this](const AudioElement &element) {
metaDataReader.clearMetaData();
m_musicElementType = element.type();
setMusicVolume(m_musicVolume);
currentElementName(element.name());
};

switch (element->type())
{
case AudioElement::Type::Music:
m_musicElementType = element->type();
prepareMusic(*element);
radioPlayer.stop();
musicPlayer.play(element);
setMusicVolume(m_musicVolume);
break;

case AudioElement::Type::Sound:
soundPlayerController.play(element);
setSoundVolume(m_soundVolume);
break;

case AudioElement::Type::Radio:
m_musicElementType = element->type();
prepareMusic(*element);
emit playlistChanged();
musicPlayer.stop();
radioPlayer.play(element);
setMusicVolume(m_musicVolume);
break;
case AudioElement::Type::Sound:
soundPlayerController.play(element);
setSoundVolume(m_soundVolume);
break;
}

metaDataReader.updateMetaData(QMediaMetaData::MediaType, element->name());
}

void AudioTool::onStartedPlaying()
void AudioTool::onStateChanged(AudioPlayer::State state)
{
m_isPaused = false;
emit isPausedChanged();
mprisManager.setPlaybackStatus(1);
playbackState(state);

#ifndef NO_DBUS
mprisManager.setPlaybackStatus(state);
#endif
}

/**
Expand All @@ -197,21 +197,7 @@ void AudioTool::next()
*/
void AudioTool::playPause()
{
if (m_isPaused)
{
switch (m_musicElementType)
{
case AudioElement::Type::Music:
musicPlayer.play();
break;
case AudioElement::Type::Radio:
radioPlayer.play();
break;
default:
break;
}
}
else
if (playbackState() == AudioPlayer::State::Playing)
{
switch (m_musicElementType)
{
Expand All @@ -225,9 +211,19 @@ void AudioTool::playPause()
break;
}

m_isPaused = true;
emit isPausedChanged();
mprisManager.setPlaybackStatus(2);
return;
}

switch (m_musicElementType)
{
case AudioElement::Type::Music:
musicPlayer.play();
break;
case AudioElement::Type::Radio:
radioPlayer.play();
break;
default:
break;
}
}

Expand All @@ -239,8 +235,7 @@ void AudioTool::stop()
musicPlayer.stop();
radioPlayer.stop();
soundPlayerController.stop();
m_isPaused = true;
emit isPausedChanged();
playbackState(AudioPlayer::State::Stopped);
}

/**
Expand Down Expand Up @@ -273,7 +268,10 @@ void AudioTool::setMusicVolume(qreal volume)

musicPlayer.setVolume(linearVolume, logarithmicVolume);
radioPlayer.setVolume(linearVolume, logarithmicVolume);

#ifndef NO_DBUS
mprisManager.setVolume(logarithmicVolume);
#endif
}

/**
Expand All @@ -300,17 +298,6 @@ auto AudioTool::makeLogarithmicVolume(qreal linearVolume) -> int
VOLUME_FACTOR);
}

auto AudioTool::playlist() const -> QList<AudioFile *>
{
switch (m_musicElementType)
{
case AudioElement::Type::Music:
return musicPlayer.playlist();
default:
return {};
}
}

auto AudioTool::playlistQml() -> QQmlListProperty<AudioFile>
{
switch (m_musicElementType)
Expand All @@ -331,6 +318,7 @@ auto AudioTool::index() const -> int
switch (m_musicElementType)
{
case AudioElement::Type::Music:
qCDebug(gmAudioTool()) << musicPlayer.playlistIndex();
return musicPlayer.playlistIndex();
default:
return 0;
Expand All @@ -353,13 +341,6 @@ void AudioTool::setMusicIndex(int index)
}
}

void AudioTool::onMetaDataUpdated()
{
mprisManager.updateMetaData(metaDataReader.metaData());
emit metaDataChanged();
emit currentIndexChanged();
}

void AudioTool::findElement(const QString &term) const
{
AudioScenario::setFilterString(term);
Expand Down
Loading

0 comments on commit da5ddb9

Please sign in to comment.