From 0b814bdbb7a3fe018cffee0162dc6c916cfa6879 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 11 Mar 2007 18:40:08 +0100 Subject: [PATCH] kill close_audio_file handler from struct audio format. All audio format handlers just did fclose(), so do this from vss.c and kill the handler. This also allows to get rid of the global infile variable in all audio format handlers. --- aac_afh.c | 26 +++++------------ afh.h | 8 ----- mp3_afh.c | 87 ++++++++++++++++++++++--------------------------------- ogg_afh.c | 9 ------ vss.c | 2 +- 5 files changed, 42 insertions(+), 90 deletions(-) diff --git a/aac_afh.c b/aac_afh.c index 1ab86597..3129824d 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -33,16 +33,6 @@ /** size of the input buffer, must be big enough to hold header */ #define AAC_INBUF_SIZE 65536 -static FILE *infile; - -static void aac_close_audio_file(void) -{ - if (!infile) - return; - fclose(infile); - infile = NULL; -} - static int aac_find_stsz(unsigned char *buf, unsigned buflen, size_t *skip) { int i; @@ -68,8 +58,8 @@ static int aac_find_stsz(unsigned char *buf, unsigned buflen, size_t *skip) return -E_STSZ; } -static int read_chunk_table(struct audio_format_info *afi, unsigned char *inbuf, - size_t inbuf_len, size_t skip) +static int read_chunk_table(FILE *file, struct audio_format_info *afi, + unsigned char *inbuf, size_t inbuf_len, size_t skip) { int ret, i; size_t sum = 0; @@ -78,7 +68,7 @@ static int read_chunk_table(struct audio_format_info *afi, unsigned char *inbuf, ret = aac_find_stsz(inbuf, inbuf_len, &skip); if (ret >= 0) break; - ret = read(fileno(infile), inbuf, AAC_INBUF_SIZE); + ret = read(fileno(file), inbuf, AAC_INBUF_SIZE); if (ret <= 0) return -E_AAC_READ; inbuf_len = ret; @@ -91,7 +81,7 @@ static int read_chunk_table(struct audio_format_info *afi, unsigned char *inbuf, if (skip + 4 > inbuf_len) { skip = inbuf_len - skip; memmove(inbuf, inbuf + inbuf_len - skip, skip); - ret = read(fileno(infile), inbuf + skip, + ret = read(fileno(file), inbuf + skip, AAC_INBUF_SIZE - skip); if (ret <= 0) return -E_AAC_READ; @@ -135,8 +125,7 @@ static int aac_get_file_info(FILE *file, struct audio_format_info *afi) mp4AudioSpecificConfig mp4ASC; NeAACDecHandle handle; - infile = file; - ret = read(fileno(infile), inbuf, AAC_INBUF_SIZE); + ret = read(fileno(file), inbuf, AAC_INBUF_SIZE); if (ret <= 0) { ret = -E_AAC_READ; goto out; @@ -158,7 +147,7 @@ static int aac_get_file_info(FILE *file, struct audio_format_info *afi) if (NeAACDecAudioSpecificConfig(inbuf + skip, inbuf_len - skip, &mp4ASC) < 0) goto out; - ret = read_chunk_table(afi, inbuf, inbuf_len, skip); + ret = read_chunk_table(file, afi, inbuf, inbuf_len, skip); if (ret < 0) goto out; afi->seconds_total = aac_set_chunk_tv(afi, &mp4ASC); @@ -166,7 +155,7 @@ static int aac_get_file_info(FILE *file, struct audio_format_info *afi) ret = aac_find_entry_point(inbuf, inbuf_len, &skip); if (ret >= 0) break; - ret = read(fileno(infile), inbuf, AAC_INBUF_SIZE); + ret = read(fileno(file), inbuf, AAC_INBUF_SIZE); if (ret <= 0) { ret = -E_AAC_READ; goto out; @@ -194,6 +183,5 @@ static const char* aac_suffixes[] = {"m4a", "mp4", NULL}; void aac_afh_init(struct audio_format_handler *afh) { afh->get_file_info = aac_get_file_info, - afh->close_audio_file = aac_close_audio_file; afh->suffixes = aac_suffixes; } diff --git a/afh.h b/afh.h index e7ca2820..69c1188e 100644 --- a/afh.h +++ b/afh.h @@ -109,13 +109,5 @@ struct audio_format_handler { * \sa struct audio_format_info */ int (*get_file_info)(FILE *audio_file, struct audio_format_info *afi); - /** - * cleanup function of this audio format handler - * - * This close function should deallocate any resources - * associated with the current audio file. In particular, it is responsible - * for closing the file handle. It is assumed to succeed. - */ - void (*close_audio_file)(void); }; diff --git a/mp3_afh.c b/mp3_afh.c index 51b95c99..605aac25 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -102,7 +102,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"}; -static FILE *infile; static struct mp3info mp3; static ssize_t num_chunks; @@ -243,36 +242,36 @@ static int get_header(FILE *file, struct mp3header *header) * returned. * */ -static int mp3_seek_next_header(void) +static int mp3_seek_next_header(FILE *file) { int k, l = 0, c, first_len, ret; struct mp3header h, h2; long valid_start = 0; while (1) { - while ((c = fgetc(infile)) != 255 && (c != EOF)) + while ((c = fgetc(file)) != 255 && (c != EOF)) ; /* nothing */ if (c != 255) return 0; - ungetc(c, infile); - valid_start = ftell(infile); - first_len = get_header(infile, &h); + ungetc(c, file); + valid_start = ftell(file); + first_len = get_header(file, &h); if (first_len <= 0) continue; - ret = para_fseek(infile, first_len - FRAME_HEADER_SIZE, SEEK_CUR); + ret = para_fseek(file, first_len - FRAME_HEADER_SIZE, SEEK_CUR); if (ret < 0) return ret; for (k = 1; k < MIN_CONSEC_GOOD_FRAMES; k++) { - if ((l = get_header(infile, &h2)) <= 0) + if ((l = get_header(file, &h2)) <= 0) break; if (!compare_headers(&h, &h2)) break; - ret = para_fseek(infile, l - FRAME_HEADER_SIZE, SEEK_CUR); + ret = para_fseek(file, l - FRAME_HEADER_SIZE, SEEK_CUR); if (ret < 0) return ret; } if (k == MIN_CONSEC_GOOD_FRAMES) { - ret = para_fseek(infile, valid_start, SEEK_SET); + ret = para_fseek(file, valid_start, SEEK_SET); if (ret < 0) return ret; memcpy(&(mp3.header), &h2, sizeof(struct mp3header)); @@ -281,7 +280,7 @@ static int mp3_seek_next_header(void) } } -static int mp3_get_id3(void) +static int mp3_get_id3(FILE *file) { char fbuf[4]; int ret; @@ -292,32 +291,32 @@ static int mp3_get_id3(void) mp3.id3.album[0] = '\0'; mp3.id3.comment[0] = '\0'; mp3.id3.year[0] = '\0'; - ret = para_fseek(infile, -128, SEEK_END); + ret = para_fseek(file, -128, SEEK_END); if (ret < 0 ) return ret; - if (para_fread(fbuf, 1, 3, infile) < 0) + if (para_fread(fbuf, 1, 3, file) < 0) return -E_FREAD; fbuf[3] = '\0'; if (strcmp("TAG", fbuf)) { PARA_INFO_LOG("%s", "no id3 tag\n"); return 0; } - ret = para_fseek(infile, -125, SEEK_END); + ret = para_fseek(file, -125, SEEK_END); if (ret < 0) return ret; - if (para_fread(mp3.id3.title, 1, 30, infile) != 30) + if (para_fread(mp3.id3.title, 1, 30, file) != 30) return -E_FREAD; mp3.id3.title[30] = '\0'; - if (para_fread(mp3.id3.artist, 1, 30, infile) != 30) + if (para_fread(mp3.id3.artist, 1, 30, file) != 30) return -E_FREAD; mp3.id3.artist[30] = '\0'; - if (para_fread(mp3.id3.album, 1, 30, infile) != 30) + if (para_fread(mp3.id3.album, 1, 30, file) != 30) return -E_FREAD; mp3.id3.album[30] = '\0'; - if (para_fread(mp3.id3.year, 1, 4, infile) != 4) + if (para_fread(mp3.id3.year, 1, 4, file) != 4) return -E_FREAD; mp3.id3.year[4] = '\0'; - if (para_fread(mp3.id3.comment, 1, 30, infile) != 30) + if (para_fread(mp3.id3.comment, 1, 30, file) != 30) return -E_FREAD; mp3.id3.comment[30] = '\0'; mp3.id3_isvalid = 1; @@ -329,21 +328,19 @@ static int mp3_get_id3(void) return 1; } -static int find_valid_start(void) +static int find_valid_start(FILE *file) { int ret, frame_len; - if (!infile) - return -E_MP3_NO_FILE; - frame_len = get_header(infile, &mp3.header); + frame_len = get_header(file, &mp3.header); if (frame_len < 0) return frame_len; if (!frame_len) { - frame_len = mp3_seek_next_header(); + frame_len = mp3_seek_next_header(file); if (frame_len <= 0) return frame_len; } else { - ret = para_fseek(infile, -FRAME_HEADER_SIZE, SEEK_CUR); + ret = para_fseek(file, -FRAME_HEADER_SIZE, SEEK_CUR); if (ret < 0) return ret; } @@ -352,7 +349,7 @@ static int find_valid_start(void) return frame_len; } -static int mp3_read_info(struct audio_format_info *afi) +static int mp3_read_info(FILE *file, struct audio_format_info *afi) { long fl_avg = 0, freq_avg = 0, br_avg = 0; int ret, len = 0, old_br = -1; @@ -361,21 +358,21 @@ static int mp3_read_info(struct audio_format_info *afi) num_chunks = 0; afi->chunk_table = para_malloc(chunk_table_size * sizeof(size_t)); - ret = mp3_get_id3(); + ret = mp3_get_id3(file); if (ret < 0) goto err_out; - rewind(infile); + rewind(file); mp3.vbr = 0; mp3.freq = 0; while (1) { int freq, br, fl; struct timeval tmp, cct; /* current chunk time */ if (len > 0) { - ret = para_fseek(infile, len, SEEK_CUR); + ret = para_fseek(file, len, SEEK_CUR); if (ret < 0) goto err_out; } - len = find_valid_start(); + len = find_valid_start(file); if (len <= 0) break; freq = header_frequency(&mp3.header); @@ -394,14 +391,12 @@ static int mp3_read_info(struct audio_format_info *afi) afi->chunk_table = para_realloc(afi->chunk_table, chunk_table_size * sizeof(size_t)); } - afi->chunk_table[num_chunks] = ftell(infile); + afi->chunk_table[num_chunks] = ftell(file); if (num_chunks < 10 || !(num_chunks % 1000)) PARA_INFO_LOG("chunk #%d: %zd\n", num_chunks, afi->chunk_table[num_chunks]); num_chunks++; if (num_chunks == 1) { -// entry = ftell(infile); -// PARA_INFO_LOG("entry: %zd\n", entry); freq_avg = freq; br_avg = br; old_br = br; @@ -418,15 +413,15 @@ static int mp3_read_info(struct audio_format_info *afi) ret = -E_MP3_INFO; if (!num_chunks || !freq_avg || !br_avg) goto err_out; - ret= para_fseek(infile, 0, SEEK_END); + ret= para_fseek(file, 0, SEEK_END); if (ret < 0) goto err_out; - afi->chunk_table[num_chunks] = ftell(infile); + afi->chunk_table[num_chunks] = ftell(file); mp3.br_average = br_avg; mp3.freq = freq_avg; mp3.seconds = (tv2ms(&total_time) + 500) / 1000; tv_divide(num_chunks, &total_time, &afi->chunk_tv); - rewind(infile); + rewind(file); PARA_DEBUG_LOG("%zu chunks, each %lums\n", num_chunks, tv2ms(&afi->chunk_tv)); tv_scale(3, &afi->chunk_tv, &afi->eof_tv); PARA_DEBUG_LOG("eof timeout: %lu\n", tv2ms(&afi->eof_tv)); @@ -440,18 +435,13 @@ err_out: /* * Read mp3 information from audio file */ -static int mp3_get_file_info(FILE *audio_file, struct audio_format_info *afi) +static int mp3_get_file_info(FILE *file, struct audio_format_info *afi) { int ret; - if (!audio_file) - return -E_MP3_NO_FILE; - infile = audio_file; - ret = mp3_read_info(afi); - if (ret < 0) { - infile = NULL; + ret = mp3_read_info(file, afi); + if (ret < 0) return ret; - } write_info_str(afi); afi->chunks_total = num_chunks; afi->seconds_total = mp3.seconds; @@ -460,14 +450,6 @@ static int mp3_get_file_info(FILE *audio_file, struct audio_format_info *afi) return 1; } -static void mp3_close_audio_file(void) -{ - if (!infile) - return; - fclose(infile); - infile = NULL; -} - static const char* mp3_suffixes[] = {"mp3", NULL}; /** @@ -478,6 +460,5 @@ static const char* mp3_suffixes[] = {"mp3", NULL}; void mp3_init(struct audio_format_handler *afh) { afh->get_file_info = mp3_get_file_info; - afh->close_audio_file = mp3_close_audio_file; afh->suffixes = mp3_suffixes; } diff --git a/ogg_afh.c b/ogg_afh.c index 10340913..3c7a1431 100644 --- a/ogg_afh.c +++ b/ogg_afh.c @@ -32,8 +32,6 @@ #define CHUNK_SIZE 32768 static double chunk_time = 0.25; -FILE *audio_file; - static size_t cb_read(void *buf, size_t size, size_t nmemb, void *datasource) { FILE *f = datasource; @@ -214,11 +212,6 @@ static long unsigned ogg_compute_chunk_table(OggVorbis_File *of, return num_chunks; } -static void ogg_close_audio_file(void) -{ - fclose(audio_file); -} - /* * Init oggvorbis file and write some tech data to given pointers. */ @@ -266,7 +259,6 @@ static int ogg_get_file_info(FILE *file, struct audio_format_info *afi) vi_sampling_rate / 1000, vi->channels, vi_bitrate / 1000 ); rewind(file); - audio_file = file; afi->chunk_tv.tv_sec = 0; afi->chunk_tv.tv_usec = 250 * 1000; tv_scale(3, &afi->chunk_tv, &afi->eof_tv); @@ -288,6 +280,5 @@ static const char* ogg_suffixes[] = {"ogg", NULL}; void ogg_init(struct audio_format_handler *afh) { afh->get_file_info = ogg_get_file_info, - afh->close_audio_file = ogg_close_audio_file; afh->suffixes = ogg_suffixes; } diff --git a/vss.c b/vss.c index d0b21da2..12247606 100644 --- a/vss.c +++ b/vss.c @@ -372,7 +372,7 @@ static void vss_eof(struct audio_format_handler *af) } gettimeofday(&now, NULL); tv_add(&mmd->afi.eof_tv, &now, &eof_barrier); - af->close_audio_file(); + fclose(audio_file); audio_file = NULL; mmd->audio_format = -1; af = NULL; -- 2.39.2