X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mp3_afh.c;h=728b25b81f94aa177a1e74ae01fca07419f7fe90;hp=382b0e9091c4cb3d6679f9779ad6faff9fb1fe15;hb=HEAD;hpb=073076f4e54b35ee96cfab0c4a47b40126f24213 diff --git a/mp3_afh.c b/mp3_afh.c index 382b0e90..56f28a09 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -1,8 +1,4 @@ -/* - * Copyright (C) 2003 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2003 Andre Noll , see file COPYING. */ /** \file mp3_afh.c para_server's mp3 audio format handler */ @@ -41,9 +37,6 @@ struct mp3header { unsigned int freq; unsigned int padding; unsigned int mode; - unsigned int copyright; - unsigned int original; - unsigned int emphasis; }; static const int frequencies[3][4] = { @@ -67,8 +60,6 @@ static const int mp3info_bitrate[2][3][14] = { }; static const int frame_size_index[] = {24000, 72000, 72000}; -static const char *mode_text[] = {"stereo", "joint stereo", "dual channel", "mono", "invalid"}; - #ifdef HAVE_ID3TAG #include @@ -238,7 +229,7 @@ static int replace_tag(char const *id, const char *val, struct id3_tag *id3_t, if (!val || !*val) return 0; fr = id3_frame_new(id); - PARA_DEBUG_LOG("frame desc: %s, %d fields\n", fr->description, fr->nfields); + PARA_DEBUG_LOG("frame desc: %s, %u fields\n", fr->description, fr->nfields); /* Frame 0 contains the encoding. We always use UTF-8. */ field = id3_frame_field(fr, 0); @@ -354,7 +345,7 @@ static int mp3_rewrite_tags(const char *map, size_t mapsize, if (ret < 0) goto out; new_v2size = id3_tag_render(v2_tag, NULL); - v2_buffer = para_malloc(new_v2size); + v2_buffer = alloc(new_v2size); id3_tag_render(v2_tag, v2_buffer); PARA_INFO_LOG("writing v2 tag (%lu bytes)\n", new_v2size); ret = write_all(fd, (char *)v2_buffer, new_v2size); @@ -437,10 +428,13 @@ static int header_frequency(struct mp3header *h) return frequencies[h->version][h->freq]; } -static const char *header_mode(struct mp3header *h) +static const char *header_mode(const struct mp3header *h) { - if (h->mode > 4) - h->mode = 4; /* invalid */ + const char * const mode_text[] = {"stereo", "joint stereo", + "dual channel", "mono"}; + + if (h->mode >= ARRAY_SIZE(mode_text)) + return "invalid"; return mode_text[h->mode]; } @@ -476,7 +470,7 @@ static int frame_length(struct mp3header *header) + header->padding; } -static int compare_headers(struct mp3header *h1,struct mp3header *h2) +static int compare_headers(struct mp3header *h1, struct mp3header *h2) { if ((*(unsigned int*)h1) == (*(unsigned int*)h2)) return 1; @@ -484,10 +478,7 @@ static int compare_headers(struct mp3header *h1,struct mp3header *h2) (h1->layer == h2->layer) && (h1->crc == h2->crc) && (h1->freq == h2->freq) && - (h1->mode == h2->mode) && - (h1->copyright == h2->copyright) && - (h1->original == h2->original) && - (h1->emphasis == h2->emphasis)) + (h1->mode == h2->mode)) return 1; return 0; } @@ -601,7 +592,7 @@ static int mp3_read_info(unsigned char *map, size_t numbytes, int fd, const char *tag_versions[] = {"no", "id3v1", "id3v2", "id3v1+id3v2"}; afhi->chunks_total = 0; - afhi->chunk_table = para_malloc(chunk_table_size * sizeof(uint32_t)); + afhi->chunk_table = arr_alloc(chunk_table_size, sizeof(uint32_t)); while (1) { int freq, br; struct timeval tmp, cct; /* current chunk time */ @@ -636,8 +627,8 @@ static int mp3_read_info(unsigned char *map, size_t numbytes, int fd, total_time = tmp; if (afhi->chunks_total >= chunk_table_size) { chunk_table_size *= 2; - afhi->chunk_table = para_realloc(afhi->chunk_table, - chunk_table_size * sizeof(uint32_t)); + afhi->chunk_table = arr_realloc(afhi->chunk_table, + chunk_table_size, sizeof(uint32_t)); } afhi->chunk_table[afhi->chunks_total] = fpos; afhi->chunks_total++; @@ -655,14 +646,14 @@ static int mp3_read_info(unsigned char *map, size_t numbytes, int fd, afhi->channels = header_channels(&header); afhi->seconds_total = (tv2ms(&total_time) + 500) / 1000; tv_divide(afhi->chunks_total, &total_time, &afhi->chunk_tv); - PARA_DEBUG_LOG("%" PRIu32 "chunks, each %lums\n", afhi->chunks_total, + PARA_DEBUG_LOG("%" PRIu32 " chunks, each %lums\n", afhi->chunks_total, tv2ms(&afhi->chunk_tv)); + set_max_chunk_size(afhi); ret = mp3_get_id3(map, numbytes, fd, &afhi->tags); afhi->techinfo = make_message("%cbr, %s, %s tags", vbr? 'v' : 'c', header_mode(&header), tag_versions[ret]); return 1; err_out: - PARA_ERROR_LOG("%s\n", para_strerror(-ret)); free(afhi->chunk_table); return ret; } @@ -678,7 +669,7 @@ static int mp3_get_file_info(char *map, size_t numbytes, int fd, ret = mp3_read_info((unsigned char *)map, numbytes, fd, afhi); if (ret < 0) return ret; - if (afhi->seconds_total < 2 || !afhi->chunks_total) + if (afhi->chunks_total == 0) return -E_MP3_INFO; return 1; } @@ -686,15 +677,14 @@ static int mp3_get_file_info(char *map, size_t numbytes, int fd, static const char * const mp3_suffixes[] = {"mp3", NULL}; /** - * the init function of the mp3 audio format handler + * The mp3 audio format handler. * - * \param afh pointer to the struct to initialize + * It does not depend on any libraries and is hence always compiled in. */ -void mp3_init(struct audio_format_handler *afh) -{ - afh->get_file_info = mp3_get_file_info; - afh->suffixes = mp3_suffixes; +const struct audio_format_handler mp3_afh = { + .get_file_info = mp3_get_file_info, + .suffixes = mp3_suffixes, #ifdef HAVE_LIBID3TAG - afh->rewrite_tags = mp3_rewrite_tags; + .rewrite_tags = mp3_rewrite_tags, #endif /* HAVE_LIBID3TAG */ -} +};