stream: add pw_stream_emit_event()

Make a function to emit an event from a stream. Use this function
internally to emit the RequestProcess.

Make the RequestProcess event construction a little more efficient.
This commit is contained in:
Wim Taymans 2024-10-02 16:17:17 +02:00
parent 5db02df08c
commit 242e530aeb
4 changed files with 36 additions and 20 deletions

View file

@ -2081,20 +2081,23 @@ do_trigger_process(struct spa_loop *loop,
return spa_node_call_ready(&impl->callbacks, res);
}
static int do_trigger_request_process(struct spa_loop *loop,
static int do_emit_event(struct spa_loop *loop,
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
{
struct filter *impl = user_data;
uint8_t buffer[1024];
struct spa_pod_builder b = { 0 };
spa_pod_builder_init(&b, buffer, sizeof(buffer));
spa_node_emit_event(&impl->hooks,
spa_pod_builder_add_object(&b,
SPA_TYPE_EVENT_Node, SPA_NODE_EVENT_RequestProcess));
const struct spa_event *event = data;
spa_node_emit_event(&impl->hooks, event);
return 0;
}
SPA_EXPORT
int pw_filter_emit_event(struct pw_filter *filter, const struct spa_event *event)
{
struct filter *impl = SPA_CONTAINER_OF(filter, struct filter, this);
return pw_loop_invoke(impl->main_loop,
do_emit_event, 1, event, SPA_POD_SIZE(&event->pod), false, impl);
}
SPA_EXPORT
int pw_filter_trigger_process(struct pw_filter *filter)
{
@ -2109,8 +2112,8 @@ int pw_filter_trigger_process(struct pw_filter *filter)
res = pw_loop_invoke(impl->data_loop,
do_trigger_process, 1, NULL, 0, false, impl);
} else {
res = pw_loop_invoke(impl->main_loop,
do_trigger_request_process, 1, NULL, 0, false, impl);
pw_filter_emit_event(filter,
&SPA_NODE_EVENT_INIT(SPA_NODE_EVENT_RequestProcess));
}
return res;
}

View file

@ -29,6 +29,7 @@ struct pw_filter;
#include <spa/node/io.h>
#include <spa/param/param.h>
#include <spa/pod/command.h>
#include <spa/pod/event.h>
#include <pipewire/core.h>
#include <pipewire/stream.h>
@ -250,6 +251,10 @@ bool pw_filter_is_driving(struct pw_filter *filter);
* be scheduled and process() will be called. Since 0.3.66 */
int pw_filter_trigger_process(struct pw_filter *filter);
/** Emit an event from this filter.
* Since 1.2.6 */
int pw_filter_emit_event(struct pw_filter *filter, const struct spa_event *event);
/**
* \}
*/

View file

@ -2546,20 +2546,23 @@ do_trigger_driver(struct spa_loop *loop,
return spa_node_call_ready(&impl->callbacks, res);
}
static int do_trigger_request_process(struct spa_loop *loop,
static int do_emit_event(struct spa_loop *loop,
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
{
struct stream *impl = user_data;
uint8_t buffer[1024];
struct spa_pod_builder b = { 0 };
spa_pod_builder_init(&b, buffer, sizeof(buffer));
spa_node_emit_event(&impl->hooks,
spa_pod_builder_add_object(&b,
SPA_TYPE_EVENT_Node, SPA_NODE_EVENT_RequestProcess));
const struct spa_event *event = data;
spa_node_emit_event(&impl->hooks, event);
return 0;
}
SPA_EXPORT
int pw_stream_emit_event(struct pw_stream *stream, const struct spa_event *event)
{
struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this);
return pw_loop_invoke(impl->main_loop,
do_emit_event, 1, event, SPA_POD_SIZE(&event->pod), false, impl);
}
SPA_EXPORT
int pw_stream_trigger_process(struct pw_stream *stream)
{
@ -2577,8 +2580,8 @@ int pw_stream_trigger_process(struct pw_stream *stream)
res = pw_loop_invoke(impl->data_loop,
do_trigger_driver, 1, NULL, 0, false, impl);
} else {
res = pw_loop_invoke(impl->main_loop,
do_trigger_request_process, 1, NULL, 0, false, impl);
pw_stream_emit_event(stream,
&SPA_NODE_EVENT_INIT(SPA_NODE_EVENT_RequestProcess));
}
return res;
}

View file

@ -229,6 +229,7 @@ struct pw_stream;
#include <spa/buffer/buffer.h>
#include <spa/param/param.h>
#include <spa/pod/command.h>
#include <spa/pod/event.h>
/** \enum pw_stream_state The state of a stream */
enum pw_stream_state {
@ -622,6 +623,10 @@ bool pw_stream_is_driving(struct pw_stream *stream);
* Since 0.3.34 */
int pw_stream_trigger_process(struct pw_stream *stream);
/** Emit an event from this stream.
* Since 1.2.6 */
int pw_stream_emit_event(struct pw_stream *stream, const struct spa_event *event);
/**
* \}
*/