X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mp3_afh.c;h=8ca319b4705c9c12492ef2f26a418affb4cd39c3;hp=c49d9bcb1246b4be79f6959d88cfd592708a2b01;hb=970247623b17124a5aacb14a8061da56e1f3b0be;hpb=6e7e1ff218c4328f57f7f7816b2eeabb22790bd7 diff --git a/mp3_afh.c b/mp3_afh.c index c49d9bcb..8ca319b4 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -28,11 +28,8 @@ * Johannes Overmann */ -#include "server.cmdline.h" #include "server.h" -#include "vss.h" #include "error.h" -#include "fd.h" #include "string.h" /** \cond some defines and structs which are only used in this file */ @@ -72,8 +69,6 @@ struct mp3info { int id3_isvalid; struct id3tag id3; int vbr; - long unsigned br_average; - int freq; }; /** \endcond */ @@ -115,6 +110,16 @@ static const char *header_mode(struct mp3header *h) h->mode = 4; /* invalid */ return mode_text[h->mode]; } + +static int header_channels(struct mp3header *h) +{ + if (h->mode > 3) + return 0; + if (h->mode < 3) + return 2; + return 1; +} + static int header_bitrate(struct mp3header *h) { if (h->layer > 3 || h->bitrate > 14) @@ -143,14 +148,14 @@ static void write_info_str(struct audio_format_info *afi) int v = mp3.id3_isvalid; snprintf(afi->info_string, MMD_INFO_SIZE, - "audio_file_info1:%lu x %lums, %lu kbit/s (%cbr) %i KHz %s\n" + "audio_file_info1:%lu x %lums, %u kbit/s (%cbr) %i KHz %s\n" "audio_file_info2:%s, by %s\n" "audio_file_info3:A: %s, Y: %s, C: %s\n", afi->chunks_total, tv2ms(&afi->chunk_tv), - mp3.br_average, + afi->bitrate, mp3.vbr? 'v' : 'c', - mp3.freq / 1000, + afi->frequency / 1000, header_mode(&mp3.header), v && *mp3.id3.title? mp3.id3.title : "(title tag not set)", v && *mp3.id3.artist? mp3.id3.artist : "(artist tag not set)", @@ -228,13 +233,11 @@ out: return ret; } -/** +/* * find the next mp3 header * - * On success, the length of the next frame header is returned. If the end of - * the file was reached, the function returns zero. On errors, a negative value - * is returned. - * + * Return the length of the next frame header or zero if the end of the file is + * reached. */ static int mp3_seek_next_header(unsigned char *map, off_t numbytes, off_t *fpos) { @@ -242,11 +245,9 @@ static int mp3_seek_next_header(unsigned char *map, off_t numbytes, off_t *fpos) struct mp3header h, h2; long valid_start = 0; - while (1) { - while ((*fpos)++ < numbytes && map[*fpos] != 0xff) - ; - if (*fpos >= numbytes) - return 0; + for (; *fpos < numbytes; (*fpos)++) { + if (map[*fpos] != 0xff) + continue; valid_start = *fpos; first_len = get_header(map, numbytes, fpos, &h); if (first_len <= 0) @@ -265,6 +266,7 @@ static int mp3_seek_next_header(unsigned char *map, off_t numbytes, off_t *fpos) return first_len; } } + return 0; } static void mp3_get_id3(unsigned char *map, off_t numbytes, off_t *fpos) @@ -337,7 +339,6 @@ static int mp3_read_info(unsigned char *map, off_t numbytes, mp3_get_id3(map, numbytes, &fpos); fpos = 0; mp3.vbr = 0; - mp3.freq = 0; while (1) { int freq, br, fl; struct timeval tmp, cct; /* current chunk time */ @@ -384,8 +385,9 @@ static int mp3_read_info(unsigned char *map, off_t numbytes, if (!afi->chunks_total || !freq_avg || !br_avg) goto err_out; afi->chunk_table[afi->chunks_total] = numbytes - 1; - mp3.br_average = br_avg; - mp3.freq = freq_avg; + afi->bitrate = br_avg; + afi->frequency = freq_avg; + afi->channels = header_channels(&mp3.header); afi->seconds_total = (tv2ms(&total_time) + 500) / 1000; tv_divide(afi->chunks_total, &total_time, &afi->chunk_tv); PARA_DEBUG_LOG("%lu chunks, each %lums\n", afi->chunks_total,