aboutsummaryrefslogtreecommitdiffstats
path: root/src/decoder/_flac_common.c
diff options
context:
space:
mode:
authorJochen Keil <jochen.keil@gmail.com>2009-03-08 20:16:53 +0100
committerMax Kellermann <max@duempel.org>2009-03-09 07:58:44 +0100
commit706112bb885b653d4084fe8bdbbb5bb2ca9c9905 (patch)
tree16da90eaa192f2e60a785b71d96e90a090e5ea01 /src/decoder/_flac_common.c
parentab3d89f484d7997e3f6dc0d4bb42c1da9377ba40 (diff)
downloadmpd-706112bb885b653d4084fe8bdbbb5bb2ca9c9905.tar.gz
mpd-706112bb885b653d4084fe8bdbbb5bb2ca9c9905.tar.xz
mpd-706112bb885b653d4084fe8bdbbb5bb2ca9c9905.zip
Initial support for embedded cue sheets found in flac files
So far only seekpoints are supported, so no proper tagging yet except for track number and track length. Tagging should be done by parsing the cue sheet which is often embedded as vorbis comment in flac files. Furthermore the pathname should be configurable like "%A - %t - %T", where %A means Artist, %t track number and %T Title or so.
Diffstat (limited to '')
-rw-r--r--src/decoder/_flac_common.c54
1 files changed, 51 insertions, 3 deletions
diff --git a/src/decoder/_flac_common.c b/src/decoder/_flac_common.c
index 24c766ddb..6d432f69c 100644
--- a/src/decoder/_flac_common.c
+++ b/src/decoder/_flac_common.c
@@ -23,9 +23,6 @@
#include <glib.h>
-#include <FLAC/format.h>
-#include <FLAC/metadata.h>
-
#include <assert.h>
void
@@ -349,3 +346,54 @@ flac_common_write(struct flac_data *data, const FLAC__Frame * frame,
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}
+
+#if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT > 7
+
+char*
+flac_cue_track( const char* pathname,
+ const unsigned int tnum)
+{
+ FLAC__StreamMetadata* cs = FLAC__metadata_object_new(FLAC__METADATA_TYPE_CUESHEET);
+
+ FLAC__metadata_get_cuesheet(pathname, &cs);
+
+ if (cs == NULL)
+ return NULL;
+
+ if (cs->data.cue_sheet.num_tracks <= 1)
+ {
+ FLAC__metadata_object_delete(cs);
+ return NULL;
+ }
+
+ if (tnum > 0 && tnum < cs->data.cue_sheet.num_tracks)
+ {
+ char* track = g_strdup_printf("track_%03u.flac", tnum);
+
+ FLAC__metadata_object_delete(cs);
+
+ return track;
+ }
+ else
+ {
+ FLAC__metadata_object_delete(cs);
+ return NULL;
+ }
+}
+
+unsigned int
+flac_vtrack_tnum(const char* fname)
+{
+ /* find last occurrence of '_' in fname
+ * which is hopefully something like track_xxx.flac
+ * another/better way would be to use tag struct
+ */
+ char* ptr = strrchr(fname, '_');
+
+ // copy ascii tracknumber to int
+ char vtrack[4];
+ g_strlcpy(vtrack, ++ptr, 4);
+ return (unsigned int)strtol(vtrack, NULL, 10);
+}
+
+#endif /* FLAC_API_VERSION_CURRENT >= 7 */