diff options
| author | Jeffery Myers <[email protected]> | 2021-03-22 12:36:13 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-22 20:36:13 +0100 |
| commit | 2c0a5339482cda97690917d4922f5b672e67c231 (patch) | |
| tree | 054d534f4ba1caff224dd86b3e2f9065f6157f0a /src/raudio.c | |
| parent | 8e1e1ef9701433de9dddc3e4cbe5028d96b757b4 (diff) | |
| download | raylib-2c0a5339482cda97690917d4922f5b672e67c231.tar.gz raylib-2c0a5339482cda97690917d4922f5b672e67c231.zip | |
[AUDIO] Music Looping enhancements (#1665)
* Add loop functions for music files.
Tell xm tracker to loop tracker when loop state changes.
Don't let looped xm tracker streams restart, they are infinite
Use modulo to make time tracker for xm looped streams work correctly.
* Remove loop functions, set XM loop in update based on flag.
Formatting cleanups.
Co-authored-by: Jeffery Myers <[email protected]>
Diffstat (limited to 'src/raudio.c')
| -rw-r--r-- | src/raudio.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/raudio.c b/src/raudio.c index 1f7f3531..75cd6960 100644 --- a/src/raudio.c +++ b/src/raudio.c @@ -1575,7 +1575,11 @@ void StopMusicStream(Music music) // Update (re-fill) music buffers if data already processed void UpdateMusicStream(Music music) { - if (music.stream.buffer == NULL) return; + if (music.stream.buffer == NULL) + return; + + if (music.ctxType == MUSIC_MODULE_XM) + jar_xm_set_max_loop_count(music.ctxData, music.looping ? 0 : 1); bool streamEnding = false; @@ -1590,6 +1594,8 @@ void UpdateMusicStream(Music music) //ma_uint32 frameSizeInBytes = ma_get_bytes_per_sample(music.stream.buffer->dsp.formatConverterIn.config.formatIn)*music.stream.buffer->dsp.formatConverterIn.config.channels; int sampleLeft = music.sampleCount - (music.stream.buffer->totalFramesProcessed*music.stream.channels); + if (music.ctxType == MUSIC_MODULE_XM && music.looping) sampleLeft = subBufferSizeInFrames*4; + while (IsAudioStreamProcessed(music.stream)) { if ((sampleLeft/music.stream.channels) >= subBufferSizeInFrames) samplesCount = subBufferSizeInFrames*music.stream.channels; @@ -1649,10 +1655,10 @@ void UpdateMusicStream(Music music) UpdateAudioStream(music.stream, pcm, samplesCount); - if ((music.ctxType == MUSIC_MODULE_XM) || (music.ctxType == MUSIC_MODULE_MOD)) + if ((music.ctxType == MUSIC_MODULE_XM) || music.ctxType == MUSIC_MODULE_MOD) { - if (samplesCount > 1) sampleLeft -= samplesCount/2; - else sampleLeft -= samplesCount; + if (samplesCount > 1) sampleLeft -= samplesCount / 2; + else sampleLeft -= samplesCount; } else sampleLeft -= samplesCount; @@ -1711,8 +1717,17 @@ float GetMusicTimeLength(Music music) // Get current music time played (in seconds) float GetMusicTimePlayed(Music music) { +#if defined(SUPPORT_FILEFORMAT_XM) + if (music.ctxType == MUSIC_MODULE_XM) + { + uint64_t samples = 0; + jar_xm_get_position(music.ctxData, NULL, NULL, NULL, &samples); + samples = samples % (music.sampleCount); + + return (float)(samples) / (music.stream.sampleRate * music.stream.channels); + } +#endif float secondsPlayed = 0.0f; - if (music.stream.buffer != NULL) { //ma_uint32 frameSizeInBytes = ma_get_bytes_per_sample(music.stream.buffer->dsp.formatConverterIn.config.formatIn)*music.stream.buffer->dsp.formatConverterIn.config.channels; |
