diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | source/globals.cpp | 7 | ||||
-rw-r--r-- | source/nds/draw.c | 6 | ||||
-rw-r--r-- | source/nds/entry.cpp | 44 | ||||
-rw-r--r-- | source/soundux.h | 7 |
5 files changed, 23 insertions, 43 deletions
@@ -70,7 +70,7 @@ DEFS := -DSPC700_C -DEXECUTE_SUPERFX_PER_LINE -DSDD1_DECOMP \ -DVAR_CYCLES -DCPU_SHUTDOWN -DSPC700_SHUTDOWN \
-DNO_INLINE_SET_GET -DNOASM -DHAVE_MKSTEMP '-DACCEPT_SIZE_T=size_t' \
-DUNZIP_SUPPORT -DFOREVER_16_BIT_SOUND -DFOREVER_STEREO \
- -DFOREVER_FORWARD_STEREO -DSYNC_JOYPAD_AT_HBLANK
+ -DFOREVER_FORWARD_STEREO -DNO_VOLATILE_SOUND -DSYNC_JOYPAD_AT_HBLANK
.PHONY: clean makedirs
.SUFFIXES: .elf .dat .plg
diff --git a/source/globals.cpp b/source/globals.cpp index a4efb46..d24816b 100644 --- a/source/globals.cpp +++ b/source/globals.cpp @@ -216,7 +216,14 @@ uint32 current_graphic_format = RGB565; struct SCheatData Cheat; +// Define NO_VOLATILE_SOUND if you're always reading or writing sound from one +// thread or one co-routine. If you're using interrupts or a thread, sound must +// be volatile. +#ifndef NO_VOLATILE_SOUND volatile SoundStatus so; +#else +SoundStatus so; +#endif int Echo [24000]; int DummyEchoBuffer [SOUND_BUFFER_SIZE]; diff --git a/source/nds/draw.c b/source/nds/draw.c index b6916a3..4eb45c2 100644 --- a/source/nds/draw.c +++ b/source/nds/draw.c @@ -142,7 +142,7 @@ void drawhline(void* screen_addr, u32 sx, u32 ex, u32 y, u32 color) { u32 x; u32 width = (ex - sx) + 1; - volatile u16 *dst = VRAM_POS(screen_addr, sx, y); + u16 *dst = VRAM_POS(screen_addr, sx, y); for (x = 0; x < width; x++) *dst++ = (u16)color; @@ -155,7 +155,7 @@ void drawvline(void* screen_addr, u32 x, u32 sy, u32 ey, u32 color) { int y; int height = (ey - sy) + 1; - volatile u16 *dst = VRAM_POS(screen_addr, x, sy); + u16 *dst = VRAM_POS(screen_addr, x, sy); for (y = 0; y < height; y++) { @@ -183,7 +183,7 @@ void drawboxfill(void* screen_addr, u32 sx, u32 sy, u32 ex, u32 ey, u32 color) u32 x, y; u32 width = (ex - sx) + 1; u32 height = (ey - sy) + 1; - volatile u16 *dst = VRAM_POS(screen_addr, sx, sy); + u16 *dst = VRAM_POS(screen_addr, sx, sy); for (y = 0; y < height; y++) { diff --git a/source/nds/entry.cpp b/source/nds/entry.cpp index 1fb5bd8..8cd5c06 100644 --- a/source/nds/entry.cpp +++ b/source/nds/entry.cpp @@ -34,10 +34,6 @@ static u8 Buf[MAX_BUFFER_SIZE]; #define FIXED_POINT_SHIFT 16 #define FIXED_POINT_REMAINDER 0xffff -static volatile bool8 block_signal = FALSE; -static volatile bool8 pending_signal = FALSE; -static volatile bool8 DelayingForEarlyFrame = FALSE; - void S9xMessage (int /*type*/, int /*number*/, const char *message) { #if 1 @@ -677,12 +673,10 @@ void S9xSyncSpeed () else // Early { skip_rate = 0; - DelayingForEarlyFrame = TRUE; ds2_setCPUclocklevel(0); if (syncdif > 0) udelay(syncdif * 128 / 3 /* times 42 + 2/3 microseconds */); set_cpu_clock(clock_speed_number); - DelayingForEarlyFrame = FALSE; S9xProcessSound (0); IPPU.RenderThisFrame = TRUE; @@ -712,11 +706,9 @@ void S9xSyncSpeed () syncdif = sync_next - syncnow; if (syncdif > 0) { - DelayingForEarlyFrame = TRUE; ds2_setCPUclocklevel(0); udelay(syncdif * 128 / 3 /* times 42 + 2/3 microseconds */); set_cpu_clock(clock_speed_number); - DelayingForEarlyFrame = FALSE; S9xProcessSound (0); // After that little delay, what time is it? syncnow = getSysTime(); @@ -846,8 +838,6 @@ bool8 S9xOpenSoundDevice (int mode, bool8 stereo, int buffer_size) void S9xGenerateSound () { - block_signal = TRUE; - #ifndef FOREVER_16_BIT_SOUND int bytes_so_far = so.sixteen_bit ? (so.samples_mixed_so_far << 1) : so.samples_mixed_so_far; @@ -856,7 +846,7 @@ void S9xGenerateSound () #endif if (bytes_so_far >= so.buffer_size) - goto end; + return; so.err_counter += so.err_rate; if (so.err_counter >= FIXED_POINT) @@ -909,37 +899,17 @@ void S9xGenerateSound () byte_offset = (byte_offset + bytes_this_run) & SOUND_BUFFER_SIZE_MASK; } while (samples_to_write > 0); } - -end: - - if (pending_signal) - { - block_signal = FALSE; - pending_signal = FALSE; - S9xProcessSound (0); - } - else - block_signal = FALSE; } void S9xProcessSound (unsigned int) { - if (DelayingForEarlyFrame) - set_cpu_clock(clock_speed_number); - - if (block_signal) - { - pending_signal = TRUE; - goto end; - } - unsigned short *audiobuff; - if (Settings.Paused || so.mute_sound || !game_enable_audio) - goto end; + if (so.mute_sound || !game_enable_audio) + return; if(ds2_checkAudiobuff() > 4) - goto end; + return; /* Number of samples to generate now */ int sample_count; @@ -959,7 +929,7 @@ void S9xProcessSound (unsigned int) audiobuff = (unsigned short*)ds2_getAudiobuff(); if(NULL == audiobuff) //There are audio queue in sending or wait to send { - goto end; + return; } /* If we need more audio samples */ @@ -1075,10 +1045,6 @@ void S9xProcessSound (unsigned int) } so.samples_mixed_so_far -= sample_count; - -end: - if (DelayingForEarlyFrame) - ds2_setCPUclocklevel(0); } /* diff --git a/source/soundux.h b/source/soundux.h index ad8cba1..8fb8396 100644 --- a/source/soundux.h +++ b/source/soundux.h @@ -144,7 +144,14 @@ typedef struct { uint32 err_rate; } SoundStatus; +// Define NO_VOLATILE_SOUND if you're always reading or writing sound from one +// thread or one co-routine. If you're using interrupts or a thread, sound must +// be volatile. +#ifndef NO_VOLATILE_SOUND EXTERN_C volatile SoundStatus so; +#else +EXTERN_C SoundStatus so; +#endif typedef struct { int state; |