afh: Get rid of dummy entry at the end of afl[].
authorAndre Noll <maan@tuebingen.mpg.de>
Fri, 21 Sep 2018 07:25:46 +0000 (09:25 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 21 Dec 2018 13:40:42 +0000 (14:40 +0100)
The number of audio formats is a compile-time constant. It used to be
the array size of afl[] minus one due to the dummy entry. Without
it, it becomes simply the array size. This patch introduces
NUM_AUDIO_FORMATS as a shortcut for ARRAY_SIZE(afl) and adjusts
next_audio_format() to avoid the access of memory past the end of
the array. With these preparations in place, the dummy entry can
be removed.

afh_common.c

index cb773bd..0b0d84b 100644 (file)
@@ -80,11 +80,11 @@ static struct audio_format_handler afl[] = {
                .init = opus_afh_init,
 #endif
        },
-       {
-               .name = NULL,
-       }
 };
 
+/** This includes audio formats not compiled in. */
+#define NUM_AUDIO_FORMATS (ARRAY_SIZE(afl))
+
 /**
  * Get the name of the given audio format.
  *
@@ -95,7 +95,7 @@ static struct audio_format_handler afl[] = {
  */
 const char *audio_format_name(int i)
 {
-       if (i < 0 || i >= ARRAY_SIZE(afl) - 1)
+       if (i < 0 || i >= NUM_AUDIO_FORMATS)
                return "???";
        return afl[i].name;
 }
@@ -103,16 +103,17 @@ const char *audio_format_name(int i)
 static inline int next_audio_format(int format)
 {
        for (;;) {
-               if (!afl[format].name)
-                       return format;
                format++;
+               if (format >= NUM_AUDIO_FORMATS)
+                       return format;
                if (afl[format].init)
                        return format;
        }
 }
 
 /** Iterate over each supported audio format. */
-#define FOR_EACH_AUDIO_FORMAT(i) for (i = 0; afl[i].name; i = next_audio_format(i))
+#define FOR_EACH_AUDIO_FORMAT(i) \
+       for (i = 0; i < NUM_AUDIO_FORMATS; i = next_audio_format(i))
 
 /**
  * Call the init function of each supported audio format handler.