diff --git a/aegisub/src/audio_controller.cpp b/aegisub/src/audio_controller.cpp index d588403d8..2e49dd0c3 100644 --- a/aegisub/src/audio_controller.cpp +++ b/aegisub/src/audio_controller.cpp @@ -429,6 +429,16 @@ void AudioController::PlayPrimaryRange() playback_mode = PM_PrimaryRange; } +void AudioController::PlayToEndOfPrimary(int64_t start_sample) +{ + if (!IsAudioOpen()) return; + + player->Play(start_sample, GetPrimaryPlaybackRange().end() - start_sample); + playback_mode = PM_PrimaryRange; + playback_timer.Start(20); + + AnnouncePlaybackPosition(start_sample); +} void AudioController::PlayToEnd(int64_t start_sample) { diff --git a/aegisub/src/audio_controller.h b/aegisub/src/audio_controller.h index 8feb3a3a7..c88f9cb24 100644 --- a/aegisub/src/audio_controller.h +++ b/aegisub/src/audio_controller.h @@ -306,6 +306,13 @@ public: /// The playback end can not be changed in any other way. void PlayPrimaryRange(); + /// @brief Start or restart audio playback, playing from a point to the end of of the primary playback range + /// @param start_sample Index of the sample to start playback at + /// + /// This behaves like PlayPrimaryRange, but the start point can differ from + /// the beginning of the primary range. + void PlayToEndOfPrimary(int64_t start_sample); + /// @brief Start or restart audio playback, playing from a point to the end of stream /// @param start_sample Index of the sample to start playback at /// diff --git a/aegisub/src/command/audio.cpp b/aegisub/src/command/audio.cpp index 2b0c0bd74..35a078ec7 100644 --- a/aegisub/src/command/audio.cpp +++ b/aegisub/src/command/audio.cpp @@ -290,11 +290,10 @@ struct audio_play_end : public validate_audio_open { void operator()(agi::Context *c) { c->videoController->Stop(); SampleRange times(c->audioController->GetPrimaryPlaybackRange()); - c->audioController->PlayRange(SampleRange( + c->audioController->PlayToEndOfPrimary( times.end() - std::min( c->audioController->SamplesFromMilliseconds(500), - times.length()), - times.end())); + times.length())); } };