summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arm-wt-22k/lib_src/eas_imelody.c11
-rw-r--r--arm-wt-22k/lib_src/eas_imelodydata.h1
2 files changed, 9 insertions, 3 deletions
diff --git a/arm-wt-22k/lib_src/eas_imelody.c b/arm-wt-22k/lib_src/eas_imelody.c
index bf4375f..05380e5 100644
--- a/arm-wt-22k/lib_src/eas_imelody.c
+++ b/arm-wt-22k/lib_src/eas_imelody.c
@@ -396,6 +396,9 @@ static EAS_RESULT IMY_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I
{
pData->repeatOffset = pData->startLine + (EAS_I32) pData->index;
+ /* save current time and check it later to make sure the loop isn't zero length */
+ pData->repeatTime = pData->time;
+
#ifdef _DEBUG_IMELODY
{ /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "Repeat offset = %d\n", pData->repeatOffset); */ }
#endif
@@ -410,9 +413,11 @@ static EAS_RESULT IMY_Event (S_EAS_DATA *pEASData, EAS_VOID_PTR pInstData, EAS_I
#ifdef _DEBUG_IMELODY
{ /* dpp: EAS_ReportEx(_EAS_SEVERITY_DETAIL, "End repeat section, repeat offset = %d\n", pData->repeatOffset); */ }
#endif
- /* ignore invalid repeats */
- if (pData->repeatCount >= 0)
- {
+ /* ignore zero-length loops */
+ if (pData->repeatTime == pData->time) {
+ pData->repeatCount = -1;
+ pData->repeatOffset = -1;
+ } else if (pData->repeatCount >= 0) {
/* decrement repeat count (repeatCount == 0 means infinite loop) */
if (pData->repeatCount > 0)
diff --git a/arm-wt-22k/lib_src/eas_imelodydata.h b/arm-wt-22k/lib_src/eas_imelodydata.h
index 57c1ed0..17d03dc 100644
--- a/arm-wt-22k/lib_src/eas_imelodydata.h
+++ b/arm-wt-22k/lib_src/eas_imelodydata.h
@@ -56,6 +56,7 @@ typedef struct
EAS_I32 restTicks; /* ticks to rest after current note */
EAS_I32 startLine; /* file offset at start of line (for repeats) */
EAS_I32 repeatOffset; /* file offset to start of repeat section */
+ EAS_I32 repeatTime; /* time at start of repeat section */
S_METADATA_CB metadata; /* metadata callback */
EAS_I16 repeatCount; /* repeat counter */
EAS_U8 state; /* current state EAS_STATE_XXXX */