static void snra_client_finalize (GObject * object) { SnraClient *client = (SnraClient *) (object); if (client->avahi_sb) avahi_service_browser_free (client->avahi_sb); if (client->avahi_client) avahi_client_free (client->avahi_client); if (client->glib_poll) avahi_glib_poll_free (client->glib_poll); if (client->net_clock) gst_object_unref (client->net_clock); if (client->soup) g_object_unref (client->soup); if (client->json) g_object_unref (client->json); if (client->player) { GstBus *bus = gst_element_get_bus (client->player); gst_bus_remove_signal_watch (bus); gst_object_unref (bus); gst_object_unref (client->player); } g_free (client->server_host); g_free (client->connected_server); g_free (client->uri); g_free (client->language); free_player_info (client->player_info); G_OBJECT_CLASS (snra_client_parent_class)->finalize (object); }
static void aur_client_finalize (GObject * object) { AurClient *client = (AurClient *) (object); #if HAVE_AVAHI if (client->avahi_sb) avahi_service_browser_free (client->avahi_sb); if (client->avahi_client) avahi_client_free (client->avahi_client); if (client->glib_poll) avahi_glib_poll_free (client->glib_poll); #endif if (client->net_clock) gst_object_unref (client->net_clock); if (client->soup) g_object_unref (client->soup); if (client->json) g_object_unref (client->json); if (client->player) { gst_object_unref (client->player); } if (client->context) g_main_context_unref (client->context); g_free (client->server_host); g_free (client->connected_server); g_free (client->uri); g_free (client->language); free_player_info (client->player_info); G_OBJECT_CLASS (aur_client_parent_class)->finalize (object); }
static void handle_connection_closed_cb (G_GNUC_UNUSED SoupSession * session, SoupMessage * msg, AurClient * client) { AurClientFlags flag = get_flag_from_msg (msg); client->connecting &= ~flag; if (client->idle_timeout) { g_source_remove (client->idle_timeout); client->idle_timeout = 0; } if (msg->status_code == SOUP_STATUS_CANCELLED) return; if (client->was_connected & flag) { g_print ("%s disconnected from server. Reason %s status %d\n", flag == AUR_CLIENT_PLAYER ? "Player" : "Controller", msg->reason_phrase, msg->status_code); } client->was_connected &= ~flag; if (flag == AUR_CLIENT_PLAYER && client->player) gst_element_set_state (client->player, GST_STATE_READY); if (client->player_info) { free_player_info (client->player_info); client->player_info = NULL; g_signal_emit (client, signals[SIGNAL_PLAYER_INFO_CHANGED], 0); } if (client->timeout == 0) { client->timeout = g_timeout_add_seconds (1, (GSourceFunc) try_reconnect, client); } if (!client->was_connected) { g_free (client->connected_server); client->connected_server = NULL; client->connected_port = 0; client->paused = TRUE; client->enabled = FALSE; g_object_notify (G_OBJECT (client), "paused"); g_object_notify (G_OBJECT (client), "enabled"); g_object_notify (G_OBJECT (client), "connected-server"); } }
static void handle_player_info (G_GNUC_UNUSED SoupSession *session, SoupMessage *msg, SnraClient *client) { SoupBuffer *buffer; if (msg->status_code < 200 || msg->status_code >= 300) return; buffer = soup_message_body_flatten (msg->response_body); if (json_parser_load_from_data (client->json, buffer->data, buffer->length, NULL)) { const GValue *v1; GArray *player_info = NULL; gsize i; JsonNode *root = json_parser_get_root (client->json); GstStructure *s1 = snra_json_to_gst_structure (root); if (s1 == NULL) return; /* Invalid chunk */ v1 = gst_structure_get_value (s1, "player-clients"); if (!GST_VALUE_HOLDS_ARRAY (v1)) goto failed; player_info = g_array_sized_new (TRUE, TRUE, sizeof (SnraPlayerInfo), gst_value_array_get_size (v1)); for (i = 0; i < gst_value_array_get_size (v1); i++) { SnraPlayerInfo info; const GValue *v2 = gst_value_array_get_value (v1, i); const GstStructure *s2; gint64 client_id; if (!GST_VALUE_HOLDS_STRUCTURE (v2)) goto failed; s2 = gst_value_get_structure (v2); if (!snra_json_structure_get_int64 (s2, "client-id", &client_id)) goto failed; info.id = client_id; if (!snra_json_structure_get_boolean (s2, "enabled", &info.enabled)) goto failed; if (!snra_json_structure_get_double (s2, "volume", &info.volume)) goto failed; if (!(info.host = g_strdup (gst_structure_get_string (s2, "host")))) goto failed; g_array_append_val (player_info, info); } free_player_info (client->player_info); client->player_info = player_info; player_info = NULL; g_signal_emit (client, signals[SIGNAL_PLAYER_INFO_CHANGED], 0); failed: if (player_info) free_player_info (player_info); gst_structure_free (s1); } }