diff --git a/src/audio/Audio.cpp b/src/audio/Audio.cpp index da80838..d547585 100644 --- a/src/audio/Audio.cpp +++ b/src/audio/Audio.cpp @@ -157,6 +157,25 @@ void Audio::start(){ playing = true; } +void Audio::skipToNextTrack(){ + if(!ensureStream()) return; + + // If menu music is active, just restart the looped menu track + if(isMenuMusic){ + if(menuTrack.ok){ + menuTrack.cursor = 0; + playing = true; + SDL_ResumeAudioStreamDevice(audioStream); + } + return; + } + + if(tracks.empty()) return; + nextTrack(); + playing = true; + SDL_ResumeAudioStreamDevice(audioStream); +} + void Audio::toggleMute(){ muted=!muted; } void Audio::setMuted(bool m){ muted=m; } diff --git a/src/audio/Audio.h b/src/audio/Audio.h index 0541d03..35f520a 100644 --- a/src/audio/Audio.h +++ b/src/audio/Audio.h @@ -42,6 +42,7 @@ public: int getLoadedTrackCount() const; // get number of tracks loaded so far void shuffle(); // randomize order void start(); // begin playback + void skipToNextTrack(); // advance to the next music track void toggleMute(); void setMuted(bool m); bool isMuted() const { return muted; } diff --git a/src/core/application/ApplicationManager.cpp b/src/core/application/ApplicationManager.cpp index f626e04..30d8bc8 100644 --- a/src/core/application/ApplicationManager.cpp +++ b/src/core/application/ApplicationManager.cpp @@ -352,6 +352,16 @@ bool ApplicationManager::initializeManagers() { consume = true; } + // N: Skip to next song in the playlist (or restart menu track) + if (!consume && sc == SDL_SCANCODE_N) { + Audio::instance().skipToNextTrack(); + if (!m_musicStarted && Audio::instance().getLoadedTrackCount() > 0) { + m_musicStarted = true; + m_musicEnabled = true; + } + consume = true; + } + if (!consume && sc == SDL_SCANCODE_H) { AppState currentState = m_stateManager ? m_stateManager->getState() : AppState::Loading; if (currentState != AppState::Loading) {