aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-08-29 23:22:46 +0200
committerMax Kellermann <max@duempel.org>2014-08-29 23:25:03 +0200
commit58352ea69d3e40bd3c91eacc7bbd48f58d5f2c8a (patch)
tree98b0f981114a98177e7cb805cefa6c1c335dd6fd
parentde64b35359dff6f052aee4b38042c0d91ae5aefb (diff)
downloadmpd-58352ea69d3e40bd3c91eacc7bbd48f58d5f2c8a.tar.gz
mpd-58352ea69d3e40bd3c91eacc7bbd48f58d5f2c8a.tar.xz
mpd-58352ea69d3e40bd3c91eacc7bbd48f58d5f2c8a.zip
db/Stats: use std::chrono::duration for the total duration
Use milliseconds precision to reduce rounding errors.
-rw-r--r--src/Stats.cxx7
-rw-r--r--src/db/Helpers.cxx2
-rw-r--r--src/db/Stats.hxx6
-rw-r--r--src/db/plugins/ProxyDatabasePlugin.cxx2
4 files changed, 11 insertions, 6 deletions
diff --git a/src/Stats.cxx b/src/Stats.cxx
index 8fc626ecb..39d371ace 100644
--- a/src/Stats.cxx
+++ b/src/Stats.cxx
@@ -99,15 +99,18 @@ db_stats_print(Client &client, const Database &db)
if (!stats_update(db))
return;
+ unsigned total_duration_s =
+ std::chrono::duration_cast<std::chrono::seconds>(stats.total_duration).count();
+
client_printf(client,
"artists: %u\n"
"albums: %u\n"
"songs: %u\n"
- "db_playtime: %lu\n",
+ "db_playtime: %u\n",
stats.artist_count,
stats.album_count,
stats.song_count,
- stats.total_duration);
+ total_duration_s);
const time_t update_stamp = db.GetUpdateStamp();
if (update_stamp > 0)
diff --git a/src/db/Helpers.cxx b/src/db/Helpers.cxx
index 8df6c265c..add4bb98e 100644
--- a/src/db/Helpers.cxx
+++ b/src/db/Helpers.cxx
@@ -41,7 +41,7 @@ StatsVisitTag(DatabaseStats &stats, StringSet &artists, StringSet &albums,
const Tag &tag)
{
if (!tag.duration.IsNegative())
- stats.total_duration += tag.duration.ToS();
+ stats.total_duration += tag.duration;
for (const auto &item : tag) {
switch (item.type) {
diff --git a/src/db/Stats.hxx b/src/db/Stats.hxx
index 107af9d5f..131a5dc47 100644
--- a/src/db/Stats.hxx
+++ b/src/db/Stats.hxx
@@ -20,6 +20,8 @@
#ifndef MPD_DATABASE_STATS_HXX
#define MPD_DATABASE_STATS_HXX
+#include "Chrono.hxx"
+
struct DatabaseStats {
/**
* Number of songs.
@@ -29,7 +31,7 @@ struct DatabaseStats {
/**
* Total duration of all songs (in seconds).
*/
- unsigned long total_duration;
+ std::chrono::duration<std::uint64_t, SongTime::period> total_duration;
/**
* Number of distinct artist names.
@@ -43,7 +45,7 @@ struct DatabaseStats {
void Clear() {
song_count = 0;
- total_duration = 0;
+ total_duration = total_duration.zero();
artist_count = album_count = 0;
}
};
diff --git a/src/db/plugins/ProxyDatabasePlugin.cxx b/src/db/plugins/ProxyDatabasePlugin.cxx
index 97b544203..8f9d12188 100644
--- a/src/db/plugins/ProxyDatabasePlugin.cxx
+++ b/src/db/plugins/ProxyDatabasePlugin.cxx
@@ -807,7 +807,7 @@ ProxyDatabase::GetStats(const DatabaseSelection &selection,
update_stamp = (time_t)mpd_stats_get_db_update_time(stats2);
stats.song_count = mpd_stats_get_number_of_songs(stats2);
- stats.total_duration = mpd_stats_get_db_play_time(stats2);
+ stats.total_duration = std::chrono::seconds(mpd_stats_get_db_play_time(stats2));
stats.artist_count = mpd_stats_get_number_of_artists(stats2);
stats.album_count = mpd_stats_get_number_of_albums(stats2);
mpd_stats_free(stats2);