Commit f71ac4d4 authored by Max Kellermann's avatar Max Kellermann

song: stat file in song_file_update(), don't use isMusic()

isMusic() used to be a very inefficient function: with every invocation, it did another stat() on the specified file. There is only one caller, do the stat() there manually and use hasMusicSuffix() instead of isMusic().
parent 94a5a5a9
......@@ -255,15 +255,3 @@ struct decoder_plugin *hasMusicSuffix(const char *utf8file, unsigned int next)
return ret;
}
struct decoder_plugin *isMusic(const char *utf8file, time_t * mtime,
unsigned int next)
{
if (isFile(utf8file, mtime)) {
struct decoder_plugin *plugin = hasMusicSuffix(utf8file, next);
if (plugin != NULL)
return plugin;
}
DEBUG("isMusic: %s is not a valid file\n", utf8file);
return NULL;
}
......@@ -40,9 +40,6 @@ int isDir(const char *utf8name);
struct decoder_plugin *hasMusicSuffix(const char *utf8file, unsigned int next);
struct decoder_plugin *isMusic(const char *utf8file, time_t * mtime,
unsigned int next);
int printRemoteUrlHandlers(struct client *client);
int isFile(const char *utf8file, time_t * mtime);
......
......@@ -97,6 +97,7 @@ song_file_update(struct song *song)
unsigned int next = 0;
char path_max_tmp[MPD_PATH_MAX];
char abs_path[MPD_PATH_MAX];
struct stat st;
assert(song_is_file(song));
......@@ -108,14 +109,16 @@ song_file_update(struct song *song)
song->tag = NULL;
}
if (stat(abs_path, &st) < 0)
return false;
song->mtime = st.st_mtime;
while (song->tag == NULL &&
(plugin = isMusic(abs_path, &(song->mtime), next++)))
(plugin = hasMusicSuffix(abs_path, next++)))
song->tag = plugin->tag_dup(abs_path);
if (song->tag == NULL || song->tag->time < 0)
return false;
return true;
return song->tag != NULL;
}
char *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment