mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
Make structure private
Make structs private. Expose methods for things we need. Signals only work on exposed structures so make a new callback helper to signal events.
This commit is contained in:
parent
e24c934a1b
commit
b898eb46cd
72 changed files with 2980 additions and 2120 deletions
|
|
@ -65,12 +65,12 @@ struct data {
|
|||
struct spa_source *timer;
|
||||
|
||||
struct pw_core *core;
|
||||
struct pw_type *t;
|
||||
struct pw_remote *remote;
|
||||
struct pw_listener on_state_changed;
|
||||
struct pw_callback_info remote_callbacks;
|
||||
|
||||
struct pw_stream *stream;
|
||||
struct pw_listener on_stream_state_changed;
|
||||
struct pw_listener on_stream_format_changed;
|
||||
struct pw_callback_info stream_callbacks;
|
||||
|
||||
struct spa_video_info_raw format;
|
||||
int32_t stride;
|
||||
|
|
@ -137,13 +137,14 @@ static void on_timeout(struct spa_loop_utils *utils, struct spa_source *source,
|
|||
pw_stream_send_buffer(data->stream, id);
|
||||
}
|
||||
|
||||
static void on_stream_state_changed(struct pw_listener *listener, struct pw_stream *stream)
|
||||
static void on_stream_state_changed(void *_data, enum pw_stream_state old, enum pw_stream_state state,
|
||||
const char *error)
|
||||
{
|
||||
struct data *data = SPA_CONTAINER_OF(listener, struct data, on_stream_state_changed);
|
||||
struct data *data = _data;
|
||||
|
||||
printf("stream state: \"%s\"\n", pw_stream_state_as_string(stream->state));
|
||||
printf("stream state: \"%s\"\n", pw_stream_state_as_string(state));
|
||||
|
||||
switch (stream->state) {
|
||||
switch (state) {
|
||||
case PW_STREAM_STATE_PAUSED:
|
||||
pw_loop_update_timer(data->loop, data->timer, NULL, NULL, false);
|
||||
break;
|
||||
|
|
@ -172,12 +173,11 @@ static void on_stream_state_changed(struct pw_listener *listener, struct pw_stre
|
|||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
|
||||
static void
|
||||
on_stream_format_changed(struct pw_listener *listener,
|
||||
struct pw_stream *stream, struct spa_format *format)
|
||||
on_stream_format_changed(void *_data, struct spa_format *format)
|
||||
{
|
||||
struct data *data = SPA_CONTAINER_OF(listener, struct data, on_stream_format_changed);
|
||||
struct pw_remote *remote = stream->remote;
|
||||
struct pw_core *core = remote->core;
|
||||
struct data *data = _data;
|
||||
struct pw_stream *stream = data->stream;
|
||||
struct pw_type *t = data->t;
|
||||
struct spa_pod_builder b = { NULL };
|
||||
struct spa_pod_frame f[2];
|
||||
struct spa_param *params[2];
|
||||
|
|
@ -191,35 +191,42 @@ on_stream_format_changed(struct pw_listener *listener,
|
|||
data->stride = SPA_ROUND_UP_N(data->format.size.width * BPP, 4);
|
||||
|
||||
spa_pod_builder_init(&b, data->params_buffer, sizeof(data->params_buffer));
|
||||
spa_pod_builder_object(&b, &f[0], 0, core->type.param_alloc_buffers.Buffers,
|
||||
PROP(&f[1], core->type.param_alloc_buffers.size, SPA_POD_TYPE_INT,
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_buffers.Buffers,
|
||||
PROP(&f[1], t->param_alloc_buffers.size, SPA_POD_TYPE_INT,
|
||||
data->stride * data->format.size.height),
|
||||
PROP(&f[1], core->type.param_alloc_buffers.stride, SPA_POD_TYPE_INT,
|
||||
PROP(&f[1], t->param_alloc_buffers.stride, SPA_POD_TYPE_INT,
|
||||
data->stride),
|
||||
PROP_U_MM(&f[1], core->type.param_alloc_buffers.buffers, SPA_POD_TYPE_INT,
|
||||
PROP_U_MM(&f[1], t->param_alloc_buffers.buffers, SPA_POD_TYPE_INT,
|
||||
32,
|
||||
2, 32),
|
||||
PROP(&f[1], core->type.param_alloc_buffers.align, SPA_POD_TYPE_INT,
|
||||
PROP(&f[1], t->param_alloc_buffers.align, SPA_POD_TYPE_INT,
|
||||
16));
|
||||
params[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
|
||||
spa_pod_builder_object(&b, &f[0], 0, core->type.param_alloc_meta_enable.MetaEnable,
|
||||
PROP(&f[1], core->type.param_alloc_meta_enable.type, SPA_POD_TYPE_ID,
|
||||
core->type.meta.Header),
|
||||
PROP(&f[1], core->type.param_alloc_meta_enable.size, SPA_POD_TYPE_INT,
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_meta_enable.MetaEnable,
|
||||
PROP(&f[1], t->param_alloc_meta_enable.type, SPA_POD_TYPE_ID,
|
||||
t->meta.Header),
|
||||
PROP(&f[1], t->param_alloc_meta_enable.size, SPA_POD_TYPE_INT,
|
||||
sizeof(struct spa_meta_header)));
|
||||
params[1] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
|
||||
pw_stream_finish_format(stream, SPA_RESULT_OK, params, 2);
|
||||
}
|
||||
|
||||
static void on_state_changed(struct pw_listener *listener, struct pw_remote *remote)
|
||||
{
|
||||
struct data *data = SPA_CONTAINER_OF(listener, struct data, on_state_changed);
|
||||
static const struct pw_stream_callbacks stream_callbacks = {
|
||||
PW_VERSION_STREAM_CALLBACKS,
|
||||
.state_changed = on_stream_state_changed,
|
||||
.format_changed = on_stream_format_changed,
|
||||
};
|
||||
|
||||
switch (remote->state) {
|
||||
static void on_state_changed(void *_data, enum pw_remote_state old, enum pw_remote_state state, const char *error)
|
||||
{
|
||||
struct data *data = _data;
|
||||
struct pw_remote *remote = data->remote;
|
||||
|
||||
switch (state) {
|
||||
case PW_REMOTE_STATE_ERROR:
|
||||
printf("remote error: %s\n", remote->error);
|
||||
printf("remote error: %s\n", error);
|
||||
data->running = false;
|
||||
break;
|
||||
|
||||
|
|
@ -231,7 +238,7 @@ static void on_state_changed(struct pw_listener *listener, struct pw_remote *rem
|
|||
struct spa_pod_frame f[2];
|
||||
|
||||
printf("remote state: \"%s\"\n",
|
||||
pw_remote_state_as_string(remote->state));
|
||||
pw_remote_state_as_string(state));
|
||||
|
||||
data->stream = pw_stream_new(remote, "video-src", NULL);
|
||||
|
||||
|
|
@ -247,10 +254,10 @@ static void on_state_changed(struct pw_listener *listener, struct pw_remote *rem
|
|||
25, 1));
|
||||
formats[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
|
||||
pw_signal_add(&data->stream->state_changed,
|
||||
&data->on_stream_state_changed, on_stream_state_changed);
|
||||
pw_signal_add(&data->stream->format_changed,
|
||||
&data->on_stream_format_changed, on_stream_format_changed);
|
||||
pw_stream_add_callbacks(data->stream,
|
||||
&data->stream_callbacks,
|
||||
&stream_callbacks,
|
||||
data);
|
||||
|
||||
pw_stream_connect(data->stream,
|
||||
PW_DIRECTION_OUTPUT,
|
||||
|
|
@ -259,11 +266,16 @@ static void on_state_changed(struct pw_listener *listener, struct pw_remote *rem
|
|||
break;
|
||||
}
|
||||
default:
|
||||
printf("remote state: \"%s\"\n", pw_remote_state_as_string(remote->state));
|
||||
printf("remote state: \"%s\"\n", pw_remote_state_as_string(state));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct pw_remote_callbacks remote_callbacks = {
|
||||
PW_VERSION_REMOTE_CALLBACKS,
|
||||
.state_changed = on_state_changed,
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct data data = { 0, };
|
||||
|
|
@ -273,13 +285,14 @@ int main(int argc, char *argv[])
|
|||
data.loop = pw_loop_new();
|
||||
data.running = true;
|
||||
data.core = pw_core_new(data.loop, NULL);
|
||||
data.t = pw_core_get_type(data.core);
|
||||
data.remote = pw_remote_new(data.core, NULL);
|
||||
|
||||
init_type(&data.type, data.core->type.map);
|
||||
init_type(&data.type, data.t->map);
|
||||
|
||||
data.timer = pw_loop_add_timer(data.loop, on_timeout, &data);
|
||||
|
||||
pw_signal_add(&data.remote->state_changed, &data.on_state_changed, on_state_changed);
|
||||
pw_remote_add_callbacks(data.remote, &data.remote_callbacks, &remote_callbacks, &data);
|
||||
|
||||
pw_remote_connect(data.remote);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue