Replace gettimeofday() by clock_gettime().
[paraslash.git] / afh_common.c
index 44a6fd6..6c161a7 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (C) 1997-2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2013 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -7,7 +7,6 @@
 /** \file afh_common.c Common audio format handler functions. */
 
 #include <sys/mman.h> /* mmap */
 /** \file afh_common.c Common audio format handler functions. */
 
 #include <sys/mman.h> /* mmap */
-#include <sys/time.h> /* gettimeofday */
 #include <sys/types.h>
 #include <regex.h>
 
 #include <sys/types.h>
 #include <regex.h>
 
@@ -28,8 +27,15 @@ void mp3_init(struct audio_format_handler *);
 #ifdef HAVE_SPEEX
        void spx_afh_init(struct audio_format_handler *);
 #endif
 #ifdef HAVE_SPEEX
        void spx_afh_init(struct audio_format_handler *);
 #endif
+#ifdef HAVE_FLAC
+       void flac_afh_init(struct audio_format_handler *);
+#endif
 
 void wma_afh_init(struct audio_format_handler *);
 
 void wma_afh_init(struct audio_format_handler *);
+
+/** The list of all status items */
+const char *status_item_list[] = {STATUS_ITEM_ARRAY};
+
 /**
  * The list of supported audio formats.
  *
 /**
  * The list of supported audio formats.
  *
@@ -67,6 +73,12 @@ static struct audio_format_handler afl[] = {
                .name = "spx",
 #ifdef HAVE_SPEEX
                .init = spx_afh_init,
                .name = "spx",
 #ifdef HAVE_SPEEX
                .init = spx_afh_init,
+#endif
+       },
+       {
+               .name = "flac",
+#ifdef HAVE_FLAC
+               .init = flac_afh_init,
 #endif
        },
        {
 #endif
        },
        {
@@ -96,8 +108,7 @@ void afh_init(void)
 {
        int i;
 
 {
        int i;
 
-       PARA_INFO_LOG("supported audio formats: %s\n",
-               SERVER_AUDIO_FORMATS);
+       PARA_INFO_LOG("supported audio formats: %s\n", AUDIO_FORMAT_HANDLERS);
        FOR_EACH_AUDIO_FORMAT(i) {
                PARA_NOTICE_LOG("initializing %s handler\n",
                        audio_format_name(i));
        FOR_EACH_AUDIO_FORMAT(i) {
                PARA_NOTICE_LOG("initializing %s handler\n",
                        audio_format_name(i));
@@ -208,6 +219,26 @@ success:
        return ret;
 }
 
        return ret;
 }
 
+/**
+ * Deallocate contents of a filled-in ahi structure
+ *
+ * \param afhi The structure to clear.
+ *
+ * The given pointer is kept, everything else is freed.
+ */
+void clear_afhi(struct afh_info *afhi)
+{
+       if (!afhi)
+               return;
+       free(afhi->chunk_table);
+       free(afhi->techinfo);
+       free(afhi->tags.artist);
+       free(afhi->tags.title);
+       free(afhi->tags.year);
+       free(afhi->tags.album);
+       free(afhi->tags.comment);
+}
+
 /**
  * Get the name of the given audio format.
  *
 /**
  * Get the name of the given audio format.
  *
@@ -296,3 +327,47 @@ void afh_free_header(char *header_buf, uint8_t audio_format_id)
        if (afh->get_header)
                free(header_buf);
 }
        if (afh->get_header)
                free(header_buf);
 }
+
+/**
+ * Pretty-print the contents of a struct afh_info into a buffer.
+ *
+ * \param audio_format_num The audio format number.
+ * \param afhi Pointer to the structure that contains the information.
+ * \param result Pretty-printed ahfi is here after the call.
+ *
+ * The \a result buffer is dynamically allocated and should be freed by the
+ * caller.
+ *
+ * \return The number of bytes. This function never fails.
+ */
+unsigned afh_get_afhi_txt(int audio_format_num, struct afh_info *afhi, char **result)
+{
+       return xasprintf(result, "%s: %dkbit/s\n" /* bitrate */
+               "%s: %s\n" /* format */
+               "%s: %dHz\n" /* frequency */
+               "%s: %d\n" /* channels */
+               "%s: %lu\n" /* seconds total */
+               "%s: %lu: %lu\n" /* chunk time */
+               "%s: %lu\n" /* num chunks */
+               "%s: %s\n" /* techinfo */
+               "%s: %s\n" /* artist */
+               "%s: %s\n" /* title */
+               "%s: %s\n" /* year */
+               "%s: %s\n" /* album */
+               "%s: %s\n", /* comment */
+               status_item_list[SI_BITRATE], afhi->bitrate,
+               status_item_list[SI_FORMAT], audio_format_name(audio_format_num),
+               status_item_list[SI_FREQUENCY], afhi->frequency,
+               status_item_list[SI_CHANNELS], afhi->channels,
+               status_item_list[SI_SECONDS_TOTAL], afhi->seconds_total,
+               status_item_list[SI_CHUNK_TIME], (long unsigned)afhi->chunk_tv.tv_sec,
+                       (long unsigned)afhi->chunk_tv.tv_usec,
+               status_item_list[SI_NUM_CHUNKS], afhi->chunks_total,
+               status_item_list[SI_TECHINFO], afhi->techinfo? afhi->techinfo : "",
+               status_item_list[SI_ARTIST], afhi->tags.artist? afhi->tags.artist : "",
+               status_item_list[SI_TITLE], afhi->tags.title? afhi->tags.title : "",
+               status_item_list[SI_YEAR], afhi->tags.year? afhi->tags.year : "",
+               status_item_list[SI_ALBUM], afhi->tags.album? afhi->tags.album : "",
+               status_item_list[SI_COMMENT], afhi->tags.comment? afhi->tags.comment : ""
+       );
+}