port: add mp3 decoding via lieff/minimp3

This commit is contained in:
fgsfds 2023-08-06 21:24:38 +02:00
parent afae1a3aae
commit 2d6e6c887e
7 changed files with 1915 additions and 307 deletions

1865
port/include/minimp3.h Normal file

File diff suppressed because it is too large Load Diff

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 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 aPlayMP3Impl(uint32_t a, const void *b);
void aPlayMP3Impl(const void *mp3file, u32 mp3size, void *out);
#define aDisable(pkt, o, b, c) aDisableImpl(o, b, c)
#define aClearBuffer(pkt, d, c) aClearBufferImpl(d, c)
@ -50,6 +50,6 @@ void aPlayMP3Impl(uint32_t a, const void *b);
#define aEnvMixer(pkt, f, t, s) aEnvMixerImpl(f, s, t)
#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 aPlayMP3(pkt, a, b) aPlayMP3Impl(a, b)
#define aPlayMP3(pkt, a, b, c) aPlayMP3Impl(a, b, c)
#endif

View File

@ -1,10 +1,14 @@
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <ultra64.h>
#include "mixer.h"
#include "platform.h"
#define MINIMP3_IMPLEMENTATION
#include "minimp3.h"
#ifdef __SSE4_1__
#include <immintrin.h>
#define HAS_SSE41 1
@ -671,8 +675,36 @@ void aSetVolumeImpl(uint8_t flags, int16_t v, int16_t t, int16_t r) {
}
}
void aPlayMP3Impl(uint32_t a, const void *b) {
// TODO: maybe just hook this up to libmpg123 or something
void aPlayMP3Impl(const void *mp3file, u32 mp3size, void *out) {
static mp3dec_t mp3d;
static const u8 *curdata = NULL; // pointer to the mp3 we're currently processing
static s32 dataptr = 0; // byte index into curdata
if (mp3file != curdata) {
// new mp3, reinit decoder
mp3dec_init(&mp3d);
curdata = mp3file;
dataptr = 0;
}
// this command is supposed to write one full frame to out
// but which frame? we'll just decode sequentially, it'll probably work
if (dataptr < mp3size) {
// FIXME: decoding straight to out might bite us in the ass because it's only 1160 bytes
mp3dec_frame_info_t info;
const s32 samples = mp3dec_decode_frame(&mp3d, curdata + dataptr, mp3size - dataptr, out, &info);
// fill in the rest of the buffer if frame is smaller
const s32 diff = 580 - samples;
if (diff > 0) {
memset((s16 *)out + samples, 0, diff * 2);
} else {
assert(diff == 0);
}
dataptr += info.frame_bytes;
} else {
// empty frame
memset(out, 0, 580 * 2);
}
}
void aPoleFilterImpl(uint8_t flags, int16_t gain, uint32_t t, uint32_t addr) {

View File

@ -5903,7 +5903,11 @@ struct mp3thing {
};
struct mp3vars {
#ifdef PLATFORM_N64
/*0x00*/ s32 romaddr;
#else
/*0x00*/ uintptr_t romaddr;
#endif
/*0x04*/ struct asistream *var8009c394;
/*0x08*/ u8 *var8009c398;
/*0x0c*/ s16 var8009c39c;

View File

@ -31,7 +31,7 @@
#include "mixer.h"
#define acmd07(pkt, a, b) aPlayMP3(pkt, a, b)
#define acmd07(pkt, a, b, c) aPlayMP3(pkt, a, b, c)
#define acmd08(pkt, a) do { } while(0)
#endif
@ -247,7 +247,12 @@ s32 func00037fc0(s32 arg0, Acmd **cmd)
for (i = 0; i < sp5c; i++) {
acmd08((*cmd)++, osVirtualToPhysical(g_Mp3Vars.var8009c3d4[i]));
#ifdef PLATFORM_N64
acmd07((*cmd)++, g_Mp3Vars.var8009c3d8, osVirtualToPhysical(sp58));
#else
// hijack the command to pass the entirety of the mp3 data to the mixer
acmd07((*cmd)++, g_Mp3Vars.romaddr, g_Mp3Vars.filesize, osVirtualToPhysical(sp58));
#endif
sp58++;
}

View File

@ -192,308 +192,10 @@ s32 mp3util000464a8(u8 *arg0, s32 *arg1, s32 arg2, s32 arg3, s32 arg4, s16 **arg
void func00046650(struct asistream_4f64 *arg0, s32 arg1, struct asistream_4f64 *arg2, struct asistream_4f64 *arg3, void *arg4)
{
f32 fVar1;
f32 fVar2;
f32 fVar3;
f32 fVar4;
f32 fVar5;
f32 fVar6;
f32 fVar7;
f32 fVar8;
f32 fVar9;
f32 fVar10;
f32 fVar11;
f32 fVar12;
f32 fVar13;
f32 fVar14;
f32 fVar15;
f32 fVar16;
f32 fVar17;
f32 fVar18;
f32 fVar19;
f32 fVar20;
f32 fVar21;
f32 fVar22;
f32 fVar23;
f32 fVar24;
f32 fVar25;
f32 fVar26;
f32 fVar27;
// TODO: can't be arsed to figure out proper types for now
f32 *param1 = (f32 *)arg0;
f32 *param3 = (f32 *)arg2;
f32 *param4 = (f32 *)arg3;
f32 *param5 = (f32 *)arg4;
fVar17 = param1[0x10];
param1[0x10] = param1[0xf] + fVar17;
param1[0x11] = fVar17 + param1[0x11];
fVar17 = param1[0xe];
param1[0xe] = param1[0xd] + fVar17;
param1[0xf] = fVar17 + param1[0xf];
fVar17 = param1[0xc];
param1[0xc] = param1[0xb] + fVar17;
param1[0xd] = fVar17 + param1[0xd];
fVar17 = param1[10];
param1[10] = param1[9] + fVar17;
param1[0xb] = fVar17 + param1[0xb];
fVar17 = param1[8];
param1[8] = param1[7] + fVar17;
param1[9] = fVar17 + param1[9];
fVar17 = param1[6];
param1[6] = param1[5] + fVar17;
param1[7] = fVar17 + param1[7];
fVar17 = param1[4];
param1[4] = param1[3] + fVar17;
param1[5] = fVar17 + param1[5];
fVar17 = param1[2];
param1[2] = param1[1] + fVar17;
param1[3] = fVar17 + param1[3];
param1[1] = *param1 + param1[1];
fVar17 = param1[0xf];
param1[0xf] = param1[0xd] + fVar17;
param1[0x11] = fVar17 + param1[0x11];
fVar17 = param1[0xb];
param1[0xb] = param1[9] + fVar17;
param1[0xd] = fVar17 + param1[0xd];
fVar17 = param1[7];
param1[7] = param1[5] + fVar17;
param1[9] = fVar17 + param1[9];
fVar17 = param1[3];
param1[3] = param1[1] + fVar17;
param1[5] = fVar17 + param1[5];
fVar1 = *param1 + *param1;
fVar17 = fVar1 + param1[0xc];
fVar6 = param1[4] * 1.879385 + param1[8] * 1.532089 + param1[0x10] * 0.3472964 + fVar17;
fVar7 = param1[4] * -0.3472964 + param1[8] * -1.879385 + param1[0x10] * 1.532089 + fVar17;
fVar17 = param1[4] * -1.532089 + param1[8] * 0.3472964 + param1[0x10] * -1.879385 + fVar17;
fVar18 = param1[0xc];
fVar2 = ((((fVar1 + param1[4]) - param1[8]) - fVar18) - fVar18) - param1[0x10];
fVar3 = (((*param1 - param1[4]) + param1[8]) - fVar18) + param1[0x10];
fVar8 = param1[2] * 1.969615 + param1[10] * 1.285575 + param1[0xe] * 0.6840403 +
param1[6] * 1.732051;
fVar1 = -(param1[6] * 1.732051);
fVar9 = param1[2] * 1.285575 + param1[10] * -0.6840403 + param1[0xe] * 1.969615 + fVar1;
fVar1 = param1[2] * 0.6840403 + param1[10] * 1.969615 + param1[0xe] * -1.285575 + fVar1;
fVar10 = ((param1[2] - param1[10]) - param1[0xe]) * 1.732051;
fVar4 = param1[1] + param1[1];
fVar18 = fVar4 + param1[0xd];
fVar11 = param1[5] * 1.879385 + param1[9] * 1.532089 + param1[0x11] * 0.3472964 + fVar18;
fVar12 = param1[5] * -0.3472964 + param1[9] * -1.879385 + param1[0x11] * 1.532089 + fVar18;
fVar18 = param1[5] * -1.532089 + param1[9] * 0.3472964 + param1[0x11] * -1.879385 + fVar18;
fVar19 = param1[0xd];
fVar5 = ((((fVar4 + param1[5]) - param1[9]) - fVar19) - fVar19) - param1[0x11];
fVar13 = param1[3] * 1.969615 + param1[0xb] * 1.285575 + param1[0xf] * 0.6840403 +
param1[7] * 1.732051;
fVar4 = -(param1[7] * 1.732051);
fVar14 = param1[3] * 1.285575 + param1[0xb] * -0.6840403 + param1[0xf] * 1.969615 + fVar4;
fVar4 = param1[3] * 0.6840403 + param1[0xb] * 1.969615 + param1[0xf] * -1.285575 + fVar4;
fVar15 = ((param1[3] - param1[0xb]) - param1[0xf]) * 1.732051;
fVar16 = fVar6 + fVar8;
fVar20 = (fVar11 + fVar13) * 0.5019099;
fVar24 = (fVar16 + fVar20) * -0.2502382;
fVar16 = (fVar16 - fVar20) * -5.731396;
fVar20 = fVar2 + fVar10;
fVar21 = (fVar5 + fVar15) * 0.5176381;
fVar25 = (fVar20 + fVar21) * -0.2521572;
fVar20 = (fVar20 - fVar21) * -1.915324;
fVar21 = fVar7 + fVar9;
fVar22 = (fVar12 + fVar14) * 0.551689;
fVar26 = (fVar21 + fVar22) * -0.2560699;
fVar21 = (fVar21 - fVar22) * -1.155057;
fVar22 = fVar17 + fVar1;
fVar23 = (fVar18 + fVar4) * 0.6103873;
fVar27 = (fVar22 + fVar23) * -0.2621323;
fVar22 = (fVar22 - fVar23) * -0.8313774;
fVar17 = fVar17 - fVar1;
fVar1 = (fVar18 - fVar4) * 0.8717234;
fVar23 = (fVar17 + fVar1) * -0.2818455;
fVar17 = (fVar17 - fVar1) * -0.5414202;
fVar7 = fVar7 - fVar9;
fVar1 = (fVar12 - fVar14) * 1.183101;
fVar9 = (fVar7 + fVar1) * -0.2964223;
fVar1 = (fVar7 - fVar1) * -0.4652897;
fVar2 = fVar2 - fVar10;
fVar18 = (fVar5 - fVar15) * 1.931852;
fVar10 = (fVar2 + fVar18) * -0.3151181;
fVar18 = (fVar2 - fVar18) * -0.4106699;
fVar6 = fVar6 - fVar8;
fVar4 = (fVar11 - fVar13) * 5.736856;
fVar8 = (fVar6 + fVar4) * -0.3390854;
fVar4 = (fVar6 - fVar4) * -0.3700468;
fVar2 = ((((param1[1] - param1[5]) + param1[9]) - fVar19) + param1[0x11]) * 0.7071068;
fVar5 = (fVar3 + fVar2) * -0.5411961;
fVar2 = (fVar3 - fVar2) * -1.306563;
if ((arg1 & 1) == 0) {
*param3 = -fVar4 * *param5 + *param4;
param3[1] = -fVar18 * param5[1] + param4[1];
param3[2] = -fVar1 * param5[2] + param4[2];
param3[3] = -fVar17 * param5[3] + param4[3];
param3[4] = -fVar2 * param5[4] + param4[4];
param3[5] = -fVar22 * param5[5] + param4[5];
param3[6] = -fVar21 * param5[6] + param4[6];
param3[7] = -fVar20 * param5[7] + param4[7];
param3[8] = -fVar16 * param5[8] + param4[8];
param3[9] = fVar16 * param5[9] + param4[9];
param3[10] = fVar20 * param5[10] + param4[10];
param3[0xb] = fVar21 * param5[0xb] + param4[0xb];
param3[0xc] = fVar22 * param5[0xc] + param4[0xc];
param3[0xd] = fVar2 * param5[0xd] + param4[0xd];
param3[0xe] = fVar17 * param5[0xe] + param4[0xe];
param3[0xf] = fVar1 * param5[0xf] + param4[0xf];
param3[0x10] = fVar18 * param5[0x10] + param4[0x10];
param3[0x11] = fVar4 * param5[0x11] + param4[0x11];
} else {
*param3 = -fVar4 * *param5 + *param4;
param3[1] = fVar18 * param5[1] - param4[1];
param3[2] = -fVar1 * param5[2] + param4[2];
param3[3] = fVar17 * param5[3] - param4[3];
param3[4] = -fVar2 * param5[4] + param4[4];
param3[5] = fVar22 * param5[5] - param4[5];
param3[6] = -fVar21 * param5[6] + param4[6];
param3[7] = fVar20 * param5[7] - param4[7];
param3[8] = -fVar16 * param5[8] + param4[8];
param3[9] = -fVar16 * param5[9] - param4[9];
param3[10] = fVar20 * param5[10] + param4[10];
param3[0xb] = -fVar21 * param5[0xb] - param4[0xb];
param3[0xc] = fVar22 * param5[0xc] + param4[0xc];
param3[0xd] = -fVar2 * param5[0xd] - param4[0xd];
param3[0xe] = fVar17 * param5[0xe] + param4[0xe];
param3[0xf] = -fVar1 * param5[0xf] - param4[0xf];
param3[0x10] = fVar18 * param5[0x10] + param4[0x10];
param3[0x11] = -fVar4 * param5[0x11] - param4[0x11];
}
fVar17 = param5[0x13];
*param4 = fVar8 * param5[0x12];
param4[1] = fVar10 * fVar17;
fVar17 = param5[0x15];
param4[2] = fVar9 * param5[0x14];
param4[3] = fVar23 * fVar17;
fVar17 = param5[0x17];
param4[4] = fVar5 * param5[0x16];
param4[5] = fVar27 * fVar17;
fVar17 = param5[0x19];
param4[6] = fVar26 * param5[0x18];
param4[7] = fVar25 * fVar17;
fVar17 = param5[0x1b];
param4[8] = fVar24 * param5[0x1a];
param4[9] = fVar24 * fVar17;
fVar17 = param5[0x1d];
param4[10] = fVar25 * param5[0x1c];
param4[0xb] = fVar26 * fVar17;
fVar17 = param5[0x1f];
param4[0xc] = fVar27 * param5[0x1e];
param4[0xd] = fVar5 * fVar17;
fVar17 = param5[0x21];
param4[0xe] = fVar23 * param5[0x20];
param4[0xf] = fVar9 * fVar17;
fVar17 = param5[0x23];
param4[0x10] = fVar10 * param5[0x22];
param4[0x11] = fVar8 * fVar17;
}
void func00047550(struct asistream_4f64 *arg0, s32 arg1, struct asistream_4f64 *arg2, struct asistream_4f64 *arg3)
{
f32 *pfVar1;
f32 *pfVar2;
s32 iVar3;
f32 fVar4;
f32 fVar5;
f32 fVar6;
f32 fVar7;
f32 fVar8;
f32 fVar9;
f32 fVar10;
f32 fVar11;
f32 fVar12;
f32 locald0[52];
// TODO: can't be arsed to figure out proper types
f32 *param1 = (f32 *)arg0;
f32 *param3 = (f32 *)arg2;
f32 *param4 = (f32 *)arg3;
pfVar1 = locald0;
for (s32 i = 0; i < ARRAYCOUNT(locald0); i += 4) {
pfVar1[0] = 0.0;
pfVar1[1] = 0.0;
pfVar1[2] = 0.0;
pfVar1[3] = 0.0;
pfVar1 = pfVar1 + 4;
}
pfVar2 = locald0 + 0x10;
iVar3 = 3;
pfVar1 = pfVar2;
do {
param1[5] = param1[5] + param1[4];
param1[4] = param1[4] + param1[3];
param1[3] = param1[3] + param1[2];
param1[2] = param1[2] + param1[1];
param1[1] = param1[1] + *param1;
param1[5] = param1[5] + param1[3];
param1[3] = param1[3] + param1[1];
fVar11 = *param1 + param1[4] * 0.5;
fVar4 = *param1 - param1[4];
fVar5 = fVar11 + param1[2] * 0.8660254;
fVar11 = fVar11 - param1[2] * 0.8660254;
fVar12 = param1[1] + param1[5] * 0.5;
fVar6 = (fVar12 - param1[3] * 0.8660254) * 1.931852;
fVar9 = (param1[1] - param1[5]) * 0.7071068;
fVar12 = (fVar12 + param1[3] * 0.8660254) * 0.5176381;
fVar7 = (fVar5 + fVar12) * 0.5043145;
fVar10 = (fVar4 + fVar9) * 0.5411961;
fVar8 = (fVar11 + fVar6) * 0.6302362;
fVar4 = (fVar4 - fVar9) * 1.306563;
fVar12 = (fVar5 - fVar12) * 3.830649;
fVar5 = (fVar11 - fVar6) * 0.8213398 * 1.0;
pfVar1[6] = pfVar1[6] + fVar5 * 0.1305262;
pfVar1[7] = pfVar1[7] + fVar4 * 0.3826834;
pfVar1[8] = pfVar1[8] + fVar12 * 0.6087614;
pfVar1[9] = pfVar1[9] + fVar12 * -0.7933533;
pfVar1[10] = pfVar1[10] + fVar4 * -0.9238795;
pfVar1[0xb] = pfVar1[0xb] + fVar5 * -0.9914449;
pfVar1[0xc] = pfVar1[0xc] + fVar8 * -0.9914449;
pfVar1[0xd] = pfVar1[0xd] + fVar10 * -0.9238795;
pfVar1[0xe] = pfVar1[0xe] + fVar7 * -0.7933533;
pfVar1[0xf] = pfVar1[0xf] + fVar7 * -0.6087614;
pfVar1[0x10] = pfVar1[0x10] + fVar10 * -0.3826834;
pfVar1[0x11] = pfVar1[0x11] + fVar8 * -0.1305262;
param1 = param1 + 6;
pfVar1 = pfVar1 + 6;
iVar3 = iVar3 + -1;
} while (iVar3 != 0);
if ((arg1 & 1) == 0) {
iVar3 = 0x12;
pfVar1 = param4;
do {
*param3 = *pfVar2 + *pfVar1;
param3 = param3 + 1;
pfVar1 = pfVar1 + 1;
pfVar2 = pfVar2 + 1;
iVar3 = iVar3 + -1;
} while (iVar3 != 0);
} else {
iVar3 = 9;
pfVar1 = param4;
do {
fVar4 = pfVar2[1];
fVar5 = pfVar1[1];
*param3 = *pfVar2 + *pfVar1;
param3[1] = -fVar4 - fVar5;
param3 = param3 + 2;
pfVar1 = pfVar1 + 2;
pfVar2 = pfVar2 + 2;
iVar3 = iVar3 + -1;
} while (iVar3 != 0);
}
pfVar1 = locald0 + 0x22;
iVar3 = 0x12;
do {
*param4 = *pfVar1;
param4 = param4 + 1;
pfVar1 = pfVar1 + 1;
iVar3 = iVar3 + -1;
} while (iVar3 != 0);
}

View File

@ -52,7 +52,11 @@ struct curmp3 {
s32 prevwhisper;
s32 prevacknowledge;
s32 prevgreeting;
#ifdef PLATFORM_N64
u32 romaddr;
#else
uintptr_t romaddr;
#endif
u32 romsize;
s32 responsetype;
};
@ -1463,11 +1467,7 @@ void sndInit(void)
g_SndMp3Enabled = false;
} else {
#ifdef PLATFORM_N64
g_SndMp3Enabled = true;
#else
g_SndMp3Enabled = false; // TODO
#endif
g_SndMaxFxBusses = 2;
if (argFindByPrefix(1, "-nomp3")) {