summaryrefslogtreecommitdiffstats
path: root/apps/plugins/sdl/progs/wolf3d
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2019-07-09 17:34:09 -0400
committerFranklin Wei <git@fwei.tk>2019-07-09 17:34:09 -0400
commit152e415b0d0d11078578e3268776465ffc58871a (patch)
tree8c02b91f4c4bdc74878a90499efd0ed2774d281d /apps/plugins/sdl/progs/wolf3d
parentb1f16371b0c729ac12ff2cd654cd34a6121fa02a (diff)
downloadrockbox-152e415b0d0d11078578e3268776465ffc58871a.tar.gz
rockbox-152e415b0d0d11078578e3268776465ffc58871a.tar.bz2
rockbox-152e415b0d0d11078578e3268776465ffc58871a.zip
wolf3d: fix FM OPL alignment bug in a cleaner way
wl_def.h has a #pragma pack(1), which causes issues when we take the address of an unaligned struct field. This fixes the issue by disabling packing in fmopl_gpl.c. Change-Id: I526880fa73226e8028855896f7efc3a66571b3ec
Diffstat (limited to 'apps/plugins/sdl/progs/wolf3d')
-rw-r--r--apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c16
-rw-r--r--apps/plugins/sdl/progs/wolf3d/wl_def.h1
2 files changed, 8 insertions, 9 deletions
diff --git a/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c b/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c
index 41178d6bd9..9f0ce3aecd 100644
--- a/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c
+++ b/apps/plugins/sdl/progs/wolf3d/fmopl_gpl.c
@@ -82,7 +82,9 @@ verify volume of the FM part on the Y8950
#include "fmopl.h"
-
+// Don't pack structs in here. This causes dangerous things on ARM
+// regarding alignment.
+#pragma pack()
/* output final shift */
#if (OPL_SAMPLE_BITS==16)
@@ -207,8 +209,6 @@ static FILE * cymfile = NULL;
#define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
#define OPL_TYPE_Y8950 (OPL_TYPE_ADPCM|OPL_TYPE_KEYBOARD|OPL_TYPE_IO)
-
-
struct OPL_SLOT
{
UINT32 ar; /* attack rate: AR<<2 */
@@ -267,10 +267,6 @@ typedef struct OPL_CH OPL_CH;
/* OPL state */
struct FM_OPL
{
- // moved to beginning to fix alignment
- signed int phase_modulation __attribute__((aligned)); /* phase modulation input (SLOT 2) */
- signed int output[1] __attribute__((aligned));
-
/* FM channel slots */
OPL_CH P_CH[9]; /* OPL/OPL2 chips have 9 channels*/
@@ -326,7 +322,6 @@ struct FM_OPL
void *IRQParam; /* IRQ parameter */
OPL_UPDATEHANDLER UpdateHandler;/* stream update handler */
void *UpdateParam; /* stream update parameter */
-
UINT8 type; /* chip type */
UINT8 address; /* address register */
UINT8 status; /* status flag */
@@ -339,10 +334,13 @@ struct FM_OPL
double TimerBase; /* Timer base time (==sampling time)*/
device_t *device;
+ signed int phase_modulation; /* phase modulation input (SLOT 2) */
+ signed int output[1];
+
#if BUILD_Y8950
INT32 output_deltat[4]; /* for Y8950 DELTA-T, chip is mono, that 4 here is just for safety */
#endif
-} __attribute__((aligned));
+};
typedef struct FM_OPL FM_OPL;
diff --git a/apps/plugins/sdl/progs/wolf3d/wl_def.h b/apps/plugins/sdl/progs/wolf3d/wl_def.h
index 04bbb41bfb..1b8670ffb6 100644
--- a/apps/plugins/sdl/progs/wolf3d/wl_def.h
+++ b/apps/plugins/sdl/progs/wolf3d/wl_def.h
@@ -22,6 +22,7 @@
# define O_BINARY 0
#endif
+// needed by wolf, but is dangerous on ARM
#pragma pack(1)
#if defined(_arch_dreamcast)