diff --git a/Plugins/vgmstream/vgmstream/VGMDecoder.h b/Plugins/vgmstream/vgmstream/VGMDecoder.h index 62cc061ea..3f459f8ed 100644 --- a/Plugins/vgmstream/vgmstream/VGMDecoder.h +++ b/Plugins/vgmstream/vgmstream/VGMDecoder.h @@ -29,6 +29,7 @@ VGMSTREAM *stream; BOOL playForever; + BOOL canPlayForever; int sampleRate; int channels; int bitrate; diff --git a/Plugins/vgmstream/vgmstream/VGMDecoder.m b/Plugins/vgmstream/vgmstream/VGMDecoder.m index 81ac0ef57..46946280e 100644 --- a/Plugins/vgmstream/vgmstream/VGMDecoder.m +++ b/Plugins/vgmstream/vgmstream/VGMDecoder.m @@ -223,7 +223,13 @@ vgmstream_mixing_autodownmix(stream, 6); - playForever = IsRepeatOneSet(); + canPlayForever = stream->loop_flag; + if (canPlayForever) { + playForever = IsRepeatOneSet(); + } + else { + playForever = NO; + } vgmstream_cfg_t vcfg = {0}; @@ -266,18 +272,21 @@ - (int)readAudio:(void *)buf frames:(UInt32)frames { - BOOL repeatone = IsRepeatOneSet(); UInt32 framesMax = frames; + + if (canPlayForever) { + BOOL repeatone = IsRepeatOneSet(); - if (repeatone != playForever) { - playForever = repeatone; - vgmstream_set_play_forever(stream, repeatone); + if (repeatone != playForever) { + playForever = repeatone; + vgmstream_set_play_forever(stream, repeatone); + } } if (framesRead + frames > totalFrames && !playForever) frames = totalFrames - framesRead; if (frames > framesMax) - frames = 0; + frames = 0; // integer overflow? if (frames) { sample * sbuf = (sample *) buf; @@ -292,11 +301,13 @@ - (long)seek:(long)frame { - BOOL repeatone = IsRepeatOneSet(); + if (canPlayForever) { + BOOL repeatone = IsRepeatOneSet(); - if (repeatone != playForever) { - playForever = repeatone; - vgmstream_set_play_forever(stream, repeatone); + if (repeatone != playForever) { + playForever = repeatone; + vgmstream_set_play_forever(stream, repeatone); + } } if (frame > totalFrames)