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!
This commit is contained in:
Roman Lebedev 2023-06-27 04:55:36 +03:00 committed by Jonas Kvinge
parent 73c56f038e
commit 459c4c5d86
2 changed files with 29 additions and 0 deletions

View File

@ -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<double> ebur128_integrated_loudness_lufs_;
std::optional<double> 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<double> Song::ebur128_integrated_loudness_lufs() const { return d->ebur128_integrated_loudness_lufs_; }
std::optional<double> 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<double> &v) { d->ebur128_integrated_loudness_lufs_ = v; }
void Song::set_ebur128_loudness_range_lu(const std::optional<double> &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<Source>(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 {

View File

@ -24,6 +24,8 @@
#include "config.h"
#include <optional>
#include <QtGlobal>
#include <QSharedData>
#include <QSharedDataPointer>
@ -211,6 +213,9 @@ class Song {
const QString &musicbrainz_release_group_id() const;
const QString &musicbrainz_work_id() const;
std::optional<double> ebur128_integrated_loudness_lufs() const;
std::optional<double> 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<double> &v);
void set_ebur128_loudness_range_lu(const std::optional<double> &v);
void set_stream_url(const QUrl &v);
const QUrl &effective_stream_url() const;