mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-03-21 05:33:49 -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);
|
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)
|
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
|
||||||
{
|
{
|
||||||
struct filter *impl = user_data;
|
struct filter *impl = user_data;
|
||||||
uint8_t buffer[1024];
|
const struct spa_event *event = data;
|
||||||
struct spa_pod_builder b = { 0 };
|
spa_node_emit_event(&impl->hooks, event);
|
||||||
|
|
||||||
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));
|
|
||||||
return 0;
|
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
|
SPA_EXPORT
|
||||||
int pw_filter_trigger_process(struct pw_filter *filter)
|
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,
|
res = pw_loop_invoke(impl->data_loop,
|
||||||
do_trigger_process, 1, NULL, 0, false, impl);
|
do_trigger_process, 1, NULL, 0, false, impl);
|
||||||
} else {
|
} else {
|
||||||
res = pw_loop_invoke(impl->main_loop,
|
pw_filter_emit_event(filter,
|
||||||
do_trigger_request_process, 1, NULL, 0, false, impl);
|
&SPA_NODE_EVENT_INIT(SPA_NODE_EVENT_RequestProcess));
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ struct pw_filter;
|
||||||
#include <spa/node/io.h>
|
#include <spa/node/io.h>
|
||||||
#include <spa/param/param.h>
|
#include <spa/param/param.h>
|
||||||
#include <spa/pod/command.h>
|
#include <spa/pod/command.h>
|
||||||
|
#include <spa/pod/event.h>
|
||||||
|
|
||||||
#include <pipewire/core.h>
|
#include <pipewire/core.h>
|
||||||
#include <pipewire/stream.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 */
|
* be scheduled and process() will be called. Since 0.3.66 */
|
||||||
int pw_filter_trigger_process(struct pw_filter *filter);
|
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);
|
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)
|
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
|
||||||
{
|
{
|
||||||
struct stream *impl = user_data;
|
struct stream *impl = user_data;
|
||||||
uint8_t buffer[1024];
|
const struct spa_event *event = data;
|
||||||
struct spa_pod_builder b = { 0 };
|
spa_node_emit_event(&impl->hooks, event);
|
||||||
|
|
||||||
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));
|
|
||||||
return 0;
|
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
|
SPA_EXPORT
|
||||||
int pw_stream_trigger_process(struct pw_stream *stream)
|
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,
|
res = pw_loop_invoke(impl->data_loop,
|
||||||
do_trigger_driver, 1, NULL, 0, false, impl);
|
do_trigger_driver, 1, NULL, 0, false, impl);
|
||||||
} else {
|
} else {
|
||||||
res = pw_loop_invoke(impl->main_loop,
|
pw_stream_emit_event(stream,
|
||||||
do_trigger_request_process, 1, NULL, 0, false, impl);
|
&SPA_NODE_EVENT_INIT(SPA_NODE_EVENT_RequestProcess));
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -229,6 +229,7 @@ struct pw_stream;
|
||||||
#include <spa/buffer/buffer.h>
|
#include <spa/buffer/buffer.h>
|
||||||
#include <spa/param/param.h>
|
#include <spa/param/param.h>
|
||||||
#include <spa/pod/command.h>
|
#include <spa/pod/command.h>
|
||||||
|
#include <spa/pod/event.h>
|
||||||
|
|
||||||
/** \enum pw_stream_state The state of a stream */
|
/** \enum pw_stream_state The state of a stream */
|
||||||
enum pw_stream_state {
|
enum pw_stream_state {
|
||||||
|
|
@ -622,6 +623,10 @@ bool pw_stream_is_driving(struct pw_stream *stream);
|
||||||
* Since 0.3.34 */
|
* Since 0.3.34 */
|
||||||
int pw_stream_trigger_process(struct pw_stream *stream);
|
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