mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
More session manager work
pulseaudio card is mapped to device pulseaudio sink/source is mapped to an endpoint prepare to map streams to card profiles Add Route param to implement the endpoint routing later (ports) Create an alsa endpoint for each device Create one stream for each endpoint (Playback/Capture) Implement create_link on the endpoint. The idea is to call create link on the peer endpoint to complete the link. Remove create_link on the session. Add stream-monitor to turn pw_stream nodes into endpoints Add a policy manager that tries to link endpoints Use enum pw_direction for the endpoint direction. We can use the media_class to determine if this is a pw_stream or not but it should not really matter, you can link any output to any input. Add autoconnect property for endpoints to make the policy connect.
This commit is contained in:
parent
edd011605d
commit
3f3dfbc67e
27 changed files with 2338 additions and 439 deletions
|
|
@ -83,7 +83,6 @@ static int client_endpoint_stream_update(void *object,
|
|||
PW_KEY_FACTORY_ID,
|
||||
PW_KEY_CLIENT_ID,
|
||||
PW_KEY_ENDPOINT_ID,
|
||||
PW_KEY_MEDIA_CLASS,
|
||||
PW_KEY_PRIORITY_SESSION,
|
||||
PW_KEY_STREAM_NAME,
|
||||
PW_KEY_STREAM_DESCRIPTION,
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@ struct client_endpoint {
|
|||
pw_client_endpoint_resource(r,set_param,0,__VA_ARGS__)
|
||||
#define pw_client_endpoint_resource_stream_set_param(r,...) \
|
||||
pw_client_endpoint_resource(r,stream_set_param,0,__VA_ARGS__)
|
||||
#define pw_client_endpoint_resource_create_link(r,...) \
|
||||
pw_client_endpoint_resource(r,create_link,0,__VA_ARGS__)
|
||||
|
||||
int client_endpoint_factory_init(struct pw_module *module);
|
||||
|
||||
|
|
|
|||
|
|
@ -135,25 +135,12 @@ static int endpoint_link_request_state(void *object, enum pw_endpoint_link_state
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int endpoint_link_destroy(void *object)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct resource_data *data = pw_resource_get_user_data(resource);
|
||||
struct endpoint_link *this = data->link;
|
||||
|
||||
pw_client_session_resource_destroy_link(this->client_sess->resource,
|
||||
this->id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pw_endpoint_link_proxy_methods methods = {
|
||||
PW_VERSION_ENDPOINT_LINK_PROXY_METHODS,
|
||||
.subscribe_params = endpoint_link_subscribe_params,
|
||||
.enum_params = endpoint_link_enum_params,
|
||||
.set_param = endpoint_link_set_param,
|
||||
.request_state = endpoint_link_request_state,
|
||||
.destroy = endpoint_link_destroy,
|
||||
};
|
||||
|
||||
static void endpoint_link_notify_subscribed(struct endpoint_link *this,
|
||||
|
|
|
|||
|
|
@ -117,17 +117,32 @@ static int endpoint_set_param (void *object, uint32_t id, uint32_t flags,
|
|||
struct resource_data *data = pw_resource_get_user_data(resource);
|
||||
struct endpoint *this = data->endpoint;
|
||||
|
||||
pw_log_debug("%p", this);
|
||||
pw_client_endpoint_resource_set_param(this->client_ep->resource,
|
||||
id, flags, param);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int endpoint_create_link(void *object, const struct spa_dict *props)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct resource_data *data = pw_resource_get_user_data(resource);
|
||||
struct endpoint *this = data->endpoint;
|
||||
|
||||
pw_log_debug("%p", this);
|
||||
pw_client_endpoint_resource_create_link(this->client_ep->resource,
|
||||
props);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pw_endpoint_proxy_methods methods = {
|
||||
PW_VERSION_ENDPOINT_PROXY_METHODS,
|
||||
.subscribe_params = endpoint_subscribe_params,
|
||||
.enum_params = endpoint_enum_params,
|
||||
.set_param = endpoint_set_param,
|
||||
.create_link = endpoint_create_link,
|
||||
};
|
||||
|
||||
static void endpoint_notify_subscribed(struct endpoint *this,
|
||||
|
|
@ -288,6 +303,7 @@ int endpoint_init(struct endpoint *this,
|
|||
PW_KEY_CLIENT_ID,
|
||||
PW_KEY_DEVICE_ID,
|
||||
PW_KEY_MEDIA_CLASS,
|
||||
PW_KEY_PRIORITY_SESSION,
|
||||
PW_KEY_ENDPOINT_NAME,
|
||||
PW_KEY_ENDPOINT_ICON_NAME,
|
||||
NULL
|
||||
|
|
|
|||
|
|
@ -170,6 +170,8 @@ marshal_pw_endpoint_info(struct spa_pod_builder *b,
|
|||
SPA_POD_Int(info->direction),
|
||||
SPA_POD_Int(info->flags),
|
||||
SPA_POD_Int(info->change_mask),
|
||||
SPA_POD_Int(info->n_streams),
|
||||
SPA_POD_Int(info->session_id),
|
||||
NULL);
|
||||
push_dict(b, info->props);
|
||||
push_param_infos(b, info->n_params, info->params);
|
||||
|
|
@ -191,6 +193,8 @@ do { \
|
|||
SPA_POD_Int(&(info)->direction), \
|
||||
SPA_POD_Int(&(info)->flags), \
|
||||
SPA_POD_Int(&(info)->change_mask), \
|
||||
SPA_POD_Int(&(info)->n_streams), \
|
||||
SPA_POD_Int(&(info)->session_id), \
|
||||
NULL) < 0) \
|
||||
return -EINVAL; \
|
||||
\
|
||||
|
|
@ -369,6 +373,20 @@ static int client_endpoint_marshal_stream_set_param (void *object,
|
|||
return pw_protocol_native_end_resource(resource, b);
|
||||
}
|
||||
|
||||
static int client_endpoint_marshal_create_link (void *object,
|
||||
const struct spa_dict *props)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct spa_pod_builder *b;
|
||||
|
||||
b = pw_protocol_native_begin_resource(resource,
|
||||
PW_CLIENT_ENDPOINT_PROXY_EVENT_CREATE_LINK, NULL);
|
||||
|
||||
push_dict(b, props);
|
||||
|
||||
return pw_protocol_native_end_resource(resource, b);
|
||||
}
|
||||
|
||||
static int client_endpoint_marshal_add_listener(void *object,
|
||||
struct spa_hook *listener,
|
||||
const struct pw_client_endpoint_proxy_events *events,
|
||||
|
|
@ -518,6 +536,22 @@ static int client_endpoint_demarshal_stream_set_param(void *object,
|
|||
stream_set_param, 0, stream_id, id, flags, param);
|
||||
}
|
||||
|
||||
static int client_endpoint_demarshal_create_link(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct spa_pod_parser prs;
|
||||
struct spa_pod_frame f;
|
||||
struct spa_dict props = SPA_DICT_INIT(NULL, 0);
|
||||
|
||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||
|
||||
parse_dict(&prs, &f, &props);
|
||||
|
||||
return pw_proxy_notify(proxy, struct pw_client_endpoint_proxy_events,
|
||||
create_link, 0, &props);
|
||||
}
|
||||
|
||||
static int client_endpoint_demarshal_update(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
|
|
@ -603,6 +637,7 @@ static const struct pw_client_endpoint_proxy_events pw_protocol_native_client_en
|
|||
.set_session_id = client_endpoint_marshal_set_session_id,
|
||||
.set_param = client_endpoint_marshal_set_param,
|
||||
.stream_set_param = client_endpoint_marshal_stream_set_param,
|
||||
.create_link = client_endpoint_marshal_create_link,
|
||||
};
|
||||
|
||||
static const struct pw_protocol_native_demarshal
|
||||
|
|
@ -612,6 +647,7 @@ pw_protocol_native_client_endpoint_event_demarshal[PW_CLIENT_ENDPOINT_PROXY_EVEN
|
|||
[PW_CLIENT_ENDPOINT_PROXY_EVENT_SET_SESSION_ID] = { client_endpoint_demarshal_set_session_id, 0 },
|
||||
[PW_CLIENT_ENDPOINT_PROXY_EVENT_SET_PARAM] = { client_endpoint_demarshal_set_param, 0 },
|
||||
[PW_CLIENT_ENDPOINT_PROXY_EVENT_STREAM_SET_PARAM] = { client_endpoint_demarshal_stream_set_param, 0 },
|
||||
[PW_CLIENT_ENDPOINT_PROXY_EVENT_CREATE_LINK] = { client_endpoint_demarshal_create_link, 0 },
|
||||
};
|
||||
|
||||
static const struct pw_client_endpoint_proxy_methods pw_protocol_native_client_endpoint_method_marshal = {
|
||||
|
|
@ -696,36 +732,6 @@ static int client_session_marshal_link_set_param (void *object,
|
|||
return pw_protocol_native_end_resource(resource, b);
|
||||
}
|
||||
|
||||
static int client_session_marshal_create_link(void *object,
|
||||
const struct spa_dict *props)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct spa_pod_builder *b;
|
||||
|
||||
spa_return_val_if_fail(props, -EINVAL);
|
||||
|
||||
b = pw_protocol_native_begin_resource(resource,
|
||||
PW_CLIENT_SESSION_PROXY_EVENT_CREATE_LINK, NULL);
|
||||
|
||||
push_dict(b, props);
|
||||
|
||||
return pw_protocol_native_end_resource(resource, b);
|
||||
}
|
||||
|
||||
static int client_session_marshal_destroy_link (void *object, uint32_t link_id)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct spa_pod_builder *b;
|
||||
|
||||
b = pw_protocol_native_begin_resource(resource,
|
||||
PW_CLIENT_SESSION_PROXY_EVENT_DESTROY_LINK, NULL);
|
||||
|
||||
spa_pod_builder_add_struct(b,
|
||||
SPA_POD_Int(link_id));
|
||||
|
||||
return pw_protocol_native_end_resource(resource, b);
|
||||
}
|
||||
|
||||
static int client_session_marshal_link_request_state (void *object,
|
||||
uint32_t link_id, uint32_t state)
|
||||
{
|
||||
|
|
@ -875,37 +881,6 @@ static int client_session_demarshal_link_set_param(void *object,
|
|||
link_set_param, 0, link_id, id, flags, param);
|
||||
}
|
||||
|
||||
static int client_session_demarshal_create_link(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct spa_pod_parser prs;
|
||||
struct spa_pod_frame f;
|
||||
struct spa_dict props = SPA_DICT_INIT(NULL, 0);
|
||||
|
||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||
parse_dict(&prs, &f, &props);
|
||||
|
||||
return pw_proxy_notify(proxy, struct pw_client_session_proxy_events,
|
||||
create_link, 0, &props);
|
||||
}
|
||||
|
||||
static int client_session_demarshal_destroy_link(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct spa_pod_parser prs;
|
||||
uint32_t link_id;
|
||||
|
||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||
if (spa_pod_parser_get_struct(&prs,
|
||||
SPA_POD_Int(&link_id)) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
return pw_proxy_notify(proxy, struct pw_client_session_proxy_events,
|
||||
destroy_link, 0, link_id);
|
||||
}
|
||||
|
||||
static int client_session_demarshal_link_request_state(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
|
|
@ -1007,8 +982,6 @@ static const struct pw_client_session_proxy_events pw_protocol_native_client_ses
|
|||
.set_id = client_session_marshal_set_id,
|
||||
.set_param = client_session_marshal_set_param,
|
||||
.link_set_param = client_session_marshal_link_set_param,
|
||||
.create_link = client_session_marshal_create_link,
|
||||
.destroy_link = client_session_marshal_destroy_link,
|
||||
.link_request_state = client_session_marshal_link_request_state,
|
||||
};
|
||||
|
||||
|
|
@ -1018,8 +991,6 @@ pw_protocol_native_client_session_event_demarshal[PW_CLIENT_SESSION_PROXY_EVENT_
|
|||
[PW_CLIENT_SESSION_PROXY_EVENT_SET_ID] = { client_session_demarshal_set_id, 0 },
|
||||
[PW_CLIENT_SESSION_PROXY_EVENT_SET_PARAM] = { client_session_demarshal_set_param, 0 },
|
||||
[PW_CLIENT_SESSION_PROXY_EVENT_LINK_SET_PARAM] = { client_session_demarshal_link_set_param, 0 },
|
||||
[PW_CLIENT_SESSION_PROXY_EVENT_CREATE_LINK] = { client_session_demarshal_create_link, 0 },
|
||||
[PW_CLIENT_SESSION_PROXY_EVENT_DESTROY_LINK] = { client_session_demarshal_destroy_link, 0 },
|
||||
[PW_CLIENT_SESSION_PROXY_EVENT_LINK_REQUEST_STATE] = { client_session_demarshal_link_request_state, 0 },
|
||||
};
|
||||
|
||||
|
|
@ -1167,17 +1138,6 @@ static int endpoint_link_marshal_request_state(void *object,
|
|||
return pw_protocol_native_end_proxy(proxy, b);
|
||||
}
|
||||
|
||||
static int endpoint_link_marshal_destroy(void *object)
|
||||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct spa_pod_builder *b;
|
||||
|
||||
b = pw_protocol_native_begin_proxy(proxy,
|
||||
PW_ENDPOINT_LINK_PROXY_METHOD_DESTROY, NULL);
|
||||
|
||||
return pw_protocol_native_end_proxy(proxy, b);
|
||||
}
|
||||
|
||||
static int endpoint_link_demarshal_info(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
|
|
@ -1294,15 +1254,6 @@ static int endpoint_link_demarshal_request_state(void *object,
|
|||
request_state, 0, state);
|
||||
}
|
||||
|
||||
static int endpoint_link_demarshal_destroy(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
|
||||
return pw_resource_notify(resource, struct pw_endpoint_link_proxy_methods,
|
||||
destroy, 0);
|
||||
}
|
||||
|
||||
static const struct pw_endpoint_link_proxy_events pw_protocol_native_endpoint_link_event_marshal = {
|
||||
PW_VERSION_ENDPOINT_LINK_PROXY_EVENTS,
|
||||
.info = endpoint_link_marshal_info,
|
||||
|
|
@ -1323,7 +1274,6 @@ static const struct pw_endpoint_link_proxy_methods pw_protocol_native_endpoint_l
|
|||
.enum_params = endpoint_link_marshal_enum_params,
|
||||
.set_param = endpoint_link_marshal_set_param,
|
||||
.request_state = endpoint_link_marshal_request_state,
|
||||
.destroy = endpoint_link_marshal_destroy,
|
||||
};
|
||||
|
||||
static const struct pw_protocol_native_demarshal
|
||||
|
|
@ -1334,7 +1284,6 @@ pw_protocol_native_endpoint_link_method_demarshal[PW_ENDPOINT_LINK_PROXY_METHOD_
|
|||
[PW_ENDPOINT_LINK_PROXY_METHOD_ENUM_PARAMS] = { endpoint_link_demarshal_enum_params, 0 },
|
||||
[PW_ENDPOINT_LINK_PROXY_METHOD_SET_PARAM] = { endpoint_link_demarshal_set_param, PW_PERM_W },
|
||||
[PW_ENDPOINT_LINK_PROXY_METHOD_REQUEST_STATE] = { endpoint_link_demarshal_request_state, PW_PERM_W },
|
||||
[PW_ENDPOINT_LINK_PROXY_METHOD_DESTROY] = { endpoint_link_demarshal_destroy, PW_PERM_W },
|
||||
};
|
||||
|
||||
static const struct pw_protocol_marshal pw_protocol_native_endpoint_link_marshal = {
|
||||
|
|
@ -1697,6 +1646,20 @@ static int endpoint_marshal_set_param(void *object,
|
|||
return pw_protocol_native_end_proxy(proxy, b);
|
||||
}
|
||||
|
||||
static int endpoint_marshal_create_link(void *object,
|
||||
const struct spa_dict *props)
|
||||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct spa_pod_builder *b;
|
||||
|
||||
b = pw_protocol_native_begin_proxy(proxy,
|
||||
PW_ENDPOINT_PROXY_METHOD_CREATE_LINK, NULL);
|
||||
|
||||
push_dict(b, props);
|
||||
|
||||
return pw_protocol_native_end_proxy(proxy, b);
|
||||
}
|
||||
|
||||
static int endpoint_demarshal_info(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
|
|
@ -1797,6 +1760,22 @@ static int endpoint_demarshal_set_param(void *object,
|
|||
set_param, 0, id, flags, param);
|
||||
}
|
||||
|
||||
static int endpoint_demarshal_create_link(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct spa_pod_parser prs;
|
||||
struct spa_pod_frame f;
|
||||
struct spa_dict props = SPA_DICT_INIT(NULL, 0);
|
||||
|
||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||
|
||||
parse_dict(&prs, &f, &props);
|
||||
|
||||
return pw_resource_notify(resource, struct pw_endpoint_proxy_methods,
|
||||
create_link, 0, &props);
|
||||
}
|
||||
|
||||
static const struct pw_endpoint_proxy_events pw_protocol_native_endpoint_event_marshal = {
|
||||
PW_VERSION_ENDPOINT_PROXY_EVENTS,
|
||||
.info = endpoint_marshal_info,
|
||||
|
|
@ -1816,6 +1795,7 @@ static const struct pw_endpoint_proxy_methods pw_protocol_native_endpoint_method
|
|||
.subscribe_params = endpoint_marshal_subscribe_params,
|
||||
.enum_params = endpoint_marshal_enum_params,
|
||||
.set_param = endpoint_marshal_set_param,
|
||||
.create_link = endpoint_marshal_create_link,
|
||||
};
|
||||
|
||||
static const struct pw_protocol_native_demarshal
|
||||
|
|
@ -1825,6 +1805,7 @@ pw_protocol_native_endpoint_method_demarshal[PW_ENDPOINT_PROXY_METHOD_NUM] =
|
|||
[PW_ENDPOINT_PROXY_METHOD_SUBSCRIBE_PARAMS] = { endpoint_demarshal_subscribe_params, 0 },
|
||||
[PW_ENDPOINT_PROXY_METHOD_ENUM_PARAMS] = { endpoint_demarshal_enum_params, 0 },
|
||||
[PW_ENDPOINT_PROXY_METHOD_SET_PARAM] = { endpoint_demarshal_set_param, PW_PERM_W },
|
||||
[PW_ENDPOINT_PROXY_METHOD_CREATE_LINK] = { endpoint_demarshal_create_link, PW_PERM_X },
|
||||
};
|
||||
|
||||
static const struct pw_protocol_marshal pw_protocol_native_endpoint_marshal = {
|
||||
|
|
@ -1942,20 +1923,6 @@ static int session_marshal_set_param(void *object,
|
|||
return pw_protocol_native_end_proxy(proxy, b);
|
||||
}
|
||||
|
||||
static int session_marshal_create_link(void *object,
|
||||
const struct spa_dict *props)
|
||||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct spa_pod_builder *b;
|
||||
|
||||
b = pw_protocol_native_begin_proxy(proxy,
|
||||
PW_SESSION_PROXY_METHOD_CREATE_LINK, NULL);
|
||||
|
||||
push_dict(b, props);
|
||||
|
||||
return pw_protocol_native_end_proxy(proxy, b);
|
||||
}
|
||||
|
||||
static int session_demarshal_info(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
|
|
@ -2056,22 +2023,6 @@ static int session_demarshal_set_param(void *object,
|
|||
set_param, 0, id, flags, param);
|
||||
}
|
||||
|
||||
static int session_demarshal_create_link(void *object,
|
||||
const struct pw_protocol_native_message *msg)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct spa_pod_parser prs;
|
||||
struct spa_pod_frame f;
|
||||
struct spa_dict props = SPA_DICT_INIT(NULL, 0);
|
||||
|
||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||
|
||||
parse_dict(&prs, &f, &props);
|
||||
|
||||
return pw_resource_notify(resource, struct pw_session_proxy_methods,
|
||||
create_link, 0, &props);
|
||||
}
|
||||
|
||||
static const struct pw_session_proxy_events pw_protocol_native_session_event_marshal = {
|
||||
PW_VERSION_SESSION_PROXY_EVENTS,
|
||||
.info = session_marshal_info,
|
||||
|
|
@ -2091,7 +2042,6 @@ static const struct pw_session_proxy_methods pw_protocol_native_session_method_m
|
|||
.subscribe_params = session_marshal_subscribe_params,
|
||||
.enum_params = session_marshal_enum_params,
|
||||
.set_param = session_marshal_set_param,
|
||||
.create_link = session_marshal_create_link,
|
||||
};
|
||||
|
||||
static const struct pw_protocol_native_demarshal
|
||||
|
|
@ -2101,7 +2051,6 @@ pw_protocol_native_session_method_demarshal[PW_SESSION_PROXY_METHOD_NUM] =
|
|||
[PW_SESSION_PROXY_METHOD_SUBSCRIBE_PARAMS] = { session_demarshal_subscribe_params, 0 },
|
||||
[PW_SESSION_PROXY_METHOD_ENUM_PARAMS] = { session_demarshal_enum_params, 0 },
|
||||
[PW_SESSION_PROXY_METHOD_SET_PARAM] = { session_demarshal_set_param, PW_PERM_W },
|
||||
[PW_SESSION_PROXY_METHOD_CREATE_LINK] = { session_demarshal_create_link, PW_PERM_W },
|
||||
};
|
||||
|
||||
static const struct pw_protocol_marshal pw_protocol_native_session_marshal = {
|
||||
|
|
|
|||
|
|
@ -123,24 +123,11 @@ static int session_set_param (void *object, uint32_t id, uint32_t flags,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int session_create_link(void *object, const struct spa_dict *props)
|
||||
{
|
||||
struct pw_resource *resource = object;
|
||||
struct resource_data *data = pw_resource_get_user_data(resource);
|
||||
struct session *this = data->session;
|
||||
|
||||
pw_client_session_resource_create_link(this->client_sess->resource,
|
||||
props);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pw_session_proxy_methods methods = {
|
||||
PW_VERSION_SESSION_PROXY_METHODS,
|
||||
.subscribe_params = session_subscribe_params,
|
||||
.enum_params = session_enum_params,
|
||||
.set_param = session_set_param,
|
||||
.create_link = session_create_link,
|
||||
};
|
||||
|
||||
static void session_notify_subscribed(struct session *this,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue