From 459c4c5d86dfee5eddb9c6a99264432fd0a32bec Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Tue, 27 Jun 2023 04:55:36 +0300 Subject: [PATCH] Song: add EBU R 128 Integrated Loudness and Loudness Range fields, DB [de]serialization Again, pretty boring boilerplate, rather identical to the handling of other fields. We do need to be careful when [de]serializing it, though, we don't want to accidentally loose the `NULL` (i.e. unknown) state! --- src/core/song.cpp | 21 +++++++++++++++++++++ src/core/song.h | 8 ++++++++ 2 files changed, 29 insertions(+) diff --git a/src/core/song.cpp b/src/core/song.cpp index a98d9b50d..caa58bade 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -133,6 +133,9 @@ const QStringList Song::kColumns = QStringList() << "title" << "musicbrainz_release_group_id" << "musicbrainz_work_id" + << "ebur128_integrated_loudness_lufs" + << "ebur128_loudness_range_lu" + ; const QString Song::kColumnSpec = Song::kColumns.join(", "); @@ -243,6 +246,9 @@ struct Song::Private : public QSharedData { QString musicbrainz_release_group_id_; QString musicbrainz_work_id_; + std::optional ebur128_integrated_loudness_lufs_; + std::optional ebur128_loudness_range_lu_; + bool init_from_file_; // Whether this song was loaded from a file using taglib. bool suspicious_tags_; // Whether our encoding guesser thinks these tags might be incorrectly encoded. @@ -391,6 +397,9 @@ const QString &Song::musicbrainz_disc_id() const { return d->musicbrainz_disc_id const QString &Song::musicbrainz_release_group_id() const { return d->musicbrainz_release_group_id_; } const QString &Song::musicbrainz_work_id() const { return d->musicbrainz_work_id_; } +std::optional Song::ebur128_integrated_loudness_lufs() const { return d->ebur128_integrated_loudness_lufs_; } +std::optional Song::ebur128_loudness_range_lu() const { return d->ebur128_loudness_range_lu_; } + bool Song::init_from_file() const { return d->init_from_file_; } const QString &Song::title_sortable() const { return d->title_sortable_; } @@ -475,6 +484,9 @@ void Song::set_musicbrainz_disc_id(const QString &v) { d->musicbrainz_disc_id_ = void Song::set_musicbrainz_release_group_id(const QString &v) { d->musicbrainz_release_group_id_ = v; } void Song::set_musicbrainz_work_id(const QString &v) { d->musicbrainz_work_id_ = v; } +void Song::set_ebur128_integrated_loudness_lufs(const std::optional &v) { d->ebur128_integrated_loudness_lufs_ = v; } +void Song::set_ebur128_loudness_range_lu(const std::optional &v) { d->ebur128_loudness_range_lu_ = v; } + void Song::set_stream_url(const QUrl &v) { d->stream_url_ = v; } const QUrl &Song::effective_stream_url() const { return !d->stream_url_.isEmpty() && d->stream_url_.isValid() ? d->stream_url_ : d->url_; } @@ -1292,6 +1304,12 @@ void Song::InitFromQuery(const SqlRow &q, const bool reliable_metadata) { d->bitrate_ = q.ValueToInt("bitrate"); d->samplerate_ = q.ValueToInt("samplerate"); d->bitdepth_ = q.ValueToInt("bitdepth"); + if (!q.value("ebur128_integrated_loudness_lufs").isNull()) { + d->ebur128_integrated_loudness_lufs_ = q.value("ebur128_integrated_loudness_lufs").toDouble(); + } + if (!q.value("ebur128_loudness_range_lu").isNull()) { + d->ebur128_loudness_range_lu_ = q.value("ebur128_loudness_range_lu").toDouble(); + } d->source_ = static_cast(q.value("source").isNull() ? 0 : q.value("source").toInt()); d->directory_id_ = q.ValueToInt("directory_id"); set_url(QUrl::fromEncoded(q.ValueToString("url").toUtf8())); @@ -1643,6 +1661,9 @@ void Song::BindToQuery(SqlQuery *query) const { query->BindStringValue(":musicbrainz_release_group_id", d->musicbrainz_release_group_id_); query->BindStringValue(":musicbrainz_work_id", d->musicbrainz_work_id_); + query->BindDoubleOrNullValue(":ebur128_integrated_loudness_lufs", d->ebur128_integrated_loudness_lufs_); + query->BindDoubleOrNullValue(":ebur128_loudness_range_lu", d->ebur128_loudness_range_lu_); + } void Song::BindToFtsQuery(SqlQuery *query) const { diff --git a/src/core/song.h b/src/core/song.h index 575e1df27..4c585a715 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -24,6 +24,8 @@ #include "config.h" +#include + #include #include #include @@ -211,6 +213,9 @@ class Song { const QString &musicbrainz_release_group_id() const; const QString &musicbrainz_work_id() const; + std::optional ebur128_integrated_loudness_lufs() const; + std::optional ebur128_loudness_range_lu() const; + bool init_from_file() const; const QString &title_sortable() const; @@ -296,6 +301,9 @@ class Song { void set_musicbrainz_release_group_id(const QString &v); void set_musicbrainz_work_id(const QString &v); + void set_ebur128_integrated_loudness_lufs(const std::optional &v); + void set_ebur128_loudness_range_lu(const std::optional &v); + void set_stream_url(const QUrl &v); const QUrl &effective_stream_url() const;