summaryrefslogtreecommitdiff
path: root/src/audio-impl-pw.hpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-06-25 17:50:44 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-06-25 17:50:44 -0400
commit9e791d26560b566bb21b5cd39d9042a41f29714c (patch)
tree7e95ca82423feb1009b6916bca82142d1326a94a /src/audio-impl-pw.hpp
parent3c73b503330eb67ad9489da6941ae3b28a686780 (diff)
audio: first-pass, pipewire
Diffstat (limited to 'src/audio-impl-pw.hpp')
-rw-r--r--src/audio-impl-pw.hpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/audio-impl-pw.hpp b/src/audio-impl-pw.hpp
new file mode 100644
index 0000000..c371973
--- /dev/null
+++ b/src/audio-impl-pw.hpp
@@ -0,0 +1,71 @@
+#ifndef PKE_AUDIO_IMPL_PW_HPP
+#define PKE_AUDIO_IMPL_PW_HPP
+
+#include <atomic>
+
+#include "pk.h"
+
+// 2025-06-24 spa does not have c++ headers so we have to use c headers.
+// They throw a ton of pedantic warnings that spam the build output.
+// Might be too large of a swath, but none of this is my code anyway.
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#include <pipewire/pipewire.h>
+#include <pipewire/extensions/metadata.h>
+#include <spa/param/audio/format-utils.h>
+#include <spa/param/audio/raw.h>
+#include <spa/param/param.h>
+#include <spa/utils/string.h>
+#pragma GCC diagnostic pop
+
+#define PKE_AUDIO_IMPL_POD_BUFFER_LEN 1024
+enum pke_audio_pw_object_type : uint8_t {
+ PKE_AUDIO_PW_OBJECT_TYPE_ANY,
+ PKE_AUDIO_PW_OBJECT_TYPE_NODE,
+ PKE_AUDIO_PW_OBJECT_TYPE_PORT,
+ PKE_AUDIO_PW_OBJECT_TYPE_LINK,
+ PKE_AUDIO_PW_OBJECT_TYPE_METADATA,
+};
+struct pke_audio_pw_object {
+ union {
+ struct {
+ enum pw_direction direction;
+ uint32_t node;
+ uint32_t id;
+ } port;
+ struct {
+ uint32_t output_port;
+ uint32_t input_port;
+ uint32_t dummy;
+ } link;
+ } data;
+ uint32_t id;
+ enum pke_audio_pw_object_type type;
+ struct pw_properties *props;
+};
+struct pke_audio_implementation_pipewire {
+ pk_membucket *bkt;
+ pw_thread_loop *loop;
+ uint8_t *pod_buffer;
+ pw_stream *stream;
+ pw_core *core;
+ pw_registry *registry;
+ spa_hook registry_listener;
+ pw_metadata *metadata;
+ spa_hook metadata_listener;
+ pk_arr_t<pke_audio_pw_object> pw_objects;
+ pk_arr_t<void*> created_objects;
+ char *default_sink_name;
+ spa_audio_info format;
+ uint32_t default_sink_id;
+ std::atomic_bool is_needing_output_remapped;
+};
+extern struct pke_audio_implementation_pipewire pke_audio_impl_pw;
+void pke_audio_pw_init();
+void pke_audio_pw_teardown();
+void on_pipewire_process(void *user_data);
+void on_pipewire_stream_param_changed(void *, uint32_t id, const struct spa_pod *param);
+void on_registry_event_global(void *data, uint32_t id, uint32_t permissions, const char *type, uint32_t version, const struct spa_dict *props);
+void on_registry_event_global_removal(void *data, uint32_t id);
+
+#endif /* PKE_AUDIO_IMPL_PW_HPP */