Dynamically load libpulse.so.0 and libasound.so.1 on Linux

By generating stubs using https://github.com/hpvb/dynload-wrapper we
can dynamically load libpulse and libasound on systems where it is available.
Both are still a build-time requirement but no longer a run-time dependency.

For maintenance purposes the wrappers should not need to be re-generated
unless we want to bump pulse or asound to an incompatible version. It is
unlikely we will want to do this any time soon.

This closes #20978
This commit is contained in:
Hein-Pieter van Braam-Stewart 2021-02-16 16:19:03 +01:00
parent cb64f2d96b
commit 09f82fa6ea
12 changed files with 19778 additions and 5 deletions

View File

@ -2,4 +2,7 @@
Import("env") Import("env")
if "alsa" in env and env["alsa"]:
env.add_source_files(env.drivers_sources, "asound-so_wrap.c")
env.add_source_files(env.drivers_sources, "*.cpp") env.add_source_files(env.drivers_sources, "*.cpp")

11565
drivers/alsa/asound-so_wrap.c Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -37,6 +37,12 @@
#include <errno.h> #include <errno.h>
#ifdef PULSEAUDIO_ENABLED
extern "C" {
extern int initialize_pulse();
}
#endif
Error AudioDriverALSA::init_device() { Error AudioDriverALSA::init_device() {
mix_rate = GLOBAL_GET("audio/mix_rate"); mix_rate = GLOBAL_GET("audio/mix_rate");
speaker_mode = SPEAKER_MODE_STEREO; speaker_mode = SPEAKER_MODE_STEREO;
@ -147,6 +153,16 @@ Error AudioDriverALSA::init_device() {
} }
Error AudioDriverALSA::init() { Error AudioDriverALSA::init() {
#ifdef PULSEAUDIO_ENABLED
// On pulse enabled systems Alsa will silently use pulse.
// It doesn't matter if this fails as that likely means there is no pulse
initialize_pulse();
#endif
if (initialize_asound()) {
return ERR_CANT_OPEN;
}
active = false; active = false;
thread_exited = false; thread_exited = false;
exit_thread = false; exit_thread = false;

View File

@ -37,7 +37,7 @@
#include "core/os/thread.h" #include "core/os/thread.h"
#include "servers/audio_server.h" #include "servers/audio_server.h"
#include <alsa/asoundlib.h> #include "asound-so_wrap.h"
class AudioDriverALSA : public AudioDriver { class AudioDriverALSA : public AudioDriver {
Thread thread; Thread thread;

View File

@ -2,4 +2,7 @@
Import("env") Import("env")
if "pulseaudio" in env and env["pulseaudio"]:
env.add_source_files(env.drivers_sources, "pulse-so_wrap.c")
env.add_source_files(env.drivers_sources, "*.cpp") env.add_source_files(env.drivers_sources, "*.cpp")

View File

@ -233,6 +233,10 @@ Error AudioDriverPulseAudio::init_device() {
} }
Error AudioDriverPulseAudio::init() { Error AudioDriverPulseAudio::init() {
if (initialize_pulse()) {
return ERR_CANT_OPEN;
}
active = false; active = false;
thread_exited = false; thread_exited = false;
exit_thread = false; exit_thread = false;

View File

@ -37,7 +37,7 @@
#include "core/os/thread.h" #include "core/os/thread.h"
#include "servers/audio_server.h" #include "servers/audio_server.h"
#include <pulse/pulseaudio.h> #include "pulse-so_wrap.h"
class AudioDriverPulseAudio : public AudioDriver { class AudioDriverPulseAudio : public AudioDriver {
Thread thread; Thread thread;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -16,6 +16,8 @@ while IFS= read -rd '' f; do
continue continue
elif [[ "$f" == "platform/android/java/lib/src/com/google"* ]]; then elif [[ "$f" == "platform/android/java/lib/src/com/google"* ]]; then
continue continue
elif [[ "$f" == *"-so_wrap."* ]]; then
continue
fi fi
for extension in ${CLANG_FORMAT_FILE_EXTS[@]}; do for extension in ${CLANG_FORMAT_FILE_EXTS[@]}; do

View File

@ -310,9 +310,8 @@ def configure(env):
if os.system("pkg-config --exists alsa") == 0: # 0 means found if os.system("pkg-config --exists alsa") == 0: # 0 means found
print("Enabling ALSA") print("Enabling ALSA")
env["alsa"] = True
env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"]) env.Append(CPPDEFINES=["ALSA_ENABLED", "ALSAMIDI_ENABLED"])
# Don't parse --cflags, we don't need to add /usr/include/alsa to include path
env.ParseConfig("pkg-config alsa --libs")
else: else:
print("ALSA libraries not found, disabling driver") print("ALSA libraries not found, disabling driver")
@ -320,7 +319,7 @@ def configure(env):
if os.system("pkg-config --exists libpulse") == 0: # 0 means found if os.system("pkg-config --exists libpulse") == 0: # 0 means found
print("Enabling PulseAudio") print("Enabling PulseAudio")
env.Append(CPPDEFINES=["PULSEAUDIO_ENABLED"]) env.Append(CPPDEFINES=["PULSEAUDIO_ENABLED"])
env.ParseConfig("pkg-config --cflags --libs libpulse") env.ParseConfig("pkg-config --cflags libpulse")
else: else:
print("PulseAudio development libraries not found, disabling driver") print("PulseAudio development libraries not found, disabling driver")