static Tuple *probe_for_tuple(const char *filename, VFSFile *file) { int song = -1; unsigned char module[ASAPInfo_MAX_MODULE_LENGTH]; int module_len; ASAPInfo *info = NULL; Tuple *tuple = NULL; int songs; int duration; int year; #if _AUD_PLUGIN_VERSION >= 10 char *real_filename = filename_split_subtune(filename, &song); if (real_filename != NULL) filename = real_filename; #endif module_len = load_module(filename, file, module); if (module_len > 0) { info = ASAPInfo_New(); if (info != NULL && ASAPInfo_Load(info, filename, module, module_len)) tuple = tuple_new_from_filename(filename); } #if _AUD_PLUGIN_VERSION >= 10 g_free(real_filename); #endif if (tuple == NULL) { ASAPInfo_Delete(info); return NULL; } tuple_set_nonblank(tuple, FIELD_ARTIST, ASAPInfo_GetAuthor(info)); tuple_set_nonblank(tuple, FIELD_TITLE, ASAPInfo_GetTitleOrFilename(info)); tuple_set_nonblank(tuple, FIELD_DATE, ASAPInfo_GetDate(info)); tuple_set_str(tuple, FIELD_CODEC, NULL, "ASAP"); songs = ASAPInfo_GetSongs(info); if (song > 0) { tuple_set_int(tuple, FIELD_SUBSONG_ID, NULL, song); tuple_set_int(tuple, FIELD_SUBSONG_NUM, NULL, songs); song--; } else { if (songs > 1) { #if _AUD_PLUGIN_VERSION >= 37 tuple_set_subtunes(tuple, songs, NULL); #else tuple->nsubtunes = songs; #endif } song = ASAPInfo_GetDefaultSong(info); } duration = ASAPInfo_GetDuration(info, song); if (duration > 0) tuple_set_int(tuple, FIELD_LENGTH, NULL, duration); year = ASAPInfo_GetYear(info); if (year > 0) tuple_set_int(tuple, FIELD_YEAR, NULL, year); ASAPInfo_Delete(info); return tuple; }
static void xs_fill_subtunes(Tuple *tuple, xs_tuneinfo_t *info) { int count, found; int subtunes[info->nsubTunes]; for (found = count = 0; count < info->nsubTunes; count++) { if (count + 1 == info->startTune || !xs_cfg.subAutoMinOnly || info->subTunes[count].tuneLength < 0 || info->subTunes[count].tuneLength >= xs_cfg.subAutoMinTime) subtunes[found ++] = count + 1; } tuple_set_subtunes (tuple, found, subtunes); }
/* thread safe */ static Tuple * make_tuple (const gchar * filename, VFSFile * file) { Tuple *tuple = NULL; gint trackno; g_mutex_lock (mutex); if (trackinfo == NULL) refresh_trackinfo (TRUE); if (trackinfo == NULL) goto DONE; if (!strcmp (filename, "cdda://")) { tuple = tuple_new_from_filename (filename); gint subtunes[n_audio_tracks]; gint i = 0; /* only add the audio tracks to the playlist */ for (trackno = firsttrackno; trackno <= lasttrackno; trackno++) if (cdda_track_audiop (pcdrom_drive, trackno)) subtunes[i ++] = trackno; tuple_set_subtunes (tuple, n_audio_tracks, subtunes); goto DONE; } trackno = find_trackno_from_filename (filename); if (trackno < firsttrackno || trackno > lasttrackno) { warn ("Track %d not found.\n", trackno); goto DONE; } if (!cdda_track_audiop (pcdrom_drive, trackno)) { warn ("Track %d is a data track.\n", trackno); goto DONE; } tuple = tuple_new_from_filename (filename); tuple_set_format (tuple, _("Audio CD"), 2, 44100, 1411); if (strlen (trackinfo[trackno].performer)) { tuple_set_str (tuple, FIELD_ARTIST, NULL, trackinfo[trackno].performer); } if (strlen (trackinfo[0].name)) { tuple_set_str (tuple, FIELD_ALBUM, NULL, trackinfo[0].name); } if (strlen (trackinfo[trackno].name)) { tuple_set_str (tuple, FIELD_TITLE, NULL, trackinfo[trackno].name); } tuple_set_int (tuple, FIELD_TRACK_NUMBER, NULL, trackno); tuple_set_int (tuple, FIELD_LENGTH, NULL, calculate_track_length (trackinfo[trackno]. startlsn, trackinfo[trackno]. endlsn)); if (strlen (trackinfo[trackno].genre)) { tuple_set_str (tuple, FIELD_GENRE, NULL, trackinfo[trackno].genre); } DONE: g_mutex_unlock (mutex); return tuple; }