34 #include <FLAC/format.h>
35 #include <FLAC/metadata.h>
37 #ifdef HAVE_SYS_STAT_H
54 const char *
const ext = strrchr(filename,
'.');
55 if (ext && (!strncasecmp(ext,
".fla", 4)))
75 const char *
const filename)
80 FLAC__StreamMetadata streaminfo;
81 FLAC__Metadata_SimpleIterator *iterator;
83 if (!
flac_ext_check(filename) || !FLAC__metadata_get_streaminfo(filename, &streaminfo))
86 fstat(fileno(in), &filestat);
95 p->
size = filestat.st_size;
96 p->
mtime = filestat.st_mtime;
105 p->
bitrate = (8 * filestat.st_size) / (streaminfo.data.stream_info.total_samples / streaminfo.data.stream_info.sample_rate);
106 p->
length = (
unsigned short)(streaminfo.data.stream_info.total_samples / streaminfo.data.stream_info.sample_rate);
107 p->
freq = streaminfo.data.stream_info.sample_rate;
110 iterator = FLAC__metadata_simple_iterator_new();
115 if (FLAC__metadata_simple_iterator_init(iterator, filename,
true,
true)) {
116 FLAC__StreamMetadata *block = NULL;
117 const FLAC__StreamMetadata_VorbisComment *vc = NULL;
118 register unsigned short i;
120 if(FLAC__metadata_simple_iterator_get_block_type(iterator) != FLAC__METADATA_TYPE_VORBIS_COMMENT)
123 block = FLAC__metadata_simple_iterator_get_block(iterator);
128 vc = &block->data.vorbis_comment;
129 for(i = 0; i < vc->num_comments; i++) {
130 if (!strncasecmp((
char *)vc->comments[i].entry,
"album=", 6))
131 p->
album =
apr_pstrndup(pool, (
char *)vc->comments[i].entry+6, vc->comments[i].length-6);
132 else if (!strncasecmp((
char *)vc->comments[i].entry,
"artist=", 7))
133 p->
artist =
apr_pstrndup(pool, (
char *)vc->comments[i].entry+7, vc->comments[i].length-7);
134 else if (!strncasecmp((
char *)vc->comments[i].entry,
"title=", 6))
135 p->
title =
apr_pstrndup(pool, (
char *)vc->comments[i].entry+6, vc->comments[i].length-6);
136 else if (!strncasecmp((
char *)vc->comments[i].entry,
"tracknumber=", 12))
137 p->
track = atoi((
char *)vc->comments[i].entry+12);
138 else if (!strncasecmp((
char *)vc->comments[i].entry,
"discnumber=", 11))
139 p->
posn = atoi((
char *)vc->comments[i].entry+11);
140 else if (!strncasecmp((
char *)vc->comments[i].entry,
"date=", 5))
141 p->
date = atoi((
char *)vc->comments[i].entry+5);
143 FLAC__metadata_object_delete(block);
146 }
while (FLAC__metadata_simple_iterator_next(iterator));
148 FLAC__metadata_simple_iterator_delete(iterator);