From 1139bf5cd0473817ba223ac8a9fe9d193575206a Mon Sep 17 00:00:00 2001 From: iamgoofball Date: Sat, 19 Jan 2019 21:01:19 -0800 Subject: [PATCH] Bass.dll functionality-based clientside music looping system by using channel loopable flags (no use of QTimer required) Implement Goofball's AOV loopable music server message where any value that's not -1 when the length of the handle_message packet is longer than 3 will not loop the music (still confused about this but w/e) --- include/aomusicplayer.h | 5 ++++- src/aomusicplayer.cpp | 26 +++++++++++++++++++++++--- src/courtroom.cpp | 18 +++++++++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/include/aomusicplayer.h b/include/aomusicplayer.h index b34267c..da47128 100644 --- a/include/aomusicplayer.h +++ b/include/aomusicplayer.h @@ -17,15 +17,18 @@ class AOMusicPlayer { public: AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app); - ~AOMusicPlayer(); + virtual ~AOMusicPlayer(); void play(QString p_song); + void stop(); void set_volume(int p_value); + void set_looping(bool toggle); private: QWidget *m_parent; AOApplication *ao_app; + bool m_looping = true; int m_volume = 0; HSTREAM m_stream; }; diff --git a/src/aomusicplayer.cpp b/src/aomusicplayer.cpp index 2791809..781a90c 100644 --- a/src/aomusicplayer.cpp +++ b/src/aomusicplayer.cpp @@ -17,22 +17,42 @@ void AOMusicPlayer::play(QString p_song) BASS_ChannelStop(m_stream); QString f_path = ao_app->get_music_path(p_song); - - m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE); + unsigned int flags = BASS_STREAM_AUTOFREE | BASS_UNICODE | BASS_ASYNCFILE; + m_stream = BASS_StreamCreateFile(FALSE, f_path.utf16(), 0, 0, flags); this->set_volume(m_volume); - + this->set_looping(m_looping); if (ao_app->get_audio_output_device() != "default") BASS_ChannelSetDevice(m_stream, BASS_GetDevice()); BASS_ChannelPlay(m_stream, false); } +void AOMusicPlayer::stop() +{ + BASS_ChannelStop(m_stream); +} + void AOMusicPlayer::set_volume(int p_value) { m_volume = p_value; float volume = m_volume / 100.0f; BASS_ChannelSetAttribute(m_stream, BASS_ATTRIB_VOL, volume); } + +void AOMusicPlayer::set_looping(bool toggle) +{ + m_looping = toggle; + if (BASS_ChannelFlags(m_stream, 0, 0) & BASS_SAMPLE_LOOP) + { + if (m_looping == false) + BASS_ChannelFlags(m_stream, 0, BASS_SAMPLE_LOOP); // remove the LOOP flag + } + else + { + if (m_looping == true) + BASS_ChannelFlags(m_stream, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP); // set the LOOP flag + } +} #elif defined(QTAUDIO) AOMusicPlayer::AOMusicPlayer(QWidget *parent, AOApplication *p_ao_app) { diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 41712d2..06f5aa0 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -2616,7 +2616,23 @@ void Courtroom::handle_song(QStringList *p_contents) if (p_contents->length() > 2) { - str_show = p_contents->at(2); + if(p_contents->at(2) != "") + { + str_show = p_contents->at(2); + } + } + if (p_contents->length() > 3) + { + //I am really confused why "-1" is "loop this song" and why anything else passes as "don't loop" + //(if we even have this length) but alright + if(p_contents->at(3) != "-1") + { + music_player->set_looping(false); + } + else + { + music_player->set_looping(true); + } } if (!mute_map.value(n_char))