module-rtp: improve session setup

This commit is contained in:
Wim Taymans 2023-03-01 12:57:57 +01:00
parent 94b67603e5
commit 4ee9696548

View file

@ -344,6 +344,7 @@ static void session_establish(struct session *sess)
case SESSION_STATE_INIT: case SESSION_STATE_INIT:
/* we initiate */ /* we initiate */
sess->we_initiated = true; sess->we_initiated = true;
pw_log_info("start session initiator:%08x", sess->initiator);
if (!sess->ctrl_ready) if (!sess->ctrl_ready)
send_apple_midi_cmd_in(sess, true); send_apple_midi_cmd_in(sess, true);
else if (!sess->data_ready) else if (!sess->data_ready)
@ -364,6 +365,7 @@ static void session_stop(struct session *sess)
{ {
if (!sess->we_initiated) if (!sess->we_initiated)
return; return;
pw_log_info("stop session initiator:%08x", sess->initiator);
if (sess->ctrl_ready) if (sess->ctrl_ready)
send_apple_midi_cmd_by(sess, true); send_apple_midi_cmd_by(sess, true);
if (sess->data_ready) if (sess->data_ready)
@ -379,8 +381,6 @@ static void send_state_changed(void *data, bool started, const char *error)
{ {
struct session *sess = data; struct session *sess = data;
pw_log_info("send initiator:%08x state %d", sess->initiator, started);
if (started) { if (started) {
sess->sending = true; sess->sending = true;
session_establish(sess); session_establish(sess);
@ -607,7 +607,7 @@ static void parse_apple_midi_cmd_in(struct impl *impl, bool ctrl, uint8_t *buffe
pw_log_warn("receive data IN from nonexisting session %08x", initiator); pw_log_warn("receive data IN from nonexisting session %08x", initiator);
success = false; success = false;
} else { } else {
pw_log_info("got data IN request %08x", initiator); pw_log_info("got data IN request %08x, session established", initiator);
sess->remote_ssrc = ssrc; sess->remote_ssrc = ssrc;
sess->data_addr = *sa; sess->data_addr = *sa;
sess->data_len = salen; sess->data_len = salen;
@ -658,7 +658,7 @@ static void parse_apple_midi_cmd_ok(struct impl *impl, bool ctrl, uint8_t *buffe
if (!sess->data_ready) if (!sess->data_ready)
send_apple_midi_cmd_in(sess, false); send_apple_midi_cmd_in(sess, false);
} else { } else {
pw_log_info("got data OK %08x", initiator); pw_log_info("got data OK %08x, session established", initiator);
sess->remote_ssrc = ntohl(hdr->ssrc); sess->remote_ssrc = ntohl(hdr->ssrc);
sess->data_ready = true; sess->data_ready = true;
sess->state = SESSION_STATE_ESTABLISHED; sess->state = SESSION_STATE_ESTABLISHED;
@ -725,7 +725,7 @@ static void parse_apple_midi_cmd_by(struct impl *impl, bool ctrl, uint8_t *buffe
struct session *sess; struct session *sess;
sess = find_session_by_initiator(impl, initiator); sess = find_session_by_initiator(impl, initiator);
if (sess == NULL) { if (sess == NULL || sess->we_initiated) {
pw_log_warn("received BY from nonexisting initiator %08x", initiator); pw_log_warn("received BY from nonexisting initiator %08x", initiator);
return; return;
} }
@ -734,8 +734,9 @@ static void parse_apple_midi_cmd_by(struct impl *impl, bool ctrl, uint8_t *buffe
pw_log_info("got ctrl BY %08x %d", initiator, sess->data_ready); pw_log_info("got ctrl BY %08x %d", initiator, sess->data_ready);
sess->ctrl_ready = false; sess->ctrl_ready = false;
} else { } else {
pw_log_info("got data BY %08x", initiator); pw_log_info("got data BY %08x, session init", initiator);
sess->data_ready = false; sess->data_ready = false;
sess->state = SESSION_STATE_INIT;
} }
} }
@ -1092,7 +1093,7 @@ static struct service *make_service(struct impl *impl, const struct service_info
s->info.port = info->port; s->info.port = info->port;
avahi_address_snprint(at, sizeof(at), &s->info.address); avahi_address_snprint(at, sizeof(at), &s->info.address);
pw_log_info("create session: %s %s:%u", s->info.name, at, s->info.port); pw_log_info("create session: %s %s:%u %s", s->info.name, at, s->info.port, s->info.type);
pw_properties_set(props, "sess.name", s->info.name); pw_properties_set(props, "sess.name", s->info.name);
pw_properties_setf(props, "node.name", "%s (%s IP%d)", pw_properties_setf(props, "node.name", "%s (%s IP%d)",
@ -1223,13 +1224,29 @@ static void browser_cb(AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProt
} }
} }
static const char *get_service_name(struct impl *impl)
{
const char *str;
str = pw_properties_get(impl->props, "rtp.media");
if (spa_streq(str, "midi"))
return "_apple-midi._udp";
else if (spa_streq(str, "audio"))
return "_pipewire-audio._udp";
return NULL;
}
static int make_browser(struct impl *impl) static int make_browser(struct impl *impl)
{ {
const char *service_name;
if ((service_name = get_service_name(impl)) == NULL)
return -ENOTSUP;
if (impl->browser == NULL) { if (impl->browser == NULL) {
impl->browser = avahi_service_browser_new(impl->client, impl->browser = avahi_service_browser_new(impl->client,
AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
"_apple-midi._udp", NULL, 0, service_name, NULL, 0,
browser_cb, impl); browser_cb, impl);
} }
if (impl->browser == NULL) { if (impl->browser == NULL) {
pw_log_error("can't make browser: %s", pw_log_error("can't make browser: %s",
@ -1261,6 +1278,10 @@ static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state,
static int make_announce(struct impl *impl) static int make_announce(struct impl *impl)
{ {
int res; int res;
const char *service_name;
if ((service_name = get_service_name(impl)) == NULL)
return -ENOTSUP;
if (impl->group == NULL) { if (impl->group == NULL) {
impl->group = avahi_entry_group_new(impl->client, impl->group = avahi_entry_group_new(impl->client,
@ -1274,10 +1295,11 @@ static int make_announce(struct impl *impl)
avahi_entry_group_reset(impl->group); avahi_entry_group_reset(impl->group);
res = avahi_entry_group_add_service(impl->group, res = avahi_entry_group_add_service(impl->group,
AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
(AvahiPublishFlags)0, impl->session_name, (AvahiPublishFlags)0, impl->session_name,
"_apple-midi._udp", NULL, NULL, service_name, NULL, NULL,
impl->ctrl_port, NULL); impl->ctrl_port, NULL);
if (res < 0) { if (res < 0) {
pw_log_error("can't add service: %s", pw_log_error("can't add service: %s",
avahi_strerror(avahi_client_errno(impl->client))); avahi_strerror(avahi_client_errno(impl->client)));
@ -1327,7 +1349,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
struct pw_properties *props = NULL, *stream_props = NULL; struct pw_properties *props = NULL, *stream_props = NULL;
uint32_t id = pw_global_get_id(pw_impl_module_get_global(module)); uint32_t id = pw_global_get_id(pw_impl_module_get_global(module));
uint32_t pid = getpid(); uint32_t pid = getpid();
char addr[64];
uint16_t port; uint16_t port;
const char *str; const char *str;
int res = 0; int res = 0;
@ -1428,22 +1449,6 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
str = pw_properties_get(props, "sess.name"); str = pw_properties_get(props, "sess.name");
impl->session_name = str ? strdup(str) : NULL; impl->session_name = str ? strdup(str) : NULL;
pw_properties_set(stream_props, "rtp.session", impl->session_name);
get_ip(&impl->ctrl_addr, addr, sizeof(addr), &impl->ctrl_port);
pw_properties_set(stream_props, "rtp.control.ip", addr);
pw_properties_setf(stream_props, "rtp.control.port", "%u", impl->ctrl_port);
pw_properties_setf(stream_props, "rtp.mtu", "%u", impl->mtu);
pw_properties_setf(stream_props, "rtp.ttl", "%u", impl->ttl);
if ((str = pw_properties_get(props, "rtp.media")) != NULL)
pw_properties_set(stream_props, "rtp.media", str);
if ((str = pw_properties_get(props, "sess.min-ptime")) != NULL)
pw_properties_set(stream_props, "rtp.min-ptime", str);
if ((str = pw_properties_get(props, "sess.max-ptime")) != NULL)
pw_properties_set(stream_props, "rtp.max-ptime", str);
if (impl->ts_refclk != NULL)
pw_properties_set(stream_props, "rtp.ts-refclk", impl->ts_refclk);
impl->core = pw_context_get_object(impl->context, PW_TYPE_INTERFACE_Core); impl->core = pw_context_get_object(impl->context, PW_TYPE_INTERFACE_Core);
if (impl->core == NULL) { if (impl->core == NULL) {
str = pw_properties_get(props, PW_KEY_REMOTE_NAME); str = pw_properties_get(props, PW_KEY_REMOTE_NAME);