Loops
- Looping is now done by the playback backends instead of restarting
the stream with Stop/Play. Loop can be toggled at runtime (SetLoop in
ISound/IPlayback/IAudioStream), so the repeat button keeps working.
- GStreamer: gapless loops via playbin's about-to-finish signal.
- PortAudio/OpenAL: the decoder is reopened at the end of the file
(Acinerella's seek does not reset FFmpeg after EOF) while the buffered
data keeps playing, so the loop has no gap. The reported position wraps
correctly.
Credits screen
- New event music player in CBackgroundMusic that replaces the current
background music and resumes it afterwards.
- The credits screen loops Sounds/CreditsMusic.mp3
("Atmosphere Calm Background" by lvymusic, Pixabay Content License).
- As the credits screen was touched anyway, its content was updated as
well.
Fixes for PortAudio/OpenAL playback found on the way
- Acinerella delivers 32 bit float samples for mp3, so every file was
rejected with "Unsupported BitDepth". Float samples are converted to
16 bit now.
- Acinerella reports a missing frame (EAGAIN) like the end of the file,
so decoding is retried a few times before treating it as the end.
- OpenAL stopped after half a second because the decoder thread was
never woken up to refill its buffer. A source that ran out of data is
restarted as well.
Part of #677
Co-authored-by: Florian Ostertag <flokuep@users.noreply.github.com>