summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/audio-impl-pw.cpp146
-rw-r--r--src/audio-impl-pw.hpp4
2 files changed, 75 insertions, 75 deletions
diff --git a/src/audio-impl-pw.cpp b/src/audio-impl-pw.cpp
index 61e27a2..ba6760e 100644
--- a/src/audio-impl-pw.cpp
+++ b/src/audio-impl-pw.cpp
@@ -13,7 +13,7 @@
#define PKE_AUDIO_PW_NAME_RESERVE_LEN 256
-pke_audio_implementation_pipewire pke_audio_impl_pw{};
+pke_audio_implementation_pipewire pke_audio_pw{};
int metadata_event_property(void *data, uint32_t subject, const char *key, const char *type, const char *value);
@@ -49,27 +49,27 @@ bool pw_objects_find_pw_object_by_id(void *removed_id, void *item)
void pke_audio_pw_init() {
int i;
- pke_audio_impl_pw.bkt = pk_mem_bucket_create("pipewire bucket", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE);
- pke_audio_impl_pw.loop = nullptr;
- pke_audio_impl_pw.pod_buffer = nullptr;
- pke_audio_impl_pw.stream = nullptr;
- pke_audio_impl_pw.core = nullptr;
- pke_audio_impl_pw.registry = nullptr;
- pke_audio_impl_pw.registry_listener = {};
- pke_audio_impl_pw.metadata = nullptr;
- pke_audio_impl_pw.metadata_listener = {};
- pke_audio_impl_pw.pw_objects.bkt = pke_audio_impl_pw.bkt;
- pke_audio_impl_pw.created_objects.bkt = pke_audio_impl_pw.bkt;
- pke_audio_impl_pw.default_sink_name = pk_new<char>(PKE_AUDIO_PW_NAME_RESERVE_LEN, pke_audio_impl_pw.bkt);
- pke_audio_impl_pw.default_sink_id = 0;
- pke_audio_impl_pw.is_needing_output_remapped = true;
-
- pke_audio_impl_pw.pod_buffer = pk_new<uint8_t>(pke_audio_mstr.channel_count * PKE_AUDIO_IMPL_POD_BUFFER_LEN, pke_audio_impl_pw.bkt);
+ pke_audio_pw.bkt = pk_mem_bucket_create("pipewire bucket", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE);
+ pke_audio_pw.loop = nullptr;
+ pke_audio_pw.pod_buffer = nullptr;
+ pke_audio_pw.stream = nullptr;
+ pke_audio_pw.core = nullptr;
+ pke_audio_pw.registry = nullptr;
+ pke_audio_pw.registry_listener = {};
+ pke_audio_pw.metadata = nullptr;
+ pke_audio_pw.metadata_listener = {};
+ pke_audio_pw.pw_objects.bkt = pke_audio_pw.bkt;
+ pke_audio_pw.created_objects.bkt = pke_audio_pw.bkt;
+ pke_audio_pw.default_sink_name = pk_new<char>(PKE_AUDIO_PW_NAME_RESERVE_LEN, pke_audio_pw.bkt);
+ pke_audio_pw.default_sink_id = 0;
+ pke_audio_pw.is_needing_output_remapped = true;
+
+ pke_audio_pw.pod_buffer = pk_new<uint8_t>(pke_audio_mstr.channel_count * PKE_AUDIO_POD_BUFFER_LEN, pke_audio_pw.bkt);
pw_init(NULL, NULL);
- pke_audio_impl_pw.loop = pw_thread_loop_new("pke audio thread", NULL);
- if (pke_audio_impl_pw.loop == NULL) {
+ pke_audio_pw.loop = pw_thread_loop_new("pke audio thread", NULL);
+ if (pke_audio_pw.loop == NULL) {
fprintf(stderr, "[" __FILE__ "][pke_audio_pw_init] failed to create pw_loop");
return;
}
@@ -82,20 +82,20 @@ void pke_audio_pw_init() {
PW_KEY_MEDIA_ROLE, "Music",
nullptr);
assert(props != NULL);
- pke_audio_impl_pw.stream = pw_stream_new_simple(
- pw_thread_loop_get_loop(pke_audio_impl_pw.loop),
+ pke_audio_pw.stream = pw_stream_new_simple(
+ pw_thread_loop_get_loop(pke_audio_pw.loop),
"pke-audio-pw",
props,
&stream_events,
NULL /* user-data */);
- if (pke_audio_impl_pw.stream == NULL) {
+ if (pke_audio_pw.stream == NULL) {
fprintf(stderr, "[" __FILE__ "][pke_audio_pw_init] failed to create pw_stream");
return;
}
spa_pod_builder b{};
- b.data = pke_audio_impl_pw.pod_buffer;
- b.size = PKE_AUDIO_IMPL_POD_BUFFER_LEN * pke_audio_mstr.channel_count;
+ b.data = pke_audio_pw.pod_buffer;
+ b.size = PKE_AUDIO_POD_BUFFER_LEN * pke_audio_mstr.channel_count;
b._padding = 0;
b.callbacks.data = NULL;
b.callbacks.funcs = NULL;
@@ -115,7 +115,7 @@ void pke_audio_pw_init() {
params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat,
&spa_audio_info_raw_init);
- if (i = pw_stream_connect(pke_audio_impl_pw.stream,
+ if (i = pw_stream_connect(pke_audio_pw.stream,
PW_DIRECTION_OUTPUT,
PW_ID_ANY,
pw_stream_flags(PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS),
@@ -124,55 +124,55 @@ void pke_audio_pw_init() {
return;
}
- pke_audio_impl_pw.core = pw_stream_get_core(pke_audio_impl_pw.stream);
- if (pke_audio_impl_pw.core == NULL) {
+ pke_audio_pw.core = pw_stream_get_core(pke_audio_pw.stream);
+ if (pke_audio_pw.core == NULL) {
fprintf(stderr, "[" __FILE__ "][pke_audio_pw_init] failed to get core");
return;
}
- pke_audio_impl_pw.registry = pw_core_get_registry(pke_audio_impl_pw.core, PW_VERSION_REGISTRY, 0);
- if (pke_audio_impl_pw.registry == NULL) {
+ pke_audio_pw.registry = pw_core_get_registry(pke_audio_pw.core, PW_VERSION_REGISTRY, 0);
+ if (pke_audio_pw.registry == NULL) {
fprintf(stderr, "[" __FILE__ "][pke_audio_pw_init] failed to get registry");
return;
}
- memset(&pke_audio_impl_pw.registry_listener, 0, sizeof(pke_audio_impl_pw.registry_listener));
- pw_registry_add_listener(pke_audio_impl_pw.registry, &pke_audio_impl_pw.registry_listener, &registry_events, NULL);
+ memset(&pke_audio_pw.registry_listener, 0, sizeof(pke_audio_pw.registry_listener));
+ pw_registry_add_listener(pke_audio_pw.registry, &pke_audio_pw.registry_listener, &registry_events, NULL);
- pw_thread_loop_start(pke_audio_impl_pw.loop);
+ pw_thread_loop_start(pke_audio_pw.loop);
return;
}
void pke_audio_pw_teardown() {
uint32_t i;
pke_audio_mstr.mtx_buffer.lock();
- pw_thread_loop_stop(pke_audio_impl_pw.loop);
- for (i = pke_audio_impl_pw.created_objects.next; i > 0; --i) {
- pw_core_destroy(pke_audio_impl_pw.core, ((void **)pke_audio_impl_pw.created_objects.data)[i - 1]);
+ pw_thread_loop_stop(pke_audio_pw.loop);
+ for (i = pke_audio_pw.created_objects.next; i > 0; --i) {
+ pw_core_destroy(pke_audio_pw.core, ((void **)pke_audio_pw.created_objects.data)[i - 1]);
}
- for (i = pke_audio_impl_pw.pw_objects.next; i > 0; --i) {
- pw_properties_free(pke_audio_impl_pw.pw_objects[i - 1].props);
+ for (i = pke_audio_pw.pw_objects.next; i > 0; --i) {
+ pw_properties_free(pke_audio_pw.pw_objects[i - 1].props);
}
- if (pke_audio_impl_pw.metadata != NULL) {
- pw_proxy_destroy((struct pw_proxy*)pke_audio_impl_pw.metadata);
+ if (pke_audio_pw.metadata != NULL) {
+ pw_proxy_destroy((struct pw_proxy*)pke_audio_pw.metadata);
}
- if (pke_audio_impl_pw.registry != NULL) {
- pw_proxy_destroy((struct pw_proxy*)pke_audio_impl_pw.registry);
+ if (pke_audio_pw.registry != NULL) {
+ pw_proxy_destroy((struct pw_proxy*)pke_audio_pw.registry);
}
- if (pke_audio_impl_pw.core != NULL) {
- pw_core_disconnect(pke_audio_impl_pw.core);
+ if (pke_audio_pw.core != NULL) {
+ pw_core_disconnect(pke_audio_pw.core);
}
- if (pke_audio_impl_pw.stream != NULL) {
- pw_stream_destroy(pke_audio_impl_pw.stream);
+ if (pke_audio_pw.stream != NULL) {
+ pw_stream_destroy(pke_audio_pw.stream);
}
- if (pke_audio_impl_pw.loop != NULL) {
- pw_thread_loop_destroy(pke_audio_impl_pw.loop);
+ if (pke_audio_pw.loop != NULL) {
+ pw_thread_loop_destroy(pke_audio_pw.loop);
}
pw_deinit();
- pk_delete<char>(pke_audio_impl_pw.default_sink_name, PKE_AUDIO_PW_NAME_RESERVE_LEN, pke_audio_impl_pw.bkt);
- pk_delete<uint8_t>(pke_audio_impl_pw.pod_buffer, pke_audio_mstr.channel_count * PKE_AUDIO_IMPL_POD_BUFFER_LEN, pke_audio_impl_pw.bkt);
- pk_mem_bucket_destroy(pke_audio_impl_pw.bkt);
- pke_audio_impl_pw.bkt = CAFE_BABE(pk_membucket);
+ pk_delete<char>(pke_audio_pw.default_sink_name, PKE_AUDIO_PW_NAME_RESERVE_LEN, pke_audio_pw.bkt);
+ pk_delete<uint8_t>(pke_audio_pw.pod_buffer, pke_audio_mstr.channel_count * PKE_AUDIO_POD_BUFFER_LEN, pke_audio_pw.bkt);
+ pk_mem_bucket_destroy(pke_audio_pw.bkt);
+ pke_audio_pw.bkt = CAFE_BABE(pk_membucket);
pke_audio_mstr.mtx_buffer.unlock();
}
@@ -184,7 +184,7 @@ void on_pipewire_process(void *user_data) {
uint64_t n_frames;
float *dst;
- if ((b = pw_stream_dequeue_buffer(pke_audio_impl_pw.stream)) == NULL) {
+ if ((b = pw_stream_dequeue_buffer(pke_audio_pw.stream)) == NULL) {
fprintf(stderr, "[" __FILE__ "][on_pipewire_process] out of buffers");
return;
}
@@ -206,7 +206,7 @@ void on_pipewire_process(void *user_data) {
buf->datas[0].chunk->offset = 0;
buf->datas[0].chunk->stride = stride;
buf->datas[0].chunk->size = n_frames * stride;
- pw_stream_queue_buffer(pke_audio_impl_pw.stream, b);
+ pw_stream_queue_buffer(pke_audio_pw.stream, b);
pke_audio_mstr.mtx_buffer.unlock();
return;
}
@@ -214,23 +214,23 @@ void on_pipewire_process(void *user_data) {
void on_pipewire_stream_param_changed(void *, uint32_t id, const struct spa_pod *param) {
/* NULL means to clear the format */
if (param == NULL || id != SPA_PARAM_Format) {
- // memset(&pke_audio_impl_pw.format, 0, sizeof(struct spa_audio_info));
+ // memset(&pke_audio_pw.format, 0, sizeof(struct spa_audio_info));
return;
}
- if (spa_format_parse(param, &pke_audio_impl_pw.format.media_type, &pke_audio_impl_pw.format.media_subtype) < 0) {
+ if (spa_format_parse(param, &pke_audio_pw.format.media_type, &pke_audio_pw.format.media_subtype) < 0) {
return;
}
/* only accept raw audio */
- if (pke_audio_impl_pw.format.media_type != SPA_MEDIA_TYPE_audio || pke_audio_impl_pw.format.media_subtype != SPA_MEDIA_SUBTYPE_raw) {
+ if (pke_audio_pw.format.media_type != SPA_MEDIA_TYPE_audio || pke_audio_pw.format.media_subtype != SPA_MEDIA_SUBTYPE_raw) {
return;
}
/* call a helper function to parse the format for us. */
- spa_format_audio_raw_parse(param, &pke_audio_impl_pw.format.info.raw);
+ spa_format_audio_raw_parse(param, &pke_audio_pw.format.info.raw);
- fprintf(stdout, "\r\ncapturing rate changed:%d channels:%d\n", pke_audio_impl_pw.format.info.raw.rate, pke_audio_impl_pw.format.info.raw.channels);
+ fprintf(stdout, "\r\ncapturing rate changed:%d channels:%d\n", pke_audio_pw.format.info.raw.rate, pke_audio_pw.format.info.raw.channels);
return;
}
@@ -238,12 +238,12 @@ int metadata_event_property(void *data, uint32_t subject, const char *key, const
{
if (subject == PW_ID_CORE) {
if (key == NULL || spa_streq(key, "default.audio.sink")) {
- if (pke_audio_impl_pw.default_sink_id != 0) {
+ if (pke_audio_pw.default_sink_id != 0) {
// the default just changed??
- pke_audio_impl_pw.is_needing_output_remapped = true;
+ pke_audio_pw.is_needing_output_remapped = true;
}
- if (value == NULL || spa_json_str_object_find(value, strlen(value), "name", pke_audio_impl_pw.default_sink_name, sizeof(pke_audio_impl_pw.default_sink_name)) < 0) {
- pke_audio_impl_pw.default_sink_name[0] = '\0';
+ if (value == NULL || spa_json_str_object_find(value, strlen(value), "name", pke_audio_pw.default_sink_name, sizeof(pke_audio_pw.default_sink_name)) < 0) {
+ pke_audio_pw.default_sink_name[0] = '\0';
}
}
}
@@ -317,11 +317,11 @@ void on_registry_event_global(void *data, uint32_t id, uint32_t permissions, con
if (!spa_streq(str, "default")) {
return;
}
- pke_audio_impl_pw.metadata = (pw_metadata*)pw_registry_bind(pke_audio_impl_pw.registry, id, PW_TYPE_INTERFACE_Metadata, PW_VERSION_METADATA, 0);
+ pke_audio_pw.metadata = (pw_metadata*)pw_registry_bind(pke_audio_pw.registry, id, PW_TYPE_INTERFACE_Metadata, PW_VERSION_METADATA, 0);
- spa_zero(pke_audio_impl_pw.metadata_listener);
+ spa_zero(pke_audio_pw.metadata_listener);
- pw_metadata_add_listener(pke_audio_impl_pw.metadata, &pke_audio_impl_pw.metadata_listener, &metadata_events, NULL);
+ pw_metadata_add_listener(pke_audio_pw.metadata, &pke_audio_pw.metadata_listener, &metadata_events, NULL);
} else {
return;
}
@@ -339,7 +339,7 @@ void on_registry_event_global(void *data, uint32_t id, uint32_t permissions, con
printf("\r\nPW CALLBACK: object: id:%u type:%s/%d\n", id, type, version);
- pk_arr_append_t(&pke_audio_impl_pw.pw_objects, obj);
+ pk_arr_append_t(&pke_audio_pw.pw_objects, obj);
return;
}
@@ -347,17 +347,17 @@ void on_registry_event_global_removal(void *data, uint32_t id) {
(void)data;
uint32_t i;
// printf("\r\nPW CALLBACK: object remove: id:%u ...", id);
- if (i = pk_arr_find_first_index(&pke_audio_impl_pw.pw_objects, &id, pw_objects_find_pw_object_by_id), i != 0xFFFFFFFF)
+ if (i = pk_arr_find_first_index(&pke_audio_pw.pw_objects, &id, pw_objects_find_pw_object_by_id), i != 0xFFFFFFFF)
{
- if (pke_audio_impl_pw.pw_objects[i].type != PKE_AUDIO_PW_OBJECT_TYPE_LINK) {
- pke_audio_impl_pw.is_needing_output_remapped = true;
+ if (pke_audio_pw.pw_objects[i].type != PKE_AUDIO_PW_OBJECT_TYPE_LINK) {
+ pke_audio_pw.is_needing_output_remapped = true;
}
- if (pke_audio_impl_pw.pw_objects[i].id == pke_audio_impl_pw.default_sink_id) {
+ if (pke_audio_pw.pw_objects[i].id == pke_audio_pw.default_sink_id) {
// we just lost our target audio device
- pke_audio_impl_pw.default_sink_id = 0;
- pke_audio_impl_pw.default_sink_name[0] = '\0';
+ pke_audio_pw.default_sink_id = 0;
+ pke_audio_pw.default_sink_name[0] = '\0';
}
- pk_arr_remove_at(&pke_audio_impl_pw.pw_objects, i);
+ pk_arr_remove_at(&pke_audio_pw.pw_objects, i);
// printf(" removed.\n");
}
return;
diff --git a/src/audio-impl-pw.hpp b/src/audio-impl-pw.hpp
index c371973..2eb9916 100644
--- a/src/audio-impl-pw.hpp
+++ b/src/audio-impl-pw.hpp
@@ -18,7 +18,7 @@
#include <spa/utils/string.h>
#pragma GCC diagnostic pop
-#define PKE_AUDIO_IMPL_POD_BUFFER_LEN 1024
+#define PKE_AUDIO_POD_BUFFER_LEN 1024
enum pke_audio_pw_object_type : uint8_t {
PKE_AUDIO_PW_OBJECT_TYPE_ANY,
PKE_AUDIO_PW_OBJECT_TYPE_NODE,
@@ -60,7 +60,7 @@ struct pke_audio_implementation_pipewire {
uint32_t default_sink_id;
std::atomic_bool is_needing_output_remapped;
};
-extern struct pke_audio_implementation_pipewire pke_audio_impl_pw;
+extern struct pke_audio_implementation_pipewire pke_audio_pw;
void pke_audio_pw_init();
void pke_audio_pw_teardown();
void on_pipewire_process(void *user_data);