5 Commits

Author SHA1 Message Date
Ethan Lee 9adb0552ff Network: Update to latest Steamworks SDK ABI.
This is mostly to support AArch64.
2026-07-15 10:13:26 -04:00
Ethan Lee ed795ea457 CMake: Rework Linux RPATH generation.
This is mostly to fix the AArch64 rpath. i686 will be different after this
change, but I haven't been shipping that architecture for a while now...

Also, took out BIN_LIBROOT which wasn't doing anything, woops!
2026-07-15 10:08:07 -04:00
Sönke Holz be29c31511 Correctly calculate FAudio block alignment
This fixes music playback on FAudio 26.01.

FAudio 26.01 added bounds checks to FAudioSourceVoice_SubmitSourceBuffer
in 033498ab08f5a1349ed5723a47aaa87163654be6.

The calculation of nBlockAlign is currently incorrect. nBlockAlign is
set to the block size in bits, not in bytes, causing this new bounds
check to trip.

Similarly, the wav_length for sound effects is in bytes.
2026-05-05 17:20:42 -04:00
Ethan Lee 1099a9ee8e Update to FAudio 26.05 2026-05-05 16:51:32 -04:00
NyakoFox 08c3590a0a Fix audio buffer issues on some platforms
On certain ports of the game, and possibly some Linux distros, the
game's audio would crackle, or slow down with loud buzzing. This commit
attempts to fix that, by enabling `FAUDIO_1024_QUANTUM`, which should
increase the internal FAudio buffer size.
2026-04-30 17:07:58 -04:00
4 changed files with 27 additions and 20 deletions
+8 -7
View File
@@ -49,15 +49,16 @@ endif()
# RPATH # RPATH
if(NOT WIN32) if(NOT WIN32)
if(APPLE) if(APPLE)
set(BIN_LIBROOT "osx")
set(BIN_RPATH "@executable_path/osx") set(BIN_RPATH "@executable_path/osx")
elseif(CMAKE_SIZEOF_VOID_P MATCHES "8")
set(BIN_LIBROOT "lib64")
set(BIN_RPATH "\$ORIGIN/lib64")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags")
else() else()
set(BIN_LIBROOT "lib") SET(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,--disable-new-dtags")
set(BIN_RPATH "\$ORIGIN/lib")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
# Naming quirk for backward compatibility
SET(BIN_RPATH "\$ORIGIN/lib64")
else()
SET(BIN_RPATH "\$ORIGIN/lib${CMAKE_SYSTEM_PROCESSOR}")
endif()
endif() endif()
set(CMAKE_SKIP_BUILD_RPATH TRUE) set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
+6 -6
View File
@@ -134,7 +134,7 @@ public:
format.nSamplesPerSec = spec.freq; format.nSamplesPerSec = spec.freq;
format.wFormatTag = FAUDIO_FORMAT_PCM; format.wFormatTag = FAUDIO_FORMAT_PCM;
format.wBitsPerSample = SDL_AUDIO_BITSIZE(spec.format); format.wBitsPerSample = SDL_AUDIO_BITSIZE(spec.format);
format.nBlockAlign = format.nChannels * format.wBitsPerSample; format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0; format.cbSize = 0;
valid = true; valid = true;
@@ -158,7 +158,7 @@ end:
format.wBitsPerSample = sizeof(float) * 8; format.wBitsPerSample = sizeof(float) * 8;
format.nChannels = vorbis_info.channels; format.nChannels = vorbis_info.channels;
format.nSamplesPerSec = vorbis_info.sample_rate; format.nSamplesPerSec = vorbis_info.sample_rate;
format.nBlockAlign = format.nChannels * format.wBitsPerSample; format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0; format.cbSize = 0;
@@ -210,7 +210,7 @@ end:
} }
FAudioBuffer faudio_buffer = { FAudioBuffer faudio_buffer = {
FAUDIO_END_OF_STREAM, /* Flags */ FAUDIO_END_OF_STREAM, /* Flags */
wav_length * 8, /* AudioBytes */ wav_length, /* AudioBytes */
wav_buffer, /* AudioData */ wav_buffer, /* AudioData */
0, /* playbegin */ 0, /* playbegin */
0, /* playlength */ 0, /* playlength */
@@ -262,7 +262,7 @@ end:
format.nSamplesPerSec = audio_rate; format.nSamplesPerSec = audio_rate;
format.wFormatTag = FAUDIO_FORMAT_PCM; format.wFormatTag = FAUDIO_FORMAT_PCM;
format.wBitsPerSample = 16; format.wBitsPerSample = 16;
format.nBlockAlign = format.nChannels * format.wBitsPerSample; format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0; format.cbSize = 0;
voice_formats[i] = format; voice_formats[i] = format;
@@ -392,7 +392,7 @@ public:
format.wBitsPerSample = sizeof(float) * 8; format.wBitsPerSample = sizeof(float) * 8;
format.nChannels = vorbis_info.channels; format.nChannels = vorbis_info.channels;
format.nSamplesPerSec = vorbis_info.sample_rate; format.nSamplesPerSec = vorbis_info.sample_rate;
format.nBlockAlign = format.nChannels * format.wBitsPerSample; format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
format.cbSize = 0; format.cbSize = 0;
@@ -731,7 +731,7 @@ musicclass::musicclass(void)
void musicclass::init(void) void musicclass::init(void)
{ {
if (FAudioCreate(&faudioctx, 0, FAUDIO_DEFAULT_PROCESSOR)) if (FAudioCreate(&faudioctx, FAUDIO_1024_QUANTUM, FAUDIO_DEFAULT_PROCESSOR))
{ {
vlog_error("Unable to initialize FAudio"); vlog_error("Unable to initialize FAudio");
return; return;
+12 -6
View File
@@ -10,8 +10,8 @@
/* Steamworks interface versions */ /* Steamworks interface versions */
#define VVVVVV_STEAMCLIENT "SteamClient017" #define VVVVVV_STEAMCLIENT "SteamClient023"
#define VVVVVV_STEAMUSERSTATS "STEAMUSERSTATS_INTERFACE_VERSION011" #define VVVVVV_STEAMUSERSTATS "STEAMUSERSTATS_INTERFACE_VERSION013"
#define VVVVVV_STEAMSCREENSHOTS "STEAMSCREENSHOTS_INTERFACE_VERSION003" #define VVVVVV_STEAMSCREENSHOTS "STEAMSCREENSHOTS_INTERFACE_VERSION003"
/* Shared object file name */ /* Shared object file name */
@@ -45,8 +45,16 @@ struct SteamAPICallCompleted_t
uint32_t m_cubParam; uint32_t m_cubParam;
}; };
typedef enum ESteamAPIInitResult
{
k_ESteamAPIInitResult_OK = 0,
k_ESteamAPIInitResult_FailedGeneric = 1,
k_ESteamAPIInitResult_NoSteamClient = 2,
k_ESteamAPIInitResult_VersionMismatch = 3,
} ESteamAPIInitResult;
#define FUNC_LIST \ #define FUNC_LIST \
FOREACH_FUNC(uint8_t, SteamAPI_Init, (void)) \ FOREACH_FUNC(ESteamAPIInitResult, SteamAPI_InitFlat, (void*)) \
FOREACH_FUNC(void, SteamAPI_Shutdown, (void)) \ FOREACH_FUNC(void, SteamAPI_Shutdown, (void)) \
FOREACH_FUNC(void, SteamAPI_RunCallbacks, (void)) \ FOREACH_FUNC(void, SteamAPI_RunCallbacks, (void)) \
FOREACH_FUNC(struct ISteamClient*, SteamInternal_CreateInterface, (const char*)) \ FOREACH_FUNC(struct ISteamClient*, SteamInternal_CreateInterface, (const char*)) \
@@ -58,7 +66,6 @@ struct SteamAPICallCompleted_t
int32_t, \ int32_t, \
const char* \ const char* \
)) \ )) \
FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_RequestCurrentStats, (struct ISteamUserStats*)) \
FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_StoreStats, (struct ISteamUserStats*)) \ FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_StoreStats, (struct ISteamUserStats*)) \
FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_SetAchievement, ( \ FOREACH_FUNC(uint8_t, SteamAPI_ISteamUserStats_SetAchievement, ( \
struct ISteamUserStats*, \ struct ISteamUserStats*, \
@@ -177,7 +184,7 @@ int32_t STEAM_init(void)
FUNC_LIST FUNC_LIST
#undef FOREACH_FUNC #undef FOREACH_FUNC
if (!SteamAPI_Init()) if (SteamAPI_InitFlat(NULL) != k_ESteamAPIInitResult_OK)
{ {
vlog_error("Steamworks not initialized!"); vlog_error("Steamworks not initialized!");
ClearPointers(); ClearPointers();
@@ -207,7 +214,6 @@ int32_t STEAM_init(void)
ClearPointers(); ClearPointers();
return 0; return 0;
} }
SteamAPI_ISteamUserStats_RequestCurrentStats(steamUserStats);
steamScreenshots = SteamAPI_ISteamClient_GetISteamScreenshots( steamScreenshots = SteamAPI_ISteamClient_GetISteamScreenshots(
steamClient, steamClient,
steamUser, steamUser,