]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
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 1ab865971fa663f4e669bbd375ea732b00c6e259..3129824dbe0f721ebbe2566f06dcfca3c0f9b934 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
 
 /** 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;
 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;
 }
 
        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;
 {
        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 = 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;
                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);
                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;
                                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;
 
        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;
        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;
        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);
        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 = 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;
                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,
 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;
 }
        afh->suffixes = aac_suffixes;
 }
diff --git a/afh.h b/afh.h
index e7ca2820d92c0bc517f92b224efd12507d8dd716..69c1188ed75d294ddfc417567b7bd50967692e85 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);
         * \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 51b95c9952dd9735fbff785a341959409d8e307a..605aac2576b5ba37b5602ec23062c0e5fdac2882 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 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;
 
 static struct mp3info mp3;
 static ssize_t num_chunks;
 
@@ -243,36 +242,36 @@ static int get_header(FILE *file, struct mp3header *header)
  * returned.
  *
  */
  * 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) {
 {
        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;
                        ; /* 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;
                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 (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;
                                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) {
                        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));
                        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;
 {
        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';
        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 (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;
        }
                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 (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';
                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';
                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';
                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';
                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;
                return -E_FREAD;
        mp3.id3.comment[30] = '\0';
        mp3.id3_isvalid = 1;
@@ -329,21 +328,19 @@ static int mp3_get_id3(void)
        return 1;
 }
 
        return 1;
 }
 
-static int find_valid_start(void)
+static int find_valid_start(FILE *file)
 {
        int ret, frame_len;
 
 {
        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) {
        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 {
                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;
        }
                if (ret < 0)
                        return ret;
        }
@@ -352,7 +349,7 @@ static int find_valid_start(void)
        return frame_len;
 }
 
        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;
 {
        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));
 
        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;
        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) {
        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;
                }
                        if (ret < 0)
                                goto err_out;
                }
-               len = find_valid_start();
+               len = find_valid_start(file);
                if (len <= 0)
                        break;
                freq = header_frequency(&mp3.header);
                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 = 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) {
                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;
                        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 = -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;
        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);
        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));
        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
  */
 /*
  * 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;
 
 {
        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;
                return ret;
-       }
        write_info_str(afi);
        afi->chunks_total = num_chunks;
        afi->seconds_total = mp3.seconds;
        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;
 }
 
        return 1;
 }
 
-static void mp3_close_audio_file(void)
-{
-       if (!infile)
-               return;
-       fclose(infile);
-       infile = NULL;
-}
-
 static const char* mp3_suffixes[] = {"mp3", 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;
 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;
 }
        afh->suffixes = mp3_suffixes;
 }
index 1034091358b51b300737fcd3ae5404ac0a5363fe..3c7a143121897d045658195713bcb47170c6324f 100644 (file)
--- a/ogg_afh.c
+++ b/ogg_afh.c
@@ -32,8 +32,6 @@
 #define CHUNK_SIZE 32768
 static double chunk_time = 0.25;
 
 #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;
 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;
 }
 
        return num_chunks;
 }
 
-static void ogg_close_audio_file(void)
-{
-       fclose(audio_file);
-}
-
 /*
  * Init oggvorbis file and write some tech data to given pointers.
  */
 /*
  * 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);
                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);
        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,
 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;
 }
        afh->suffixes = ogg_suffixes;
 }
diff --git a/vss.c b/vss.c
index d0b21da2f0072ba17ec2367ec38ef1a2ec97d972..122476064154b1d587a2403eea61384567dcbb6b 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);
        }
        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;
        audio_file = NULL;
        mmd->audio_format = -1;
        af = NULL;