port: restart currently playing MP3 when needed

there's probably a way to determine reset condition without adding an extra field to g_Mp3Vars, but I can't be arsed to figure it out
This commit is contained in:
fgsfds committed 2023-08-26 10:34:35 +02:00
1 parent 8494e29075
commit 844139b339
4 files changed
+13 -6

No files matched your search

+2 -2
View File
@@ -34,7 +34,7 @@ void aEnvMixerImpl(uint8_t flags, ENVMIX_STATE state, int16_t some_vol);
void aSetVolumeImpl(uint8_t flags, int16_t v, int16_t t, int16_t r); void aSetVolumeImpl(uint8_t flags, int16_t v, int16_t t, int16_t r);
void aPoleFilterImpl(uint8_t flags, int16_t gain, uint32_t t, uint32_t addr); void aPoleFilterImpl(uint8_t flags, int16_t gain, uint32_t t, uint32_t addr);
void aDisableImpl(uint16_t outp, uint32_t b, uint32_t c); void aDisableImpl(uint16_t outp, uint32_t b, uint32_t c);
void aPlayMP3Impl(const void *mp3file, u32 mp3size, void *out); void aPlayMP3Impl(const void *mp3file, u32 mp3size, void *out, int reset);
#define aDisable(pkt, o, b, c) aDisableImpl(o, b, c) #define aDisable(pkt, o, b, c) aDisableImpl(o, b, c)
#define aClearBuffer(pkt, d, c) aClearBufferImpl(d, c) #define aClearBuffer(pkt, d, c) aClearBufferImpl(d, c)
@@ -50,6 +50,6 @@ void aPlayMP3Impl(const void *mp3file, u32 mp3size, void *out);
#define aEnvMixer(pkt, f, t, s) aEnvMixerImpl(f, (void *)(s), t) #define aEnvMixer(pkt, f, t, s) aEnvMixerImpl(f, (void *)(s), t)
#define aSetVolume(pkt, f, v, t, r) aSetVolumeImpl(f, v, t, r) #define aSetVolume(pkt, f, v, t, r) aSetVolumeImpl(f, v, t, r)
#define aPoleFilter(pkt, f, g, t, s) aPoleFilterImpl(f, g, t, s) #define aPoleFilter(pkt, f, g, t, s) aPoleFilterImpl(f, g, t, s)
#define aPlayMP3(pkt, a, b, c) aPlayMP3Impl((void *)(a), b, (void *)(c)) #define aPlayMP3(pkt, a, b, c, r) aPlayMP3Impl((void *)(a), b, (void *)(c), r)
#endif #endif
+2 -2
View File
@@ -681,12 +681,12 @@ void aSetVolumeImpl(uint8_t flags, int16_t v, int16_t t, int16_t r) {
} }
} }
void aPlayMP3Impl(const void *mp3file, u32 mp3size, void *out) { void aPlayMP3Impl(const void *mp3file, u32 mp3size, void *out, int reset) {
static mp3dec_t mp3d; static mp3dec_t mp3d;
static const u8 *curdata = NULL; // pointer to the mp3 we're currently processing static const u8 *curdata = NULL; // pointer to the mp3 we're currently processing
static s32 dataptr = 0; // byte index into curdata static s32 dataptr = 0; // byte index into curdata
if (mp3file != curdata) { if (mp3file != curdata || reset) {
// new mp3, reinit decoder // new mp3, reinit decoder
mp3dec_init(&mp3d); mp3dec_init(&mp3d);
curdata = mp3file; curdata = mp3file;
+3
View File
@@ -5695,6 +5695,9 @@ struct mp3vars {
/*0x5e*/ s16 var8009c3ee; /*0x5e*/ s16 var8009c3ee;
/*0x60*/ u8 var8009c3f0; /*0x60*/ u8 var8009c3f0;
/*0x61*/ u8 var8009c3f1; /*0x61*/ u8 var8009c3f1;
#ifndef PLATFORM_N64
/*0x62*/ u8 reset;
#endif
}; };
struct rdptask { struct rdptask {
+6 -2
View File
@@ -31,7 +31,7 @@
#include "mixer.h" #include "mixer.h"
#define acmd07(pkt, a, b, c) aPlayMP3(pkt, a, b, c) #define acmd07(pkt, a, b, c, r) aPlayMP3(pkt, a, b, c, r)
#define acmd08(pkt, a) do { } while(0) #define acmd08(pkt, a) do { } while(0)
#endif #endif
@@ -100,6 +100,9 @@ void mp3PlayFile(s32 romaddr, s32 filesize)
g_Mp3Vars.var8009c3e8 = 0; g_Mp3Vars.var8009c3e8 = 0;
g_Mp3Vars.var8009c3e4 = 0x7fff; g_Mp3Vars.var8009c3e4 = 0x7fff;
g_Mp3Vars.var8009c3f0 = 5; g_Mp3Vars.var8009c3f0 = 5;
#ifndef PLATFORM_N64
g_Mp3Vars.reset = 1;
#endif
mp3Dma(); mp3Dma();
@@ -251,7 +254,8 @@ s32 func00037fc0(s32 arg0, Acmd **cmd)
acmd07((*cmd)++, g_Mp3Vars.var8009c3d8, osVirtualToPhysical(sp58)); acmd07((*cmd)++, g_Mp3Vars.var8009c3d8, osVirtualToPhysical(sp58));
#else #else
// hijack the command to pass the entirety of the mp3 data to the mixer // hijack the command to pass the entirety of the mp3 data to the mixer
acmd07((*cmd)++, g_Mp3Vars.romaddr, g_Mp3Vars.filesize, osVirtualToPhysical(sp58)); acmd07((*cmd)++, g_Mp3Vars.romaddr, g_Mp3Vars.filesize, osVirtualToPhysical(sp58), g_Mp3Vars.reset);
g_Mp3Vars.reset = 0;
#endif #endif
sp58++; sp58++;