module-rtp: improve properties

This commit is contained in:
Wim Taymans 2023-03-01 10:15:08 +01:00
parent 3badf6f3ac
commit 7c04b42e38
2 changed files with 68 additions and 35 deletions

View file

@ -432,36 +432,29 @@ static int get_ip(const struct sockaddr_storage *sa, char *ip, size_t len, uint1
return 0;
}
static struct session *make_session(struct impl *impl, const char *name)
static struct session *make_session(struct impl *impl, struct pw_properties *props)
{
struct session *sess;
char addr[64];
struct pw_properties *props;
uint16_t port = 0;
const char *str;
sess = calloc(1, sizeof(struct session));
if (sess == NULL)
return NULL;
goto error;
spa_list_append(&impl->sessions, &sess->link);
impl->n_sessions++;
sess->impl = impl;
sess->initiator = pw_rand32();
sess->initiator = pw_properties_get_uint32(props, "rtp.initiator", pw_rand32());
sess->ssrc = pw_rand32();
sess->remote_ssrc = pw_properties_get_uint32(props, "rtp.receiver-ssrc", 0);
sess->ts_offset = impl->ts_offset < 0 ? pw_rand32() : impl->ts_offset;
sess->name = strdup(name);
props = pw_properties_copy(impl->stream_props);
if (props == NULL)
return NULL;
str = pw_properties_get(props, "sess.name");
sess->name = str ? strdup(str) : "unknown";
get_ip(&sess->ctrl_addr, addr, sizeof(addr), &port);
pw_properties_set(props, "rtp.destination.ip", addr);
pw_properties_setf(props, "rtp.destination.port", "%u", port);
pw_properties_setf(props, "rtp.ts-offset", "%u", sess->ts_offset);
pw_properties_setf(props, "rtp.sender-ssrc", "%u", sess->ssrc);
pw_properties_setf(props, "rtp.receiver-ssrc", "%u", sess->remote_ssrc);
sess->send = rtp_stream_new(impl->core,
PW_DIRECTION_INPUT, pw_properties_copy(props),
@ -470,7 +463,12 @@ static struct session *make_session(struct impl *impl, const char *name)
PW_DIRECTION_OUTPUT, pw_properties_copy(props),
&recv_stream_events, sess);
pw_properties_free(props);
return sess;
error:
pw_properties_free(props);
return NULL;
}
static struct session *find_session_by_addr_name(struct impl *impl,
@ -532,15 +530,18 @@ static void parse_apple_midi_cmd_in(struct impl *impl, bool ctrl, uint8_t *buffe
}
} else {
pw_log_info("got control IN request %08x", initiator);
sess = make_session(impl, hdr->name);
sess = make_session(impl,
pw_properties_new(
"sess.name", hdr->name,
"rtp.initiator", initiator,
"rtp.receiver-ssrc", ntohl(hdr->ssrc),
NULL));
if (sess == NULL) {
pw_log_warn("failed to make session: %m");
success = false;
}
}
if (success) {
sess->initiator = initiator;
sess->remote_ssrc = ntohl(hdr->ssrc);
sess->ctrl_addr = *sa;
sess->ctrl_len = salen;
sess->ctrl_ready = true;
@ -960,6 +961,20 @@ static int parse_address(const char *address, uint16_t port,
return 0;
}
static void free_service(struct service *s)
{
spa_list_remove(&s->link);
if (s->sess)
free_session(s->sess);
free((char *) s->info.name);
free((char *) s->info.type);
free((char *) s->info.domain);
free((char *) s->info.host_name);
free(s);
}
static struct service *make_service(struct impl *impl, const struct service_info *info,
AvahiStringList *txt)
{
@ -967,11 +982,22 @@ static struct service *make_service(struct impl *impl, const struct service_info
char at[AVAHI_ADDRESS_STR_MAX];
struct session *sess;
int res;
struct pw_properties *props = NULL;
const char *str;
s = calloc(1, sizeof(*s));
if (s == NULL)
return NULL;
s->impl = impl;
spa_list_append(&impl->service_list, &s->link);
props = pw_properties_new(NULL, NULL);
if (props == NULL) {
res = -errno;
goto error;
}
s->info.interface = info->interface;
s->info.protocol = info->protocol;
s->info.name = strdup(info->name);
@ -981,13 +1007,28 @@ static struct service *make_service(struct impl *impl, const struct service_info
s->info.address = info->address;
s->info.port = info->port;
s->impl = impl;
spa_list_append(&impl->service_list, &s->link);
avahi_address_snprint(at, sizeof(at), &s->info.address);
pw_log_info("create session: %s %s:%u", s->info.name, at, s->info.port);
sess = make_session(impl, s->info.name);
pw_properties_set(props, "sess.name", s->info.name);
pw_properties_setf(props, "node.name", "%s (%s IP%d)",
s->info.name, s->info.host_name,
s->info.protocol == AVAHI_PROTO_INET ? 4 : 6);
pw_properties_setf(props, "destination.ip", "%s", at);
pw_properties_setf(props, "destination.port", "%u", s->info.port);
pw_properties_set(props, "rtp.media", "midi");
if ((str = strstr(s->info.name, "@"))) {
str++;
if (strlen(str) > 0)
pw_properties_set(props, PW_KEY_NODE_DESCRIPTION, str);
else
pw_properties_setf(props, PW_KEY_NODE_DESCRIPTION,
"rtp-midi on %s", s->info.host_name);
}
sess = make_session(impl, props);
props = NULL;
if (sess == NULL) {
res = -errno;
pw_log_error("can't create session: %m");
@ -1002,6 +1043,11 @@ static struct service *make_service(struct impl *impl, const struct service_info
pw_log_error("invalid address %s: %s", at, spa_strerror(res));
}
return s;
error:
pw_properties_free(props);
free_service(s);
errno = -res;
return NULL;
}
static struct service *find_service(struct impl *impl, const struct service_info *info)
@ -1018,19 +1064,6 @@ static struct service *find_service(struct impl *impl, const struct service_info
return NULL;
}
static void free_service(struct service *s)
{
spa_list_remove(&s->link);
free_session(s->sess);
free((char *) s->info.name);
free((char *) s->info.type);
free((char *) s->info.domain);
free((char *) s->info.host_name);
free(s);
}
static void resolver_cb(AvahiServiceResolver *r, AvahiIfIndex interface, AvahiProtocol protocol,
AvahiResolverEvent event, const char *name, const char *type, const char *domain,
const char *host_name, const AvahiAddress *a, uint16_t port, AvahiStringList *txt,

View file

@ -332,7 +332,6 @@ struct rtp_stream *rtp_stream_new(struct pw_core *core,
break;
}
pw_properties_setf(props, "rtp.media", "%s", impl->format_info->media_type);
pw_properties_setf(props, "rtp.mime", "%s", impl->format_info->mime);
if (direction == PW_DIRECTION_INPUT)
@ -341,6 +340,7 @@ struct rtp_stream *rtp_stream_new(struct pw_core *core,
impl->ssrc = pw_properties_get_uint32(props, "rtp.receiver-ssrc", pw_rand32());
impl->payload = pw_properties_get_uint32(props, "rtp.payload", impl->payload);
impl->mtu = pw_properties_get_uint32(props, "rtp.mtu", DEFAULT_MTU);
impl->ts_offset = pw_properties_get_uint32(props, "rtp.ts-offset", 0);
str = pw_properties_get(props, "rtp.min-ptime");
if (!spa_atof(str, &min_ptime))