Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libxmp for openSUSE:Factory checked in at 2026-09-12 21:21:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libxmp (Old) and /work/SRC/openSUSE:Factory/.libxmp.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libxmp" Sat Sep 12 21:21:28 2026 rev:39 rq:1377461 version:4.7.3 Changes: -------- --- /work/SRC/openSUSE:Factory/libxmp/libxmp.changes 2026-07-28 18:07:11.452029509 +0200 +++ /work/SRC/openSUSE:Factory/.libxmp.new.1265/libxmp.changes 2026-09-12 21:25:15.967305458 +0200 @@ -1,0 +2,17 @@ +Fri Sep 11 20:22:09 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 4.7.3 + * Fix hangs caused by changing the player mode to an S3M/IT mode + with a loaded module sequence beginning with pattern FF. + * Also fixed incomplete rescanning of modules in the same + situation. xmp now fully scans modules with an empty or invalid + first sequence, allowing later sequences in modules that begin + with an end marker. + * Operations that rescan the module (changing XMP_PLAYER_MODE or + XMP_FLAGS_VBLANK; xmp_scan_module) now reset the current + sequence. + * Fix missing bounds check on Protracker 2 sample changes that + could be reached by playing modules with instruments but no + samples in Protracker mode. + +------------------------------------------------------------------- Old: ---- libxmp-4.7.2.tar.gz New: ---- libxmp-4.7.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libxmp.spec ++++++ --- /var/tmp/diff_new_pack.8MJ68Z/_old 2026-09-12 21:25:16.495327620 +0200 +++ /var/tmp/diff_new_pack.8MJ68Z/_new 2026-09-12 21:25:16.496327662 +0200 @@ -18,7 +18,7 @@ Name: libxmp %define lname libxmp4 -Version: 4.7.2 +Version: 4.7.3 Release: 0 Summary: Module Player library for MOD, S3M, IT and others License: MIT ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.8MJ68Z/_old 2026-09-12 21:25:16.527328963 +0200 +++ /var/tmp/diff_new_pack.8MJ68Z/_new 2026-09-12 21:25:16.530329089 +0200 @@ -1,5 +1,5 @@ -mtime: 1785076317 -commit: 9c478ee3d9b82223c407a6c656c270c98f7b7184c926ec2b46e551fa0e6aaf48 +mtime: 1789158973 +commit: 40fbb9ef8b23b147e0709edc30cccb9af7f7f07455a3ea857da8222edc86b4fc url: https://src.opensuse.org/jengelh/libxmp revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-09-11 22:36:13.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ libxmp-4.7.2.tar.gz -> libxmp-4.7.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/CMakeLists.txt new/libxmp-4.7.3/CMakeLists.txt --- old/libxmp-4.7.2/CMakeLists.txt 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/CMakeLists.txt 2026-09-11 04:10:10.000000000 +0200 @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.2...3.10) -project(libxmp VERSION 4.7.2 LANGUAGES C) +project(libxmp VERSION 4.7.3 LANGUAGES C) set(LIBXMP_DEFINES) set(LIBXMPLITE_DEFINES) @@ -139,7 +139,15 @@ if(APPLE) set_property(TARGET xmp_shared APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-undefined,error") + if(NOT HAVE_CLANG) + set_property(TARGET xmp_shared APPEND_STRING PROPERTY + LINK_FLAGS " -static-libgcc") + endif() elseif(NOT CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") + if(MINGW) + set_property(TARGET xmp_shared APPEND_STRING PROPERTY + LINK_FLAGS " -static-libgcc") + endif() cmake_push_check_state() set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined") check_c_compiler_flag("" HAVE_NO_UNDEFINED) @@ -196,7 +204,15 @@ if(APPLE) set_property(TARGET xmp_lite_shared APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-undefined,error") + if(NOT HAVE_CLANG) + set_property(TARGET xmp_lite_shared APPEND_STRING PROPERTY + LINK_FLAGS " -static-libgcc") + endif() elseif(NOT CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") + if(MINGW) + set_property(TARGET xmp_lite_shared APPEND_STRING PROPERTY + LINK_FLAGS " -static-libgcc") + endif() cmake_push_check_state() set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined") check_c_compiler_flag("" HAVE_NO_UNDEFINED) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/configure new/libxmp-4.7.3/configure --- old/libxmp-4.7.2/configure 2026-07-26 13:50:50.000000000 +0200 +++ new/libxmp-4.7.3/configure 2026-09-11 04:10:50.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for libxmp 4.7.2. +# Generated by GNU Autoconf 2.69 for libxmp 4.7.3. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -577,8 +577,8 @@ # Identity of this package. PACKAGE_NAME='libxmp' PACKAGE_TARNAME='libxmp' -PACKAGE_VERSION='4.7.2' -PACKAGE_STRING='libxmp 4.7.2' +PACKAGE_VERSION='4.7.3' +PACKAGE_STRING='libxmp 4.7.3' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1256,7 +1256,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures libxmp 4.7.2 to adapt to many kinds of systems. +\`configure' configures libxmp 4.7.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1321,7 +1321,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libxmp 4.7.2:";; + short | recursive ) echo "Configuration of libxmp 4.7.3:";; esac cat <<\_ACEOF @@ -1417,7 +1417,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libxmp configure 4.7.2 +libxmp configure 4.7.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1782,7 +1782,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libxmp $as_me 4.7.2, which was +It was created by libxmp $as_me 4.7.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -4263,7 +4263,14 @@ case "${host_os}" in openbsd*) ;; - darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error" ;; + darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error" + if test "$ac_cv_defined___clang__" = "no"; then + LDFLAGS="$LDFLAGS -static-libgcc" + fi + ;; + mingw*) + LDFLAGS="$LDFLAGS -static-libgcc -Wl,--no-undefined" + ;; *) if test "$ac_cv_defined___clang__" = "no" || test "${LDFLAGS#*fsanitize}" = "$LDFLAGS" then save_LDFLAGS="$LDFLAGS" @@ -5026,11 +5033,11 @@ libxmp_VERSION_MINOR=7 -libxmp_VERSION_PATCH=2 +libxmp_VERSION_PATCH=3 -libxmp_VERSION=4.7.2 +libxmp_VERSION=4.7.3 -libxmplite_VERSION=4.7.2 +libxmplite_VERSION=4.7.3 ac_config_files="$ac_config_files Makefile" @@ -5588,7 +5595,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libxmp $as_me 4.7.2, which was +This file was extended by libxmp $as_me 4.7.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5641,7 +5648,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -libxmp config.status 4.7.2 +libxmp config.status 4.7.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -6171,6 +6178,8 @@ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + + esac done # for ac_tag diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/configure.ac new/libxmp-4.7.3/configure.ac --- old/libxmp-4.7.2/configure.ac 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/configure.ac 2026-09-11 04:10:10.000000000 +0200 @@ -1,6 +1,6 @@ m4_define([libxmp_VERSION_MAJOR_m4], [4]) m4_define([libxmp_VERSION_MINOR_m4], [7]) -m4_define([libxmp_VERSION_PATCH_m4], [2]) +m4_define([libxmp_VERSION_PATCH_m4], [3]) m4_define([libxmp_VERSION_m4], libxmp_VERSION_MAJOR_m4[.]libxmp_VERSION_MINOR_m4[.]libxmp_VERSION_PATCH_m4) AC_PREREQ(2.60) @@ -70,9 +70,16 @@ AC_CHECK_DEFINED(__cplusplus) case "${host_os}" in -dnl Skip this on platforms where it is just simply busted. +dnl Skip --no-undefined on platforms where it is just simply busted openbsd*) ;; - darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error" ;; + darwin*) LDFLAGS="$LDFLAGS -Wl,-undefined,error" + if test "$ac_cv_defined___clang__" = "no"; then + LDFLAGS="$LDFLAGS -static-libgcc" + fi + ;; + mingw*) + LDFLAGS="$LDFLAGS -static-libgcc -Wl,--no-undefined" + ;; dnl For whatever reason, the Clang sanitizers and --no-undefined for dnl shared libraries are incompatible. *) if test "$ac_cv_defined___clang__" = "no" || test "${LDFLAGS#*fsanitize}" = "$LDFLAGS" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/docs/Changelog new/libxmp-4.7.3/docs/Changelog --- old/libxmp-4.7.2/docs/Changelog 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/docs/Changelog 2026-09-11 04:10:10.000000000 +0200 @@ -1,6 +1,19 @@ Stable versions --------------- +4.7.3 (20260911): + Changes by Alice Rowan: + - Fix hangs caused by changing the player mode to an S3M/IT mode + with a loaded module sequence beginning with pattern FF. + - Also fixed incomplete rescanning of modules in the same situation. + xmp now fully scans modules with an empty or invalid first sequence, + allowing later sequences in modules that begin with an end marker. + - Operations that rescan the module (changing XMP_PLAYER_MODE or + XMP_FLAGS_VBLANK; xmp_scan_module) now reset the current sequence. + - Fix missing bounds check on Protracker 2 sample changes that could + be reached by playing modules with instruments but no samples in + Protracker mode. + 4.7.2 (20260726): Changes by Alice Rowan: - Fix loading Startrekker modules from memory/handle/callbacks. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/include/xmp.h new/libxmp-4.7.3/include/xmp.h --- old/libxmp-4.7.2/include/xmp.h 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/include/xmp.h 2026-09-11 04:10:10.000000000 +0200 @@ -9,11 +9,11 @@ extern "C" { #endif -#define XMP_VERSION "4.7.2" -#define XMP_VERCODE 0x040702 +#define XMP_VERSION "4.7.3" +#define XMP_VERCODE 0x040703 #define XMP_VER_MAJOR 4 #define XMP_VER_MINOR 7 -#define XMP_VER_RELEASE 2 +#define XMP_VER_RELEASE 3 #if defined(_WIN32) && !defined(__CYGWIN__) # if defined(LIBXMP_STATIC) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/src/common.h new/libxmp-4.7.3/src/common.h --- old/libxmp-4.7.2/src/common.h 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/src/common.h 2026-09-11 04:10:10.000000000 +0200 @@ -175,9 +175,9 @@ #define D_CRIT " Error: " #define D_WARN "Warning: " #define D_INFO " Info: " +void libxmp_msvc_dbgprint(const char *text, ...); #ifdef DEBUG #define D_ libxmp_msvc_dbgprint /* in win32.c */ -void libxmp_msvc_dbgprint(const char *text, ...); #else /* VS prior to VC7.1 does not support variadic macros. * VC8.0 does not optimize unused parameters passing. */ @@ -611,6 +611,7 @@ int loop_count; int sequence; + int bad_sequence; /* 1 = can't find next order, need reposition */ unsigned char sequence_control[XMP_MAX_MOD_LENGTH]; int smix_vol; /* SFX volume */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/src/control.c new/libxmp-4.7.3/src/control.c --- old/libxmp-4.7.2/src/control.c 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/src/control.c 2026-09-11 04:10:10.000000000 +0200 @@ -208,6 +208,7 @@ p->ord = p->pos; p->row = row; p->frame = -1; + p->bad_sequence = 0; f->num_rows = mod->xxp[mod->xxo[p->ord]]->rows; return row; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/src/player.c new/libxmp-4.7.3/src/player.c --- old/libxmp-4.7.2/src/player.c 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/src/player.c 2026-09-11 04:10:10.000000000 +0200 @@ -563,7 +563,7 @@ { struct xmp_sample *xxs = libxmp_get_sample(ctx, xc->smp); struct module_data *m = &ctx->m; - int lps = 0, len = -1; + int lps = -1, lpe = -1, len = -1; /* If an instrument number is present, reset the position. */ if (ctx->p.frame == 0 && TEST(NEW_INS)) { @@ -573,25 +573,26 @@ xc->invloop.count += invloop_table[xc->invloop.speed]; if (xxs != NULL) { + len = xxs->len; if (xxs->flg & XMP_SAMPLE_LOOP) { lps = xxs->lps; - len = xxs->lpe - lps; + lpe = xxs->lpe; } else if (xxs->flg & XMP_SAMPLE_SLOOP) { /* Some formats that support invert loop use sustain * loops instead (Digital Symphony). */ lps = m->xtra[xc->smp].sus; - len = m->xtra[xc->smp].sue - lps; + lpe = m->xtra[xc->smp].sue; } } - if (len >= 0 && xc->invloop.count >= 128) { + if (lps >= 0 && lps <= lpe && xc->invloop.count >= 128) { xc->invloop.count = 0; - if (++xc->invloop.pos > len) { + if (++xc->invloop.pos > lpe - lps) { xc->invloop.pos = 0; } - if (xxs->data == NULL) { + if (xxs->data == NULL || lps >= len || lpe > len) { return; } @@ -1733,45 +1734,66 @@ * Sequencing */ -static void next_order(struct context_data *ctx, int last_ord) +static int skip_invalid_orders(struct context_data *ctx) +{ + struct player_data *p = &ctx->p; + struct module_data *m = &ctx->m; + struct xmp_module *mod = &m->mod; + + if (p->ord < 0) { + p->ord = 0; + } + + for (;;) { + if (p->ord >= mod->len || + (HAS_QUIRK(QUIRK_MARKER) && mod->xxo[p->ord] == XMP_MARK_END)) { + return -1; + } + if (mod->xxo[p->ord] < mod->pat) { + break; + } + p->ord++; + } + return 0; +} + +static int next_order(struct context_data *ctx, int last_ord) { struct player_data *p = &ctx->p; struct flow_control *f = &p->flow; struct module_data *m = &ctx->m; struct xmp_module *mod = &m->mod; - int reset_gvol = 0; - int mark; int i; - do { - p->ord++; + p->ord++; + if (skip_invalid_orders(ctx) < 0) { /* Restart module */ - mark = HAS_QUIRK(QUIRK_MARKER) && p->ord < mod->len && - mod->xxo[p->ord] == XMP_MARK_END; - if (p->ord >= mod->len || mark) { - if (mod->rst > mod->len || - mod->xxo[mod->rst] >= mod->pat || - p->ord < m->seq_data[p->sequence].entry_point) { - p->ord = m->seq_data[p->sequence].entry_point; + if (mod->rst > mod->len || + mod->xxo[mod->rst] >= mod->pat || + p->ord < m->seq_data[p->sequence].entry_point) { + p->ord = m->seq_data[p->sequence].entry_point; + } else { + if (libxmp_get_sequence(ctx, mod->rst) == p->sequence) { + p->ord = mod->rst; } else { - if (libxmp_get_sequence(ctx, mod->rst) == p->sequence) { - p->ord = mod->rst; - } else { - p->ord = m->seq_data[p->sequence].entry_point; - } + p->ord = m->seq_data[p->sequence].entry_point; } - /* This might be a marker, so delay updating global - * volume until an actual pattern is found */ - reset_gvol = 1; - /* Module restart should always reset the play time. */ - last_ord = -1; } - } while (mod->xxo[p->ord] >= mod->pat); - - if (reset_gvol) + /* Nothing valid, even from the entry point? Fail. + * This should be prevented by the scan, but check anyway. */ + if (skip_invalid_orders(ctx) < 0) { + p->bad_sequence = 1; + return -1; + } p->gvol = m->xxo_info[p->ord].gvl; + /* Module restart should always reset the play time. */ + last_ord = -1; + } + /* Playback now has a valid position. */ + p->bad_sequence = 0; + /* Bxx+Dxx within same position, Archimedes line jump, * etc. should not reset time tracking. */ if (last_ord != p->ord) @@ -1806,9 +1828,10 @@ } } #endif + return 0; } -static void next_row(struct context_data *ctx) +static int next_row(struct context_data *ctx) { struct player_data *p = &ctx->p; struct flow_control *f = &p->flow; @@ -1827,7 +1850,7 @@ f->jump = -1; } - next_order(ctx, last_ord); + return next_order(ctx, last_ord); } else { if (f->rowdelay == 0) { p->row++; @@ -1843,9 +1866,10 @@ /* check end of pattern */ if (p->row >= f->num_rows) { - next_order(ctx, last_ord); + return next_order(ctx, last_ord); } } + return 0; } #ifndef LIBXMP_CORE_DISABLE_IT @@ -1958,6 +1982,7 @@ p->current_time = 0; p->loop_count = 0; p->sequence = 0; + p->bad_sequence = 0; /* Set default volume and mute status */ for (i = 0; i < XMP_MAX_CHANNELS; i++) { @@ -1969,22 +1994,16 @@ p->channel_vol[i] = 100; } - /* Skip invalid patterns at start (the seventh laboratory.it) */ - while (p->ord < mod->len && mod->xxo[p->ord] >= mod->pat) { - p->ord++; - } - /* Check if all positions skipped */ - if (p->ord >= mod->len) { - mod->len = 0; - } - - if (mod->len == 0) { - /* set variables to sane state */ + /* Handle markers/invalid patterns at start (the seventh laboratory.it). + * If there are no valid orders or if an end marker is found, set some + * safe default values (note: this previously zeroed mod->len). */ + if (skip_invalid_orders(ctx) < 0) { /* Note: previously did this for mod->chn == 0, which caused * crashes on invalid order 0s. 0 channel modules are technically * valid (if useless) so just let them play normally. */ p->ord = p->scan[0].ord = 0; p->row = p->scan[0].row = 0; + p->bad_sequence = 1; f->end_point = 0; f->num_rows = 0; } else { @@ -2077,10 +2096,6 @@ return -XMP_END; } - if (HAS_QUIRK(QUIRK_MARKER) && mod->xxo[p->ord] == XMP_MARK_END) { - return -XMP_END; - } - /* check reposition */ if (p->ord != p->pos || f->force_reposition) { int start = m->seq_data[p->sequence].entry_point; @@ -2113,13 +2128,23 @@ p->ord = start - 1; } - next_order(ctx, -1); + if (next_order(ctx, -1) < 0) { + /* Current sequence contains no valid orders; + * playback can't continue. */ + return -XMP_END; + } update_from_ord_info(ctx); libxmp_virt_reset(ctx); reset_channels(ctx); } else { + /* Sequences with no valid orders can't continue playing from + * here and require manual repositioning to another sequence. */ + if (p->bad_sequence) { + return -XMP_END; + } + p->frame++; if (p->frame >= (p->speed * (1 + f->delay))) { /* If break during pattern delay, next row is skipped. @@ -2127,12 +2152,15 @@ * EE2 + D31 ignores D00 in order 1C line 31. Reported * by The Welder <[email protected]>, Jan 14 2012 */ - if (HAS_QUIRK(QUIRK_PROTRACK) && f->delay && f->pbreak) - { - next_row(ctx); + if (HAS_QUIRK(QUIRK_PROTRACK) && f->delay && f->pbreak) { + if (next_row(ctx) < 0) { + return -XMP_END; + } check_end_of_module(ctx); } - next_row(ctx); + if (next_row(ctx) < 0) { + return -XMP_END; + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/src/read_event.c new/libxmp-4.7.3/src/read_event.c --- old/libxmp-4.7.2/src/read_event.c 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/src/read_event.c 2026-09-11 04:10:10.000000000 +0200 @@ -406,7 +406,8 @@ * of its loop (see above). */ if (new_swap_ins && sub && HAS_QUIRK(QUIRK_PROTRACK) && TEST_NOTE(NOTE_SET)) { - libxmp_virt_queuepatch(ctx, chn, e->ins - 1, sub->sid, xc->note); + int smp = IS_VALID_SAMPLE(sub->sid) ? sub->sid : -1; + libxmp_virt_queuepatch(ctx, chn, e->ins - 1, smp, xc->note); xc->smp = sub->sid; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/src/scan.c new/libxmp-4.7.3/src/scan.c --- old/libxmp-4.7.2/src/scan.c 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/src/scan.c 2026-09-11 04:10:10.000000000 +0200 @@ -665,6 +665,7 @@ ctx->m.xxo_info[i].time = -1.0; } memset(ctx->p.sequence_control, NO_SEQUENCE, XMP_MAX_MOD_LENGTH); + memset(&ctx->p.scan[0], 0, sizeof(struct scan_data)); } #ifndef LIBXMP_CORE_PLAYER @@ -751,8 +752,7 @@ #endif if (p->scan[0].time < 0.0) { - D_(D_CRIT "scan was not able to find any valid orders"); - return -1; + D_(D_WARN "main sequence contains no valid orders"); } while (1) { @@ -812,5 +812,12 @@ } } + /* If the module is currently playing, rescanning the sequences may + * invalidate the current sequence. */ + if (ctx->state >= XMP_STATE_PLAYING) { + seq = libxmp_get_sequence(ctx, p->pos); + p->sequence = (seq != NO_SEQUENCE) ? seq : 0; + } + return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libxmp-4.7.2/src/win32.c new/libxmp-4.7.3/src/win32.c --- old/libxmp-4.7.2/src/win32.c 2026-07-26 13:50:10.000000000 +0200 +++ new/libxmp-4.7.3/src/win32.c 2026-09-11 04:10:10.000000000 +0200 @@ -1,5 +1,5 @@ /* Extended Module Player - * Copyright (C) 1996-2021 Claudio Matsuoka and Hipolito Carraro Jr + * Copyright (C) 1996-2026 Claudio Matsuoka and Hipolito Carraro Jr * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -55,12 +55,11 @@ #endif /* Win32 debug message helper by Mirko Buffoni */ -#if defined(_MSC_VER) && defined(DEBUG) +#if defined(_MSC_VER) void libxmp_msvc_dbgprint(const char *format, ...) { va_list argptr; - /* do the output */ va_start(argptr, format); vprintf(format, argptr); printf("\n");
