mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-09-20 00:11:31 +00:00
examples: update some examples with RequestProcess
Let video-src unconditionally call _trigger_process() when it is ready. This will either start the graph when it is the driver or emit a RequestProcess event to the driver. Let video-play-pull intercept the RequestProcess command and use it to do a trigger_process(). Otherwise use a timer to pull in the next frame.
This commit is contained in:
parent
baca092ba5
commit
a84e43e3ee
|
@ -74,6 +74,7 @@ struct data {
|
|||
SDL_Rect rect;
|
||||
SDL_Rect cursor_rect;
|
||||
bool is_yuv;
|
||||
bool have_request_process;
|
||||
};
|
||||
|
||||
static void handle_events(struct data *data)
|
||||
|
@ -244,6 +245,25 @@ on_process(void *_data)
|
|||
pw_stream_queue_buffer(stream, b);
|
||||
}
|
||||
|
||||
static void enable_timeouts(struct data *data, bool enabled)
|
||||
{
|
||||
struct timespec timeout, interval, *to, *iv;
|
||||
|
||||
if (!enabled || data->have_request_process) {
|
||||
to = iv = NULL;
|
||||
} else {
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_nsec = 1;
|
||||
interval.tv_sec = 0;
|
||||
interval.tv_nsec = 80 * SPA_NSEC_PER_MSEC;
|
||||
to = &timeout;
|
||||
iv = &interval;
|
||||
}
|
||||
pw_loop_update_timer(pw_main_loop_get_loop(data->loop),
|
||||
data->timer, to, iv, false);
|
||||
}
|
||||
|
||||
|
||||
static void on_stream_state_changed(void *_data, enum pw_stream_state old,
|
||||
enum pw_stream_state state, const char *error)
|
||||
{
|
||||
|
@ -254,22 +274,11 @@ static void on_stream_state_changed(void *_data, enum pw_stream_state old,
|
|||
pw_main_loop_quit(data->loop);
|
||||
break;
|
||||
case PW_STREAM_STATE_PAUSED:
|
||||
pw_loop_update_timer(pw_main_loop_get_loop(data->loop),
|
||||
data->timer, NULL, NULL, false);
|
||||
enable_timeouts(data, false);
|
||||
break;
|
||||
case PW_STREAM_STATE_STREAMING:
|
||||
{
|
||||
struct timespec timeout, interval;
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_nsec = 1;
|
||||
interval.tv_sec = 0;
|
||||
interval.tv_nsec = 80 * SPA_NSEC_PER_MSEC;
|
||||
|
||||
pw_loop_update_timer(pw_main_loop_get_loop(data->loop),
|
||||
data->timer, &timeout, &interval, false);
|
||||
enable_timeouts(data, true);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -297,7 +306,23 @@ on_trigger_done(void *_data)
|
|||
static void on_timeout(void *userdata, uint64_t expirations)
|
||||
{
|
||||
struct data *data = userdata;
|
||||
pw_stream_trigger_process(data->stream);
|
||||
if (!data->have_request_process)
|
||||
pw_stream_trigger_process(data->stream);
|
||||
}
|
||||
|
||||
static void
|
||||
on_command(void *_data, const struct spa_command *command)
|
||||
{
|
||||
struct data *data = _data;
|
||||
switch (SPA_NODE_COMMAND_ID(command)) {
|
||||
case SPA_NODE_COMMAND_RequestProcess:
|
||||
data->have_request_process = true;
|
||||
enable_timeouts(data, false);
|
||||
pw_stream_trigger_process(data->stream);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Be notified when the stream param changes. We're only looking at the
|
||||
|
@ -432,6 +457,7 @@ static const struct pw_stream_events stream_events = {
|
|||
.param_changed = on_stream_param_changed,
|
||||
.process = on_process,
|
||||
.trigger_done = on_trigger_done,
|
||||
.command = on_command,
|
||||
};
|
||||
|
||||
static int build_format(struct data *data, struct spa_pod_builder *b, const struct spa_pod **params)
|
||||
|
|
|
@ -214,9 +214,8 @@ static void on_stream_state_changed(void *_data, enum pw_stream_state old, enum
|
|||
interval.tv_sec = 0;
|
||||
interval.tv_nsec = 40 * SPA_NSEC_PER_MSEC;
|
||||
|
||||
if (pw_stream_is_driving(data->stream))
|
||||
pw_loop_update_timer(pw_main_loop_get_loop(data->loop),
|
||||
data->timer, &timeout, &interval, false);
|
||||
pw_loop_update_timer(pw_main_loop_get_loop(data->loop),
|
||||
data->timer, &timeout, &interval, false);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
Loading…
Reference in a new issue