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.
.init = opus_afh_init,
#endif
},
.init = opus_afh_init,
#endif
},
+/** This includes audio formats not compiled in. */
+#define NUM_AUDIO_FORMATS (ARRAY_SIZE(afl))
+
/**
* Get the name of the given audio format.
*
/**
* Get the name of the given audio format.
*
*/
const char *audio_format_name(int i)
{
*/
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;
}
return "???";
return afl[i].name;
}
static inline int next_audio_format(int format)
{
for (;;) {
static inline int next_audio_format(int format)
{
for (;;) {
- if (!afl[format].name)
- return format;
+ if (format >= NUM_AUDIO_FORMATS)
+ return format;
if (afl[format].init)
return format;
}
}
/** Iterate over each supported audio 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.
/**
* Call the init function of each supported audio format handler.