mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
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:
parent
5db02df08c
commit
242e530aeb
4 changed files with 36 additions and 20 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue