kill close_audio_file handler from struct audio format.
authorAndre Noll <maan@systemlinux.org>
Sun, 11 Mar 2007 17:40:08 +0000 (18:40 +0100)
committerAndre Noll <maan@systemlinux.org>
Sun, 11 Mar 2007 17:40:08 +0000 (18:40 +0100)
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
afh.h
mp3_afh.c
ogg_afh.c
vss.c

index 1ab8659..3129824 100644 (file)
--- a/aac_afh.c
+++ b/aac_afh.c
 /** 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 e7ca282..69c1188 100644 (file)
--- 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);
 };
 
index 51b95c9..605aac2 100644 (file)
--- 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;
 }
index 1034091..3c7a143 100644 (file)
--- 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 d0b21da..1224760 100644 (file)
--- 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;