aac_afh.c: kill global variables inbuf and inbuf_len
[paraslash.git] / mp3_afh.c
index 83678389a8c21f211f2f55dea9157eb89412e1ca..898547fce4870ebb94beb10ee950dee4b05ea11e 100644 (file)
--- a/mp3_afh.c
+++ b/mp3_afh.c
@@ -31,7 +31,6 @@
 #include "server.cmdline.h"
 #include "server.h"
 #include "vss.h"
-#include "afh.h"
 #include "error.h"
 #include "fd.h"
 #include "string.h"
@@ -70,7 +69,6 @@ struct id3tag {
 };
 
 struct mp3info {
-       char *filename;
        struct mp3header header;
        int id3_isvalid;
        struct id3tag id3;
@@ -81,13 +79,13 @@ struct mp3info {
 };
 
 /** \endcond */
-static int frequencies[3][4] = {
+static const int frequencies[3][4] = {
        {22050,24000,16000,50000}, /* MPEG 2.0 */
        {44100,48000,32000,50000}, /* MPEG 1.0 */
        {11025,12000,8000,50000} /* MPEG 2.5 */
 };
 
-static int mp3info_bitrate[2][3][14] = {
+static const int mp3info_bitrate[2][3][14] = {
 { /* MPEG 2.0 */
        {32,48,56,64,80,96,112,128,144,160,176,192,224,256}, /* layer 1 */
        {8,16,24,32,40,48,56,64,80,96,112,128,144,160}, /* layer 2 */
@@ -101,13 +99,13 @@ static int mp3info_bitrate[2][3][14] = {
 }
 };
 
-static int frame_size_index[] = {24000, 72000, 72000};
+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 struct audio_format_handler *af;
-static ssize_t *chunk_table, num_chunks;
+static ssize_t num_chunks;
 
 static int header_frequency(struct mp3header *h)
 {
@@ -145,16 +143,16 @@ static int frame_length(struct mp3header *header)
                + header->padding;
 }
 
-static void write_info_str(char *info_str)
+static void write_info_str(struct audio_format_info *afi)
 {
        int v = mp3.id3_isvalid;
 
-       snprintf(info_str, MMD_INFO_SIZE,
+       snprintf(afi->info_string, MMD_INFO_SIZE,
                "audio_file_info1:%d x %lums, %lu kbit/s (%cbr) %i KHz %s\n"
                "audio_file_info2:%s, by %s\n"
                "audio_file_info3:A: %s, Y: %s, C: %s\n",
                num_chunks,
-               tv2ms(&af->chunk_tv),
+               tv2ms(&afi->chunk_tv),
                mp3.br_average,
                mp3.vbr? 'v' : 'c',
                mp3.freq / 1000,
@@ -191,8 +189,7 @@ static int compare_headers(struct mp3header *h1,struct mp3header *h2)
                        (h1->original == h2->original) &&
                        (h1->emphasis == h2->emphasis))
                return 1;
-       else
-               return 0;
+       return 0;
 }
 
 /**
@@ -356,7 +353,7 @@ static int find_valid_start(void)
        return frame_len;
 }
 
-static int mp3_read_info(void)
+static int mp3_read_info(struct audio_format_info *afi)
 {
        long fl_avg = 0, freq_avg = 0, br_avg = 0;
        int ret, len = 0, old_br = -1;
@@ -364,7 +361,7 @@ static int mp3_read_info(void)
        unsigned chunk_table_size = 1000; /* gets increased on demand */
 
        num_chunks = 0;
-       chunk_table = para_malloc(chunk_table_size * sizeof(size_t));
+       afi->chunk_table = para_malloc(chunk_table_size * sizeof(size_t));
        ret = mp3_get_id3();
        if (ret < 0)
                goto err_out;
@@ -395,13 +392,13 @@ static int mp3_read_info(void)
                //PARA_DEBUG_LOG("%s: br: %d, freq: %d, fl: %d, cct: %lu\n", __func__, br, freq, fl, cct.tv_usec);
                if (num_chunks >= chunk_table_size) {
                        chunk_table_size *= 2;
-                       chunk_table = para_realloc(chunk_table,
+                       afi->chunk_table = para_realloc(afi->chunk_table,
                                chunk_table_size * sizeof(size_t));
                }
-               chunk_table[num_chunks] = ftell(infile);
+               afi->chunk_table[num_chunks] = ftell(infile);
                if (num_chunks < 10 || !(num_chunks % 1000))
                        PARA_INFO_LOG("chunk #%d: %zd\n", num_chunks,
-                               chunk_table[num_chunks]);
+                               afi->chunk_table[num_chunks]);
                num_chunks++;
                if (num_chunks == 1) {
 //                     entry = ftell(infile);
@@ -425,43 +422,41 @@ static int mp3_read_info(void)
        ret= para_fseek(infile, 0, SEEK_END);
        if (ret < 0)
                goto err_out;
-       chunk_table[num_chunks] = ftell(infile);
+       afi->chunk_table[num_chunks] = ftell(infile);
        mp3.br_average = br_avg;
        mp3.freq = freq_avg;
        mp3.seconds = (tv2ms(&total_time) + 500) / 1000;
-       tv_divide(num_chunks, &total_time, &af->chunk_tv);
+       tv_divide(num_chunks, &total_time, &afi->chunk_tv);
        rewind(infile);
-       PARA_DEBUG_LOG("%zu chunks, each %lums\n", num_chunks, tv2ms(&af->chunk_tv));
-       tv_scale(3, &af->chunk_tv, &af->eof_tv);
-       PARA_DEBUG_LOG("eof timeout: %lu\n", tv2ms(&af->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));
        return 1;
 err_out:
        PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
-       free(chunk_table);
+       free(afi->chunk_table);
        return ret;
 }
 
 /*
  * Read mp3 information from audio file
  */
-static int mp3_get_file_info(FILE *audio_file, char *info_str,
-       long unsigned *frames, int *seconds, size_t **vss_chunk_table)
+static int mp3_get_file_info(FILE *audio_file, struct audio_format_info *afi)
 {
        int ret;
 
        if (!audio_file)
                return -E_MP3_NO_FILE;
        infile = audio_file;
-       ret = mp3_read_info();
+       ret = mp3_read_info(afi);
        if (ret < 0) {
                infile = NULL;
                return ret;
        }
-       write_info_str(info_str);
-       *frames = num_chunks;
-       *seconds = mp3.seconds;
-       *vss_chunk_table = chunk_table;
-       if (*seconds < 2 || !*frames)
+       write_info_str(afi);
+       afi->chunks_total = num_chunks;
+       afi->seconds_total = mp3.seconds;
+       if (afi->seconds_total < 2 || !afi->chunks_total)
                return -E_MP3_INFO;
        return 1;
 }
@@ -472,7 +467,6 @@ static void mp3_close_audio_file(void)
                return;
        fclose(infile);
        infile = NULL;
-       free(chunk_table);
 }
 
 static const char* mp3_suffixes[] = {"mp3", NULL};
@@ -487,9 +481,5 @@ void mp3_init(struct audio_format_handler *p)
        af = p;
        af->get_file_info = mp3_get_file_info;
        af->close_audio_file = mp3_close_audio_file;
-       af->get_header_info = NULL;
-       /* eof_tv gets overwritten in mp3_get_file_info() */
-       af->eof_tv.tv_sec = 0;
-       af->eof_tv.tv_usec = 100 * 1000;
        af->suffixes = mp3_suffixes;
 }