static int publish_all_services(struct userdata *u) { pa_sink *sink; pa_source *source; int r = -1; uint32_t idx; pa_assert(u); pa_log_debug("Publishing services in Zeroconf"); for (sink = PA_SINK(pa_idxset_first(u->core->sinks, &idx)); sink; sink = PA_SINK(pa_idxset_next(u->core->sinks, &idx))) if (!shall_ignore(PA_OBJECT(sink))) publish_service(get_service(u, PA_OBJECT(sink))); for (source = PA_SOURCE(pa_idxset_first(u->core->sources, &idx)); source; source = PA_SOURCE(pa_idxset_next(u->core->sources, &idx))) if (!shall_ignore(PA_OBJECT(source))) publish_service(get_service(u, PA_OBJECT(source))); if (publish_main_service(u) < 0) goto fail; r = 0; fail: return r; }
static pa_hook_result_t device_new_or_changed_cb(pa_core *c, pa_object *o, struct userdata *u) { pa_assert(c); pa_object_assert_ref(o); if (!shall_ignore(o)) publish_service(get_service(u, o)); return PA_HOOK_OK; }
static int publish_all_services(struct userdata *u) { pa_sink *sink; pa_source *source; uint32_t idx; pa_assert(u); pa_log_debug("Publishing services in Bonjour"); for (sink = PA_SINK(pa_idxset_first(u->core->sinks, &idx)); sink; sink = PA_SINK(pa_idxset_next(u->core->sinks, &idx))) if (!shall_ignore(PA_OBJECT(sink))) publish_service(get_service(u, PA_OBJECT(sink))); for (source = PA_SOURCE(pa_idxset_first(u->core->sources, &idx)); source; source = PA_SOURCE(pa_idxset_next(u->core->sources, &idx))) if (!shall_ignore(PA_OBJECT(source))) publish_service(get_service(u, PA_OBJECT(source))); return publish_main_service(u); }
/* Runs in Avahi mainloop context */ static void service_entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, void *userdata) { struct service *s = userdata; pa_assert(s); switch (state) { case AVAHI_ENTRY_GROUP_ESTABLISHED: pa_log_info("Successfully established service %s.", s->service_name); break; case AVAHI_ENTRY_GROUP_COLLISION: { char *t; t = avahi_alternative_service_name(s->service_name); pa_log_info("Name collision, renaming %s to %s.", s->service_name, t); pa_xfree(s->service_name); s->service_name = t; publish_service(NULL, s); break; } case AVAHI_ENTRY_GROUP_FAILURE: { pa_log("Failed to register service: %s", avahi_strerror(avahi_client_errno(avahi_entry_group_get_client(g)))); avahi_entry_group_free(g); s->entry_group = NULL; break; } case AVAHI_ENTRY_GROUP_UNCOMMITED: case AVAHI_ENTRY_GROUP_REGISTERING: ; } }