Mercurial > audlegacy
diff Plugins/Input/cue/cuesheet.c @ 1468:5e2482d471ec trunk
[svn] - tuple builder
author | nenolod |
---|---|
date | Wed, 02 Aug 2006 19:24:40 -0700 |
parents | 6fd38612425b |
children | 27b62d78f35e |
line wrap: on
line diff
--- a/Plugins/Input/cue/cuesheet.c Wed Aug 02 18:56:53 2006 -0700 +++ b/Plugins/Input/cue/cuesheet.c Wed Aug 02 19:24:40 2006 -0700 @@ -38,6 +38,8 @@ static gint get_time(void); static void seek(gint time); static void stop(void); +static TitleInput *get_tuple(gchar *uri); +static TitleInput *get_tuple_uri(gchar *uri); static gchar *cue_performer = NULL; static gchar *cue_title = NULL; @@ -82,9 +84,7 @@ NULL, /* XXX get_song_info iface */ NULL, NULL, -#if 0 get_tuple, -#endif NULL }; @@ -99,16 +99,16 @@ ext = strrchr(filename, '.'); - if (!strncasecmp(ext, ".cue", 4)) + if (!strncasecmp(ext, ".cue", 4) && ext + 5 == '\0') { gint i; FILE *f = fopen(filename, "rb"); - ret = FALSE; + ret = TRUE; /* add the files, build cue urls, etc. */ cache_cue_file(f); - for (i = 0; i < last_cue_track; i++) + for (i = 1; i < last_cue_track; i++) { gchar _buf[65535]; @@ -130,9 +130,75 @@ static void play(gchar *uri) { + /* this isn't a cue:// uri? */ + if (strncasecmp("cue://", uri, 6)) + { + gchar *tmp = g_strdup_printf("cue://%s?0", uri); + play_cue_uri(tmp); + g_free(tmp); + return; + } + play_cue_uri(uri); } +static TitleInput *get_tuple(gchar *uri) +{ + TitleInput *ret; + + /* this isn't a cue:// uri? */ + if (strncasecmp("cue://", uri, 6)) + { + gchar *tmp = g_strdup_printf("cue://%s?0", uri); + ret = get_tuple_uri(tmp); + g_free(tmp); + return ret; + } + + return get_tuple_uri(uri); +} + +static TitleInput *get_tuple_uri(gchar *uri) +{ + gchar *path2 = g_strdup(uri + 6); + gchar *_path = strchr(path2, '?'); + gint track = 0; + FILE *f; + InputPlugin *dec; + TitleInput *phys_tuple, *out; + + if (_path != NULL && *_path == '?') + { + *_path = '\0'; + _path++; + track = atoi(_path); + } + + f = fopen(path2, "rb"); + cache_cue_file(f); + fclose(f); + + dec = input_check_file(cue_file, FALSE); + + if (dec == NULL) + return NULL; + + phys_tuple = dec->get_song_tuple(path2); + + out = bmp_title_input_new(); + + out->genre = g_strdup(phys_tuple->genre); + out->album_name = g_strdup(phys_tuple->album_name); + out->length = phys_tuple->length; + + bmp_title_input_free(phys_tuple); + + out->track_name = cue_tracks[track].title; + out->performer = cue_tracks[track].performer; + + return out; +} + static void seek(gint time) { if (real_ip != NULL) @@ -143,6 +209,8 @@ { if (real_ip != NULL) real_ip->stop(); + + free_cue_info(); } static void play_cue_uri(gchar *uri) @@ -167,13 +235,12 @@ if (real_ip != NULL) { -/* set_current_input_plugin(real_ip); */ real_ip->output = cue_ip.output; real_ip->play_file(cue_file); - real_ip->seek(cue_tracks[track].index / 1000); + real_ip->seek(cue_tracks[track].index / 1000); /* XXX: seek doesn't use frames? strange... -nenolod */ } - free_cue_info(); + cur_cue_track = track; } InputPlugin *get_iplugin_info(void)