From c4504b23059c36632309f7524b4263fe0a1c234f Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Fri, 21 Sep 2018 09:29:18 +0200 Subject: [PATCH] afh: Introduce audio_format_names[]. 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 | 2 -- afh_common.c | 40 ++++++++++++++++++++++------------------ 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/afh.h b/afh.h index d2ac93ae..eb539236 100644 --- 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. * diff --git a/afh_common.c b/afh_common.c index 0b0d84be..fb4759a5 100644 --- a/afh_common.c +++ b/afh_common.c @@ -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) -- 2.39.5