static void cd_get_tracks (cdda_t *cd, cddb_disc_t *disc) { cddb_track_t *track; int i = 0; if (!cd || !disc) return; for (track = cddb_disc_get_track_first (disc); track; track = cddb_disc_get_track_next (disc)) { char name[128]; int length; length = cddb_track_get_length (track); snprintf (name, 128, "%02d. %s (%02d:%02d)", cddb_track_get_number (track), cddb_track_get_title (track), (length / 60), (length % 60)); cd->tracks[i]->name = strdup (name); i++; } }
static void cddb_thread (void *items_i) { struct cddb_thread_params *params = (struct cddb_thread_params*)items_i; DB_playItem_t **items = params->items; trace ("calling resolve_disc\n"); cddb_disc_t* disc = resolve_disc (params->cdio); if (!disc) { trace ("disc not resolved\n"); if (params->cdio) { cdio_destroy (params->cdio); } free (params); return; } trace ("disc resolved\n"); const char *disc_title = cddb_disc_get_title (disc); const char *artist = cddb_disc_get_artist (disc); trace ("disc_title=%s, disk_artist=%s\n", disc_title, artist); cddb_track_t *track; int i; // FIXME: playlist must be locked before doing that int trk = 1; for (i = 0, track = cddb_disc_get_track_first (disc); items[i]; trk++, ++i, track = cddb_disc_get_track_next (disc)) { // FIXME: problem will happen here if item(s) were deleted from playlist, and new items were added in their places // possible solutions: catch EV_TRACKDELETED and mark item(s) in every thread as NULL trace ("track %d, artist=%s, album=%s, title=%s\n", i, artist, disc_title, cddb_track_get_title (track)); deadbeef->pl_delete_all_meta (items[i]); deadbeef->pl_add_meta (items[i], "artist", artist); deadbeef->pl_add_meta (items[i], "album", disc_title); deadbeef->pl_add_meta (items[i], "title", cddb_track_get_title (track)); char tmp[5]; snprintf (tmp, sizeof (tmp), "%02d", trk); deadbeef->pl_add_meta (items[i], "track", tmp); ddb_event_track_t *ev = (ddb_event_track_t *)deadbeef->event_alloc (DB_EV_TRACKINFOCHANGED); ev->track = items[i]; if (ev->track) { deadbeef->pl_item_ref (ev->track); } deadbeef->event_send ((ddb_event_t *)ev, 0, 0); } cddb_disc_destroy (disc); cleanup_thread_params (params); ddb_playlist_t *plt = deadbeef->plt_get_curr (); if (plt) { deadbeef->plt_modified (plt); deadbeef->plt_unref (plt); } deadbeef->sendmessage (DB_EV_PLAYLISTCHANGED, 0, 0, 0); }