Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
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");
  }
}
Exemple #4
0
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);
  }
}