From 1f2b0ba41942ab858d8375a65c9e9f5e32003112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Hillerstr=C3=B6m?= Date: Fri, 13 Nov 2015 23:43:18 +0100 Subject: [PATCH] Add safeguards when setting cur_pat --- xm.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/xm.js b/xm.js index ff31034..1552f82 100644 --- a/xm.js +++ b/xm.js @@ -107,13 +107,37 @@ function periodForNote(ch, note) { return 1920 - (note + ch.samp.note)*16 - ch.samp.fine / 8.0; } +function setCurrentPattern() { + var nextPat = player.xm.songpats[player.cur_songpos]; + + // check for out of range pattern index + while (nextPat >= player.xm.patterns.length) { + if (player.cur_songpos + 1 < player.xm.songpats.length) { + // first try skipping the position + player.cur_songpos++; + } else if ((player.cur_songpos === player.xm.song_looppos && player.cur_songpos !== 0) + || player.xm.song_looppos >= player.xm.songpats.length) { + // if we allready tried song_looppos or if song_looppos + // is out of range, go to the first position + player.cur_songpos = 0; + } else { + // try going to song_looppos + player.cur_songpos = player.xm.song_looppos; + } + + nextPat = player.xm.songpats[player.cur_songpos]; + } + + player.cur_pat = nextPat; +} + function nextRow() { if (player.cur_pat == -1 || player.cur_row >= player.xm.patterns[player.cur_pat].length) { player.cur_row = 0; player.cur_songpos++; if (player.cur_songpos >= player.xm.songpats.length) player.cur_songpos = player.xm.song_looppos; - player.cur_pat = player.xm.songpats[player.cur_songpos]; + setCurrentPattern(); } var p = player.xm.patterns[player.cur_pat]; var r = p[player.cur_row];