summaryrefslogtreecommitdiff
path: root/audio/xmp/patches/patch-am
diff options
context:
space:
mode:
Diffstat (limited to 'audio/xmp/patches/patch-am')
-rw-r--r--audio/xmp/patches/patch-am155
1 files changed, 155 insertions, 0 deletions
diff --git a/audio/xmp/patches/patch-am b/audio/xmp/patches/patch-am
new file mode 100644
index 00000000000..cb750c22ba1
--- /dev/null
+++ b/audio/xmp/patches/patch-am
@@ -0,0 +1,155 @@
+$NetBSD: patch-am,v 1.1 2006/06/30 12:54:38 tron Exp $
+
+--- src/loaders/mdl_load.c.orig 2000-12-29 18:08:33.000000000 +0000
++++ src/loaders/mdl_load.c 2006-06-30 12:57:09.000000000 +0100
+@@ -35,6 +35,35 @@
+ static struct mdl_envelope *v_env;
+ static struct mdl_envelope *p_env;
+
++static void *
++get_uint16_le(void *p, uint16_t *x16)
++{
++ uint8_t *bp;
++
++ bp = p;
++ *x16 = bp[0] | (bp[1] << 8);
++ return bp + sizeof(uint16);
++}
++
++static void *
++get_uint16_le_int(void *p, int *ip)
++{
++ uint8_t *bp;
++
++ bp = p;
++ *ip = bp[0] | (bp[1] << 8);
++ return bp + sizeof(uint16);
++}
++
++static void *
++get_uint32_le_int(void *p, int *ip)
++{
++ uint8_t *bp;
++
++ bp = p;
++ *ip = bp[0] | (bp[1] << 8) | (bp[2] << 16) | (bp[3] << 24);
++ return bp + sizeof(uint32);
++}
+
+ /* Effects 1-6 (note effects) can only be entered in the first effect
+ * column, G-L (volume-effects) only in the second column.
+@@ -130,7 +159,8 @@
+ unsigned int x;
+
+ if (i == 0) {
+- b = *((uint32 *)(*buf))++;
++ (void)memcpy(&b, *buf, sizeof(b));
++ *buf += sizeof(b);
+ n = 32;
+ return 0;
+ }
+@@ -268,8 +298,7 @@
+
+ buffer += 16; /* Skip pattern name */
+ for (j = 0; j < chn; j++) {
+- x16 = *((uint16 *)buffer)++;
+- L_ENDIAN16 (x16);
++ buffer = get_uint16_le(buffer, &x16);
+ xxp[i]->info[j].index = x16;
+ }
+ if (V (0))
+@@ -297,8 +326,7 @@
+ xxp[i]->rows = 64;
+
+ for (j = 0; j < 32; j++) {
+- x16 = *((uint16 *)buffer)++;
+- L_ENDIAN16 (x16);
++ buffer = get_uint16_le(buffer, &x16);
+ if (j < xxh->chn)
+ xxp[i]->info[j].index = x16;
+ }
+@@ -315,7 +343,8 @@
+ int i, j, k, row, len;
+ struct xxm_track *track;
+
+- xxh->trk = *((uint16 *) buffer)++ + 1;
++ buffer = get_uint16_le_int(buffer, &xxh->trk);
++ xxh->trk++;
+
+ if (V (0))
+ report ("Stored tracks : %d ", xxh->trk);
+@@ -330,7 +359,7 @@
+
+ for (i = 1; i < xxh->trk; i++) {
+ /* Length of the track in bytes */
+- len = *((uint16 *) buffer)++;
++ buffer = get_uint16_le_int(buffer, &len);
+
+ memset (track, 0, sizeof (struct xxm_track) +
+ sizeof (struct xxm_event) * 256);
+@@ -449,7 +478,7 @@
+ xxih[i].rls = *(uint16 *)buffer;
+ L_ENDIAN32 (xxih[i].rls);
+ }
+- ((uint16 *)buffer)++;
++ buffer += sizeof(uint16);
+
+ xxi[i][j].vra = *buffer++;
+ xxi[i][j].vde = *buffer++;
+@@ -498,15 +527,12 @@
+ buffer += 32; /* Sample name */
+ buffer += 8; /* Sample filename */
+
+- c2spd[i] = *((uint32 *)buffer)++;
++ (void)memcpy(&c2spd[i], buffer, sizeof(c2spd[i]));
++ buffer += sizeof(c2spd[i]);
+
+- xxs[i].len = *((uint32 *)buffer)++;
+- xxs[i].lps = *((uint32 *)buffer)++;
+- xxs[i].lpe = *((uint32 *)buffer)++;
+-
+- L_ENDIAN32 (xxs[i].len);
+- L_ENDIAN32 (xxs[i].lps);
+- L_ENDIAN32 (xxs[i].lpe);
++ buffer = get_uint32_le_int(buffer, &xxs[i].len);
++ buffer = get_uint32_le_int(buffer, &xxs[i].lps);
++ buffer = get_uint32_le_int(buffer, &xxs[i].lpe);
+
+ xxs[i].flg = xxs[i].lpe > 0 ? WAVE_LOOPING : 0;
+ xxs[i].lpe = xxs[i].lps + xxs[i].lpe;
+@@ -579,16 +605,11 @@
+ buffer += 32; /* Sample name */
+ buffer += 8; /* Sample filename */
+
+- c2spd[i] = *((uint16 *)buffer)++;
+- L_ENDIAN16 (c2spd[i]);
++ buffer = get_uint16_le_int(buffer, &c2spd[i]);
+
+- xxs[i].len = *((uint32 *)buffer)++;
+- xxs[i].lps = *((uint32 *)buffer)++;
+- xxs[i].lpe = *((uint32 *)buffer)++;
+-
+- L_ENDIAN32 (xxs[i].len);
+- L_ENDIAN32 (xxs[i].lps);
+- L_ENDIAN32 (xxs[i].lpe);
++ buffer = get_uint32_le_int(buffer, &xxs[i].len);
++ buffer = get_uint32_le_int(buffer, &xxs[i].lps);
++ buffer = get_uint32_le_int(buffer, &xxs[i].lpe);
+
+ xxs[i].flg = xxs[i].lpe > 0 ? WAVE_LOOPING : 0;
+ xxs[i].lpe = xxs[i].lps + xxs[i].lpe;
+@@ -648,12 +669,12 @@
+ buffer += xxs[i].len;
+ break;
+ case 1:
+- len = *((uint32 *)buffer)++;
++ buffer = get_uint32_le_int(buffer, &len);
+ unpack_sample8 (smpbuf, buffer, xxs[i].len);
+ buffer += len;
+ break;
+ case 2:
+- len = *((uint32 *)buffer)++;
++ buffer = get_uint32_le_int(buffer, &len);
+ unpack_sample16 ((uint16 *)smpbuf, buffer, xxs[i].len >> 1);
+ buffer += len;
+ break;