1 | //========================================================================= |
---|
2 | // FILENAME : tagutils-flc.c |
---|
3 | // DESCRIPTION : FLAC metadata reader |
---|
4 | //========================================================================= |
---|
5 | // Copyright (c) 2008- NETGEAR, Inc. All Rights Reserved. |
---|
6 | //========================================================================= |
---|
7 | |
---|
8 | /* |
---|
9 | * This program is free software; you can redistribute it and/or modify |
---|
10 | * it under the terms of the GNU General Public License as published by |
---|
11 | * the Free Software Foundation; either version 2 of the License, or |
---|
12 | * (at your option) any later version. |
---|
13 | * |
---|
14 | * This program is distributed in the hope that it will be useful, |
---|
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
17 | * GNU General Public License for more details. |
---|
18 | * |
---|
19 | * You should have received a copy of the GNU General Public License |
---|
20 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
---|
21 | */ |
---|
22 | |
---|
23 | static int |
---|
24 | _get_flctags(char *filename, struct song_metadata *psong) |
---|
25 | { |
---|
26 | FLAC__Metadata_SimpleIterator *iterator = 0; |
---|
27 | FLAC__StreamMetadata *block; |
---|
28 | unsigned int sec, ms; |
---|
29 | int i; |
---|
30 | int err = 0; |
---|
31 | |
---|
32 | if(!(iterator = FLAC__metadata_simple_iterator_new())) |
---|
33 | { |
---|
34 | DPRINTF(E_FATAL, L_SCANNER, "Out of memory while FLAC__metadata_simple_iterator_new()\n"); |
---|
35 | return -1; |
---|
36 | } |
---|
37 | |
---|
38 | if(!FLAC__metadata_simple_iterator_init(iterator, filename, true, true)) |
---|
39 | { |
---|
40 | DPRINTF(E_ERROR, L_SCANNER, "Cannot extract tag from %s\n", filename); |
---|
41 | return -1; |
---|
42 | } |
---|
43 | |
---|
44 | do { |
---|
45 | if(!(block = FLAC__metadata_simple_iterator_get_block(iterator))) |
---|
46 | { |
---|
47 | DPRINTF(E_ERROR, L_SCANNER, "Cannot extract tag from %s\n", filename); |
---|
48 | err = -1; |
---|
49 | goto _exit; |
---|
50 | } |
---|
51 | |
---|
52 | switch(block->type) |
---|
53 | { |
---|
54 | case FLAC__METADATA_TYPE_STREAMINFO: |
---|
55 | sec = (unsigned int)(block->data.stream_info.total_samples / |
---|
56 | block->data.stream_info.sample_rate); |
---|
57 | ms = (unsigned int)(((block->data.stream_info.total_samples % |
---|
58 | block->data.stream_info.sample_rate) * 1000) / |
---|
59 | block->data.stream_info.sample_rate); |
---|
60 | if ((sec == 0) && (ms == 0)) |
---|
61 | break; /* Info is crap, escape div-by-zero. */ |
---|
62 | psong->song_length = (sec * 1000) + ms; |
---|
63 | psong->bitrate = (((uint64_t)(psong->file_size) * 1000) / (psong->song_length / 8)); |
---|
64 | psong->samplerate = block->data.stream_info.sample_rate; |
---|
65 | psong->channels = block->data.stream_info.channels; |
---|
66 | break; |
---|
67 | |
---|
68 | case FLAC__METADATA_TYPE_VORBIS_COMMENT: |
---|
69 | for(i = 0; i < block->data.vorbis_comment.num_comments; i++) |
---|
70 | { |
---|
71 | vc_scan(psong, |
---|
72 | (char*)block->data.vorbis_comment.comments[i].entry, |
---|
73 | block->data.vorbis_comment.comments[i].length); |
---|
74 | } |
---|
75 | break; |
---|
76 | #if FLAC_API_VERSION_CURRENT >= 10 |
---|
77 | case FLAC__METADATA_TYPE_PICTURE: |
---|
78 | psong->image_size = block->data.picture.data_length; |
---|
79 | if((psong->image = malloc(psong->image_size))) |
---|
80 | memcpy(psong->image, block->data.picture.data, psong->image_size); |
---|
81 | else |
---|
82 | DPRINTF(E_ERROR, L_SCANNER, "Out of memory [%s]\n", filename); |
---|
83 | break; |
---|
84 | #endif |
---|
85 | default: |
---|
86 | break; |
---|
87 | } |
---|
88 | FLAC__metadata_object_delete(block); |
---|
89 | } |
---|
90 | while(FLAC__metadata_simple_iterator_next(iterator)); |
---|
91 | |
---|
92 | _exit: |
---|
93 | if(iterator) |
---|
94 | FLAC__metadata_simple_iterator_delete(iterator); |
---|
95 | |
---|
96 | return err; |
---|
97 | } |
---|
98 | |
---|
99 | static int |
---|
100 | _get_flcfileinfo(char *filename, struct song_metadata *psong) |
---|
101 | { |
---|
102 | psong->lossless = 1; |
---|
103 | psong->vbr_scale = 1; |
---|
104 | |
---|
105 | return 0; |
---|
106 | } |
---|