return -E_AUDIO_FORMAT;
}
+/**
+ * Get the name of the given audio format.
+ *
+ * \param i The audio format number.
+ *
+ * \return This returns a pointer to statically allocated memory so it
+ * must not be freed by the caller.
+ */
+const char *audio_format_name(int i)
+{
+ if (i < 0 || i >= ARRAY_SIZE(afl) - 1)
+ return "???";
+ return afl[i].name;
+}
+
+static int get_file_info(int format, const char *path, char *data,
+ size_t size, int fd, struct afh_info *afhi)
+{
+ int ret;
+ const char *fmt = audio_format_name(format);
+
+ memset(afhi, 0, sizeof(*afhi));
+ ret = afl[format].get_file_info(data, size, fd, afhi);
+ if (ret < 0) {
+ PARA_WARNING_LOG("%s: %s format not detected: %s\n",
+ path, fmt, para_strerror(-ret));
+ return ret;
+ }
+ PARA_NOTICE_LOG("%s: detected %s format\n", path, fmt);
+ return format;
+}
+
/**
* Call get_file_info() to obtain an afhi structure.
*
{
int ret, i, format;
- afhi->header_len = 0;
- afhi->techinfo = NULL;
- afhi->tags.artist = NULL;
- afhi->tags.title = NULL;
- afhi->tags.year = NULL;
- afhi->tags.album = NULL;
- afhi->tags.comment = NULL;
format = guess_audio_format(path);
-
if (format >= 0) {
- ret = afl[format].get_file_info(data, size, fd, afhi);
- if (ret >= 0) {
- ret = format;
+ ret = get_file_info(format, path, data, size, fd, afhi);
+ if (ret >= 0)
goto success;
- }
}
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, fd, afhi);
- if (ret >= 0) {
- ret = i;
+ ret = get_file_info(i, path, data, size, fd, afhi);
+ if (ret >= 0)
goto success;
- }
- PARA_WARNING_LOG("%s\n", para_strerror(-ret));
}
return -E_AUDIO_FORMAT;
success:
free(afhi->tags.comment);
}
-/**
- * Get the name of the given audio format.
- *
- * \param i The audio format number.
- *
- * \return This returns a pointer to statically allocated memory so it
- * must not be freed by the caller.
- */
-const char *audio_format_name(int i)
-{
- if (i < 0 || i >= ARRAY_SIZE(afl) - 1)
- return "???";
- return afl[i].name;
-}
-
static inline size_t get_chunk_len(long unsigned chunk_num,
const struct afh_info *afhi)
{