afh: Introduce audio_format_names[].
authorAndre Noll <maan@tuebingen.mpg.de>
Fri, 21 Sep 2018 07:29:18 +0000 (09:29 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 21 Dec 2018 13:40:42 +0000 (14:40 +0100)
This removes .name of struct audio_format in favor of an array of
strings. This will allow us to make afl[] a constant array of pointers,
some of which may be NULL to indicate that the audio format was not
compiled in.

This temporarily duplicates the list of audio formats. The second
list will be removed in a subsequent commit.

afh.h
afh_common.c

diff --git a/afh.h b/afh.h
index d2ac93a..eb53923 100644 (file)
--- a/afh.h
+++ b/afh.h
@@ -80,8 +80,6 @@ struct audio_file_data {
  * in the other part of this struct.
  */
 struct audio_format_handler {
-       /** Name of the audio format. */
-       const char *name;
        /**
         * Pointer to the audio format handler's init function.
         *
index 0b0d84b..fb4759a 100644 (file)
@@ -30,52 +30,56 @@ extern afh_init_func mp3_afh_init, ogg_afh_init, aac_afh_init, wma_afh_init,
 const char *status_item_list[] = {STATUS_ITEMS};
 
 /**
- * The list of supported audio formats.
- *
- * We always define the full array of audio formats even if some audio formats
- * were not compiled in. This is because for each audio file the number of its
- * audio format is stored in the database. We don't want these numbers to become
- * stale just because the user installed a new version of paraslash that
- * supports a different set of audio formats.
- *
- * It can still be easily detected whether an audio format is compiled in by
- * checking if the init function pointer is not \p NULL.
+ * For each audio file the number of its audio format is stored in the
+ * database. Therefore this list, in particular its order, is part of the ABI.
+ * So it's only OK to append new audio formats. All audio formats are listed
+ * here, regardless of whether the audio format handler is compiled in.
+ */
+#define ALL_AUDIO_FORMATS \
+       AUDIO_FORMAT(mp3) \
+       AUDIO_FORMAT(ogg) \
+       AUDIO_FORMAT(aac) \
+       AUDIO_FORMAT(wma) \
+       AUDIO_FORMAT(spx) \
+       AUDIO_FORMAT(flac) \
+       AUDIO_FORMAT(opus) \
+
+#define AUDIO_FORMAT(_fmt) #_fmt,
+static const char * const audio_format_names[] = {ALL_AUDIO_FORMATS};
+#undef AUDIO_FORMAT
+
+/*
+ * It can be detected whether an audio format is compiled in by checking if the
+ * init function pointer is NULL.
  */
 static struct audio_format_handler afl[] = {
        {
-               .name = "mp3",
                .init = mp3_afh_init,
        },
        {
-               .name = "ogg",
 #if defined(HAVE_OGG) && defined(HAVE_VORBIS)
                .init = ogg_afh_init,
 #endif
        },
        {
-               .name = "aac",
 #if defined(HAVE_FAAD)
                .init = aac_afh_init,
 #endif
        },
        {
-               .name = "wma",
                .init = wma_afh_init,
        },
        {
-               .name = "spx",
 #if defined(HAVE_OGG) && defined(HAVE_SPEEX)
                .init = spx_afh_init,
 #endif
        },
        {
-               .name = "flac",
 #if defined(HAVE_OGG) && defined(HAVE_FLAC)
                .init = flac_afh_init,
 #endif
        },
        {
-               .name = "opus",
 #if defined(HAVE_OGG) && defined(HAVE_OPUS)
                .init = opus_afh_init,
 #endif
@@ -97,7 +101,7 @@ const char *audio_format_name(int i)
 {
        if (i < 0 || i >= NUM_AUDIO_FORMATS)
                return "???";
-       return afl[i].name;
+       return audio_format_names[i];
 }
 
 static inline int next_audio_format(int format)