audio: Prefer Pipewire if at least version 1.0.0

Checking for the pipewire-pulse service is unreliable when used in containers such as Flatpak, so simply use a minimum version check instead and prefer it over the Pulseaudio backend if at least version 1.0.0.
This commit is contained in:
Frank Praznik
2024-04-15 12:36:01 -04:00
committed by Ryan C. Gordon
parent 2c183c602d
commit b1e47704ee
3 changed files with 19 additions and 91 deletions

View File

@@ -31,15 +31,6 @@
#include "../../core/linux/SDL_dbus.h"
static SDL_bool CheckPipewirePulseService()
{
#ifdef SDL_USE_LIBDBUS
return SDL_DBus_QuerySystemdUnitRunning("pipewire-pulse.service", SDL_TRUE);
#else
return SDL_FALSE;
#endif
}
/*
* The following keys are defined for compatibility when building against older versions of Pipewire
* prior to their introduction and can be removed if the minimum required Pipewire build version is
@@ -221,7 +212,7 @@ static SDL_bool pipewire_version_at_least(int major, int minor, int patch)
(pipewire_version_major > major || pipewire_version_minor > minor || pipewire_version_patch >= patch);
}
static int init_pipewire_library(void)
static int init_pipewire_library(int major, int minor, int patch)
{
if (!load_pipewire_library()) {
if (!load_pipewire_syms()) {
@@ -232,8 +223,7 @@ static int init_pipewire_library(void)
return -1;
}
// SDL can build against 0.3.20, but requires 0.3.24
if (pipewire_version_at_least(0, 3, 24)) {
if (pipewire_version_at_least(major, minor, patch)) {
PIPEWIRE_pw_init(NULL, NULL);
return 0;
}
@@ -1262,10 +1252,23 @@ static void PIPEWIRE_Deinitialize(void)
}
}
static SDL_bool PipewireInitialize(SDL_AudioDriverImpl *impl)
static SDL_bool PipewireInitialize(SDL_AudioDriverImpl *impl, SDL_bool check_preferred_version)
{
if (!pipewire_initialized) {
if (init_pipewire_library() < 0) {
int major, minor, patch;
// SDL can build against 0.3.20, but requires 0.3.24 at minimum, and 1.0.0 for preferred default status.
if (check_preferred_version) {
major = 1;
minor = 0;
patch = 0;
} else {
major = 0;
minor = 3;
patch = 24;
}
if (init_pipewire_library(major, minor, patch) < 0) {
return SDL_FALSE;
}
@@ -1295,16 +1298,12 @@ static SDL_bool PipewireInitialize(SDL_AudioDriverImpl *impl)
static SDL_bool PIPEWIRE_PREFERRED_Init(SDL_AudioDriverImpl *impl)
{
if (CheckPipewirePulseService()) {
return PipewireInitialize(impl);
}
return SDL_FALSE;
return PipewireInitialize(impl, SDL_TRUE);
}
static SDL_bool PIPEWIRE_Init(SDL_AudioDriverImpl *impl)
{
return PipewireInitialize(impl);
return PipewireInitialize(impl, SDL_FALSE);
}
AudioBootStrap PIPEWIRE_PREFERRED_bootstrap = {