summaryrefslogtreecommitdiff
path: root/soundbox/pipewire-binding.c
diff options
context:
space:
mode:
Diffstat (limited to 'soundbox/pipewire-binding.c')
-rw-r--r--soundbox/pipewire-binding.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/soundbox/pipewire-binding.c b/soundbox/pipewire-binding.c
index bd23ff0..0a31843 100644
--- a/soundbox/pipewire-binding.c
+++ b/soundbox/pipewire-binding.c
@@ -2,6 +2,7 @@
#include <spa/param/audio/format-utils.h>
#include "pipewire-binding.h"
+#include "pipewire/main-loop.h"
#define SAMPLING_RATE 48000
@@ -11,15 +12,21 @@
#define STRIDE sizeof(int16_t) * CHANNELS
+struct pw_go_capture {
+ struct pw_main_loop *loop;
+ struct pw_stream *stream;
+};
+
+
static void on_process(void *userdata)
{
- struct pw_stream *stream = *(struct pw_stream **)userdata;
+ struct pw_go_capture *capture = (struct pw_go_capture *)userdata;
struct pw_buffer *pw_buf;
struct spa_buffer *spa_buf;
int n_frames;
int16_t *src;
- if ((pw_buf = pw_stream_dequeue_buffer(stream)) == NULL) {
+ if ((pw_buf = pw_stream_dequeue_buffer(capture->stream)) == NULL) {
return;
}
@@ -41,7 +48,7 @@ static void on_process(void *userdata)
spa_buf->datas[0].chunk->stride = STRIDE;
spa_buf->datas[0].chunk->size = n_frames * STRIDE;
- pw_stream_queue_buffer(stream, pw_buf);
+ pw_stream_queue_buffer(capture->stream, pw_buf);
}
@@ -51,15 +58,14 @@ static const struct pw_stream_events stream_events = {
};
-void pw_stdout(void)
+void *pw_go_capture_init(void)
{
pw_init(NULL, NULL);
- struct pw_main_loop *loop = pw_main_loop_new(NULL);
-
- struct pw_stream *stream = NULL;
- stream = pw_stream_new_simple(
- pw_main_loop_get_loop(loop),
+ struct pw_go_capture *capture = malloc(sizeof(struct pw_go_capture));
+ capture->loop = pw_main_loop_new(NULL);
+ capture->stream = pw_stream_new_simple(
+ pw_main_loop_get_loop(capture->loop),
NODE_NAME,
pw_properties_new(
PW_KEY_MEDIA_TYPE, "Audio",
@@ -69,7 +75,7 @@ void pw_stdout(void)
NULL
),
&stream_events,
- &stream
+ capture
);
uint8_t buffer[1024];
@@ -87,7 +93,7 @@ void pw_stdout(void)
};
pw_stream_connect(
- stream,
+ capture->stream,
PW_DIRECTION_INPUT,
PW_ID_ANY,
PW_STREAM_FLAG_MAP_BUFFERS |
@@ -96,9 +102,23 @@ void pw_stdout(void)
sizeof(params) / sizeof(params[0])
);
- pw_main_loop_run(loop);
+ return (void *)capture;
+}
+
- pw_stream_destroy(stream);
- pw_main_loop_destroy(loop);
+void pw_go_capture_run(void *cdata)
+{
+ struct pw_go_capture *capture = cdata;
+ pw_main_loop_run(capture->loop);
+ pw_stream_destroy(capture->stream);
+ pw_main_loop_destroy(capture->loop);
+ free(capture);
pw_deinit();
}
+
+
+void pw_go_capture_deinit(void *cdata)
+{
+ struct pw_go_capture *capture = cdata;
+ pw_main_loop_quit(capture->loop);
+}