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:
Wim Taymans 2017-08-04 10:18:54 +02:00
parent e24c934a1b
commit b898eb46cd
72 changed files with 2980 additions and 2120 deletions

View file

@ -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);