// // sub_51A54 from 0x51a54 to 0x51de4 (912 bytes) // // 2 xrefs: // > sub_51EF4 @ 0x51f34 // > sub_51EF4 @ 0x51f3c // // This function is hookable on this platform! // // Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA // Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings // __int64 __fastcall sub_51A54(__int64 a1) { _QWORD *v2; // x8 _QWORD *v3; // x10 __int64 v4; // x0 __int64 v5; // x19 unsigned int v6; // w9 _QWORD *v7; // x8 int v8; // w20 unsigned int v9; // w8 __int64 v10; // x21 unsigned int *v11; // x8 __int16 v12; // w9 unsigned int v13; // w8 char v14; // w8 int v15; // w0 __int64 v16; // x8 __int64 v17; // x0 unsigned int v18; // w8 __int64 v19; // x1 __int64 v20; // x9 __int64 v21; // x8 __int64 v22; // x8 __int64 v23; // x9 __int64 v24; // x0 __int64 v25; // x9 unsigned int v26; // w8 __int64 v27; // x8 __int64 v28; // x9 __int64 result; // x0 __int64 v30; // x9 __int64 v31; // [xsp+8h] [xbp-38h] BYREF int v32; // [xsp+10h] [xbp-30h] char v33; // [xsp+14h] [xbp-2Ch] __int64 v34; // [xsp+18h] [xbp-28h] v34 = 0; FMOD_OS_CriticalSection_Enter(*(_QWORD *)(a1 + 360)); v2 = *(_QWORD **)(a1 + 336); if ( v2 == (_QWORD *)(a1 + 336) ) { FMOD_OS_CriticalSection_Leave(*(_QWORD *)(a1 + 360)); return 0; } v3 = (_QWORD *)v2[1]; v34 = v2[2]; *v3 = *v2; *(_QWORD *)(*v2 + 8LL) = v3; *v2 = v2; v2[1] = v2; v4 = FMOD_OS_CriticalSection_Leave(*(_QWORD *)(a1 + 360)); if ( !v34 ) return 0; v5 = *(_QWORD *)(v34 + 216); v6 = atomic_load((unsigned int *)(v34 + 272)); if ( v6 != 1 ) { v9 = atomic_load((unsigned int *)(v34 + 272)); v10 = v34; if ( v9 == 7 ) { while ( 1 ) { v11 = (unsigned int *)(v34 + 88); v12 = atomic_load((unsigned int *)(v34 + 88)); if ( (v12 & 0x440) != 0 ) break; FMOD_OS_Time_Sleep(10); } v14 = atomic_load(v11); if ( (v14 & 0x40) == 0 ) { v15 = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, __int64))(**(_QWORD **)(v34 + 376) + 216LL))( *(_QWORD *)(v34 + 376), *(unsigned int *)(*(_QWORD *)(v34 + 264) + 284LL), *(unsigned int *)(*(_QWORD *)(v34 + 264) + 288LL), 1); v16 = *(_QWORD *)(v34 + 216); v8 = v15; v33 = 0; v31 = v16; v32 = 8; sub_520A0(&v31); v17 = *(_QWORD *)(v10 + 376); v18 = *(_DWORD *)(v17 + 60); *(_DWORD *)(v17 + 60) = v18 & 0xFFFFBFFF; if ( v8 != 30 ) { if ( v8 ) { LABEL_21: sub_51F94(&v31); goto LABEL_29; } if ( *(_QWORD *)(v17 + 192) ) (*(void (__fastcall **)(__int64, _QWORD))(*(_QWORD *)v17 + 88LL))(v17, (v18 >> 5) & 1); } v8 = 0; goto LABEL_21; } v21 = *(_QWORD *)(v34 + 216); v33 = 0; v32 = 8; v31 = v21; sub_520A0(&v31); *(_DWORD *)(*(_QWORD *)(v10 + 376) + 60LL) &= ~0x4000u; sub_51F94(&v31); } else { v13 = atomic_load((unsigned int *)(v34 + 272)); if ( v13 == 5 ) { v8 = sub_68A84(v34, *(unsigned int *)(v34 + 192)); if ( !v8 ) { v8 = sub_66E18(v34, 0, 2); if ( !v8 ) v8 = sub_66D84(v34); } goto LABEL_29; } } LABEL_28: v8 = 0; goto LABEL_29; } v7 = *(_QWORD **)(v34 + 264); if ( (*(_DWORD *)(v34 + 44) & 0x10000800) != 0 ) { v8 = sub_52128(v4, v7[6]); if ( v8 ) goto LABEL_29; LABEL_25: v20 = *(_QWORD *)(v34 + 264); if ( *(_BYTE *)(v20 + 280) ) { v8 = 0; *(_QWORD *)(v34 + 200) = *(_QWORD *)(v20 + 160); goto LABEL_29; } goto LABEL_28; } v8 = sub_52128(v4, *v7); v19 = **(_QWORD **)(v34 + 264); if ( v19 ) { sub_E2D74(*(__int64 *)((char *)&qword_1B0 + (_QWORD)off_114000), v19, "../../src/fmod_async.cpp", 205, 1); **(_QWORD **)(v34 + 264) = 0; } if ( !v8 ) goto LABEL_25; LABEL_29: v22 = v34; *(_DWORD *)(*(_QWORD *)(v34 + 264) + 292LL) = v8; v23 = *(_QWORD *)(v22 + 184); if ( v23 ) *(_BYTE *)(v23 + 92) = 1; *(_BYTE *)(v22 + 92) = 1; atomic_store(2 * (v8 != 0), (unsigned int *)(v22 + 272)); v24 = v34; if ( *(_QWORD *)(v34 + 184) ) { sub_52148(); v24 = v34; } if ( *(_QWORD *)(v24 + 168) ) { sub_52148(); } else if ( ((**(__int64 (__fastcall ***)(__int64))v24)(v24) & 1) != 0 && *(_DWORD *)(v34 + 176) == 1 ) { v25 = **(_QWORD **)(v34 + 160); if ( v25 ) { v26 = atomic_load((unsigned int *)(v34 + 272)); atomic_store(v26, (unsigned int *)(v25 + 272)); } } v27 = v34; v28 = *(_QWORD *)(v34 + 264); if ( !*(_BYTE *)(v28 + 280) || !*(_QWORD *)(v28 + 128) ) { LABEL_44: v30 = *(_QWORD *)(v27 + 184); *(_BYTE *)(v27 + 92) = 0; if ( v30 ) { *(_BYTE *)(v30 + 92) = 0; return 0; } return 0; } result = sub_7BA10(v5, 1); if ( !(_DWORD)result ) { (*(void (**)(void))(*(_QWORD *)(v34 + 264) + 128LL))(); result = sub_7BAA0(v5); if ( !(_DWORD)result ) { v27 = v34; goto LABEL_44; } } return result; }