X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=2de7a30c7bdc328cc82041135918a70da02c9578;hp=e0c0b584dbe4819f392d02c1d33076e4751af492;hb=cdef208272294b567ec80b9defd60e57a0eb2587;hpb=a4aada551a8f979918024e28343b90e0690542c2;ds=inline diff --git a/vss.c b/vss.c index e0c0b584..2de7a30c 100644 --- a/vss.c +++ b/vss.c @@ -38,9 +38,8 @@ extern struct sender senders[]; static int audio_file; static char *map; -#if 1 - void mp3_init(struct audio_format_handler *); -#endif +/* The mp3 audio format handler does not need any libs. */ +void mp3_init(struct audio_format_handler *); #ifdef HAVE_OGGVORBIS void ogg_init(struct audio_format_handler *); @@ -50,35 +49,53 @@ static char *map; #endif /** - * the list of supported audio formats + * 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 databse. We don't want that 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. */ static struct audio_format_handler afl[] = { -#if 1 { .name = "mp3", .init = mp3_init, }, -#endif -#ifdef HAVE_OGGVORBIS { .name = "ogg", +#ifdef HAVE_OGGVORBIS .init = ogg_init, - }, #endif -#ifdef HAVE_FAAD + }, { .name = "aac", +#ifdef HAVE_FAAD .init = aac_afh_init, - }, #endif + }, { .name = NULL, } }; -/** iterate over each supported audio format */ -#define FOR_EACH_AUDIO_FORMAT(i) for (i = 0; afl[i].name; i++) +static inline int next_audio_format(int format) +{ + for (;;) { + if (!afl[format].name) + return format; + 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)) /** @@ -128,6 +145,7 @@ unsigned int vss_paused(void) /** * get the name of the given audio format + * * \param i the audio format number * * This returns a pointer to statically allocated memory so it @@ -155,7 +173,7 @@ void vss_init(void) PARA_DEBUG_LOG("supported audio formats: %s\n", SUPPORTED_AUDIO_FORMATS); - for (i = 0; afl[i].name; i++) { + FOR_EACH_AUDIO_FORMAT(i) { PARA_NOTICE_LOG("initializing %s handler\n", afl[i].name); afl[i].init(&afl[i]); @@ -226,24 +244,43 @@ static int get_audio_format(int omit) return -E_AUDIO_FORMAT; } -int get_audio_file_info(const char *path, char *data, size_t size, +/** + * Call get_file_info() to obtain an afhi structure. + * + * \param path The full path of the audio file. + * \param data Pointer to the contents of the (mapped) file. + * \param size The file size in bytes. + * \param afhi Result pointer. + * + * \return The number of the audio format on success, \p -E_AUDIO_FORMAT if no + * compiled in audio format handler is able to handler the file. + * + * This function tries to find an audio format handler that can interpret the + * file given by \a data and \a size. + * + * It first tries to determine the audio format from the filename given by \a + * path. If this doesn't work, all other audio format handlers are tried until + * one is found that can handle the file. + */ +int compute_afhi(const char *path, char *data, size_t size, struct audio_format_info *afhi) { int ret, i, format = guess_audio_format(path); + if (format >= 0) { ret = afl[format].get_file_info(data, size, afhi); if (ret >= 0) - return ret; + return format; } FOR_EACH_AUDIO_FORMAT(i) { if (i == format) /* we already tried this one to no avail */ continue; ret = afl[i].get_file_info(data, size, afhi); if (ret >= 0) - return ret; + return i; + PARA_WARNING_LOG("%s\n", PARA_STRERROR(-ret)); } return -E_AUDIO_FORMAT; - } /* @@ -413,7 +450,7 @@ static void vss_eof(void) } /** - * get the header and of the current audio file + * Get the header of the current audio file. * * \param header_len the length of the header is stored here *