From e735b7f6da8ce5748deffda75da49733732c3feb Mon Sep 17 00:00:00 2001 From: TrickyLeifa <26681464+TrickyLeifa@users.noreply.github.com> Date: Tue, 16 Jun 2026 13:35:43 +0200 Subject: [PATCH] Added no-repeat option for music playback Resolve #314 --- src/aomusicplayer.cpp | 10 ++++++---- src/courtroom.cpp | 17 +++++++++++++++++ src/courtroom.h | 1 + src/datatypes.h | 3 ++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/aomusicplayer.cpp b/src/aomusicplayer.cpp index c4a562cb1..6ea8c83e9 100644 --- a/src/aomusicplayer.cpp +++ b/src/aomusicplayer.cpp @@ -28,8 +28,10 @@ QString AOMusicPlayer::playStream(QString song, int streamId, bool loopEnabled, return "[ERROR] Invalid Channel"; } + bool isLooping = loopEnabled && !(effectFlags & NO_REPEAT); + quint32 flags = BASS_STREAM_AUTOFREE; - if (loopEnabled) + if (isLooping) { flags |= BASS_SAMPLE_LOOP; } @@ -64,7 +66,7 @@ QString AOMusicPlayer::playStream(QString song, int streamId, bool loopEnabled, m_loop_end[streamId] = 0; QString d_path = f_path + ".txt"; - if (loopEnabled && file_exists(d_path)) // Contains loop/etc. information file + if (isLooping && file_exists(d_path)) // Contains loop/etc. information file { QStringList lines = ao_app->read_file(d_path).split("\n"); bool seconds_mode = false; @@ -164,8 +166,8 @@ QString AOMusicPlayer::playStream(QString song, int streamId, bool loopEnabled, BASS_ChannelSetSync(newstream, BASS_SYNC_DEV_FAIL, 0, ao_app->BASSreset, 0); - this->setStreamLooping(loopEnabled, streamId); // Have to do this here due to any - // crossfading-related changes, etc. + this->setStreamLooping(isLooping, streamId); // Have to do this here due to any + // crossfading-related changes, etc. bool is_stop = (song == "~stop.mp3"); QString p_song_clear = QUrl(song).fileName(); diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 1cc57cf20..3057d0a10 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -5858,6 +5858,11 @@ void Courtroom::on_music_list_context_menu_requested(const QPoint &pos) menu->actions().constLast()->setChecked(music_flags & SYNC_POS); connect(menu->actions().constLast(), &QAction::toggled, this, &Courtroom::music_synchronize); + menu->addAction(new QAction(tr("No Repeat"), this)); + menu->actions().constLast()->setCheckable(true); + menu->actions().constLast()->setChecked(music_flags & NO_REPEAT); + connect(menu->actions().constLast(), &QAction::toggled, this, &Courtroom::music_no_repeat); + menu->addSeparator(); menu->addAction(QString("Open base music folder"), this, [=] { QString p_path = get_base_path() + "sounds/music/"; @@ -5927,6 +5932,18 @@ void Courtroom::music_synchronize(bool toggle) } } +void Courtroom::music_no_repeat(bool toggle) +{ + if (toggle) + { + music_flags |= NO_REPEAT; + } + else + { + music_flags &= ~NO_REPEAT; + } +} + void Courtroom::music_random() { QList clist; diff --git a/src/courtroom.h b/src/courtroom.h index dc8cdf3ae..3b6e2804d 100644 --- a/src/courtroom.h +++ b/src/courtroom.h @@ -842,6 +842,7 @@ private Q_SLOTS: void music_fade_out(bool toggle); void music_fade_in(bool toggle); void music_synchronize(bool toggle); + void music_no_repeat(bool toggle); void music_random(); void music_list_expand_all(); void music_list_collapse_all(); diff --git a/src/datatypes.h b/src/datatypes.h index 0bc6b20f7..724250600 100644 --- a/src/datatypes.h +++ b/src/datatypes.h @@ -96,7 +96,8 @@ enum MUSIC_EFFECT { FADE_IN = 1, FADE_OUT = 2, - SYNC_POS = 4 + SYNC_POS = 4, + NO_REPEAT = 8 }; enum RESIZE_MODE