diff options
-rw-r--r-- | arm-wt-22k/lib_src/eas_imelody.c | 11 | ||||
-rw-r--r-- | arm-wt-22k/lib_src/eas_imelodydata.h | 1 |
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 */ |