aboutsummaryrefslogtreecommitdiffstats
path: root/alc/backends/pipewire.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'alc/backends/pipewire.cpp')
-rw-r--r--alc/backends/pipewire.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/alc/backends/pipewire.cpp b/alc/backends/pipewire.cpp
index 503512ae..25e21af5 100644
--- a/alc/backends/pipewire.cpp
+++ b/alc/backends/pipewire.cpp
@@ -115,12 +115,26 @@ constexpr char pwireDevice[] = "PipeWire Output";
constexpr char pwireInput[] = "PipeWire Input";
+bool check_version(const char *version)
+{
+ /* There doesn't seem to be a function to get the version as an integer, so
+ * instead we have to parse the string, which hopefully won't break in the
+ * future.
+ */
+ int major{0}, minor{0}, revision{0};
+ int ret{sscanf(version, "%d.%d.%d", &major, &minor, &revision)};
+ if(ret == 3 && PW_CHECK_VERSION(major, minor, revision))
+ return true;
+ return false;
+}
+
#ifdef HAVE_DYNLOAD
#define PWIRE_FUNCS(MAGIC) \
MAGIC(pw_context_connect) \
MAGIC(pw_context_destroy) \
MAGIC(pw_context_new) \
MAGIC(pw_core_disconnect) \
+ MAGIC(pw_get_library_version) \
MAGIC(pw_init) \
MAGIC(pw_properties_free) \
MAGIC(pw_properties_new) \
@@ -199,6 +213,7 @@ bool pwire_load()
#define pw_context_destroy ppw_context_destroy
#define pw_context_new ppw_context_new
#define pw_core_disconnect ppw_core_disconnect
+#define pw_get_library_version ppw_get_library_version
#define pw_init ppw_init
#define pw_properties_free ppw_properties_free
#define pw_properties_new ppw_properties_new
@@ -1930,6 +1945,15 @@ bool PipeWireBackendFactory::init()
if(!pwire_load())
return false;
+ const char *version{pw_get_library_version()};
+ if(!check_version(version))
+ {
+ WARN("PipeWire version \"%s\" too old (%s or newer required)\n", version,
+ pw_get_headers_version());
+ return false;
+ }
+ TRACE("Found PipeWire version \"%s\" (%s or newer)\n", version, pw_get_headers_version());
+
pw_init(0, nullptr);
if(!gEventHandler.init())
return false;