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, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 */ 23 24static int 25_get_flctags(char *filename, struct song_metadata *psong) 26{ 27 FLAC__Metadata_SimpleIterator *iterator = 0; 28 FLAC__StreamMetadata *block; 29 int block_number; 30 unsigned int sec, ms; 31 int i; 32 int err = 0; 33 34 if(!(iterator = FLAC__metadata_simple_iterator_new())) 35 { 36 DPRINTF(E_FATAL, L_SCANNER, "Out of memory while FLAC__metadata_simple_iterator_new()\n"); 37 return -1; 38 } 39 40 block_number = 0; 41 if(!FLAC__metadata_simple_iterator_init(iterator, filename, true, true)) 42 { 43 DPRINTF(E_ERROR, L_SCANNER, "Cannot extract tag from %s\n", filename); 44 return -1; 45 } 46 47 do { 48 if(!(block = FLAC__metadata_simple_iterator_get_block(iterator))) 49 { 50 DPRINTF(E_ERROR, L_SCANNER, "Cannot extract tag from %s\n", filename); 51 err = -1; 52 goto _exit; 53 } 54 55 switch(block->type) 56 { 57 case FLAC__METADATA_TYPE_STREAMINFO: 58 sec = (unsigned int)(block->data.stream_info.total_samples / 59 block->data.stream_info.sample_rate); 60 ms = (unsigned int)(((block->data.stream_info.total_samples % 61 block->data.stream_info.sample_rate) * 1000) / 62 block->data.stream_info.sample_rate); 63 if ((sec == 0) && (ms == 0)) 64 break; /* Info is crap, escape div-by-zero. */ 65 psong->song_length = (sec * 1000) + ms; 66 psong->bitrate = (((uint64_t)(psong->file_size) * 1000) / (psong->song_length / 8)); 67 psong->samplerate = block->data.stream_info.sample_rate; 68 psong->channels = block->data.stream_info.channels; 69 break; 70 71 case FLAC__METADATA_TYPE_VORBIS_COMMENT: 72 for(i = 0; i < block->data.vorbis_comment.num_comments; i++) 73 { 74 vc_scan(psong, 75 (char*)block->data.vorbis_comment.comments[i].entry, 76 block->data.vorbis_comment.comments[i].length); 77 } 78 break; 79#if FLAC_API_VERSION_CURRENT >= 10 80 case FLAC__METADATA_TYPE_PICTURE: 81 psong->image_size = block->data.picture.data_length; 82 if((psong->image = malloc(psong->image_size))) 83 memcpy(psong->image, block->data.picture.data, psong->image_size); 84 else 85 DPRINTF(E_ERROR, L_SCANNER, "Out of memory [%s]\n", filename); 86 break; 87#endif 88 default: 89 break; 90 } 91 FLAC__metadata_object_delete(block); 92 } 93 while(FLAC__metadata_simple_iterator_next(iterator)); 94 95 _exit: 96 if(iterator) 97 FLAC__metadata_simple_iterator_delete(iterator); 98 99 return err; 100} 101 102static int 103_get_flcfileinfo(char *filename, struct song_metadata *psong) 104{ 105 psong->lossless = 1; 106 psong->vbr_scale = 1; 107 108 return 0; 109} 110