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>
* Apply R# clean-up for reliability
- Migrate to NUnit4 Assert.That
- Update dependencise versions
- Fix LangVersion to 9.0 (until net core migration)
- Reformat code
- Apply 'var' style (easier for refactoring)
- Remove redundant parentheses
- Add braces on every condition blocks (1 line)
- Uses new null checking patterns
- Uses AutoProperties when possible
- Uses string scalar type instead of class
- Clean usings
- Add .orig files in git ignore
- Rename some properties to respect defined conventions and US format definition
- ID -> Id
- BPM -> Bpm
- Finish -> End
* Update R# settings according to the clean-up made