song info: show replay gain info if available (flac/ogg only)
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
#include "song_info.h"
|
#include "song_info.h"
|
||||||
#include "tag_editor.h"
|
#include "tag_editor.h"
|
||||||
|
#include "tags.h"
|
||||||
#include "title.h"
|
#include "title.h"
|
||||||
#include "screen_switcher.h"
|
#include "screen_switcher.h"
|
||||||
|
|
||||||
@@ -124,7 +125,17 @@ void SongInfo::PrepareSong(MPD::Song &s)
|
|||||||
}
|
}
|
||||||
w << NC::Format::Bold << "Bitrate: " << NC::Format::NoBold << Config.color2 << f.audioProperties()->bitrate() << " kbps\n" << NC::Color::End;
|
w << NC::Format::Bold << "Bitrate: " << NC::Format::NoBold << Config.color2 << f.audioProperties()->bitrate() << " kbps\n" << NC::Color::End;
|
||||||
w << NC::Format::Bold << "Sample rate: " << NC::Format::NoBold << Config.color2 << f.audioProperties()->sampleRate() << " Hz\n" << NC::Color::End;
|
w << NC::Format::Bold << "Sample rate: " << NC::Format::NoBold << Config.color2 << f.audioProperties()->sampleRate() << " Hz\n" << NC::Color::End;
|
||||||
w << NC::Format::Bold << "Channels: " << NC::Format::NoBold << Config.color2 << channels << '\n' << NC::Color::Default;
|
w << NC::Format::Bold << "Channels: " << NC::Format::NoBold << Config.color2 << channels << NC::Color::End << "\n";
|
||||||
|
|
||||||
|
auto rginfo = Tags::readReplayGain(f.file());
|
||||||
|
if (!rginfo.empty())
|
||||||
|
{
|
||||||
|
w << NC::Format::Bold << "\nReference loudness: " << NC::Format::NoBold << Config.color2 << rginfo.referenceLoudness() << NC::Color::End << "\n";
|
||||||
|
w << NC::Format::Bold << "Track gain: " << NC::Format::NoBold << Config.color2 << rginfo.trackGain() << NC::Color::End << "\n";
|
||||||
|
w << NC::Format::Bold << "Track peak: " << NC::Format::NoBold << Config.color2 << rginfo.trackPeak() << NC::Color::End << "\n";
|
||||||
|
w << NC::Format::Bold << "Album gain: " << NC::Format::NoBold << Config.color2 << rginfo.albumGain() << NC::Color::End << "\n";
|
||||||
|
w << NC::Format::Bold << "Album peak: " << NC::Format::NoBold << Config.color2 << rginfo.albumPeak() << NC::Color::End << "\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
|
|||||||
34
src/tags.cpp
34
src/tags.cpp
@@ -187,6 +187,24 @@ void writeXiphComments(const MPD::MutableSong &s, TagLib::Ogg::XiphComment *tag)
|
|||||||
writeXiph("COMMENT", tagList(s, &MPD::Song::getComment));
|
writeXiph("COMMENT", tagList(s, &MPD::Song::getComment));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tags::ReplayGainInfo getReplayGain(TagLib::Ogg::XiphComment *tag)
|
||||||
|
{
|
||||||
|
auto first_or_empty = [](const TagLib::StringList &list) {
|
||||||
|
std::string result;
|
||||||
|
if (!list.isEmpty())
|
||||||
|
result = list.front().to8Bit(true);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
auto &fields = tag->fieldListMap();
|
||||||
|
return Tags::ReplayGainInfo(
|
||||||
|
first_or_empty(fields["REPLAYGAIN_REFERENCE_LOUDNESS"]),
|
||||||
|
first_or_empty(fields["REPLAYGAIN_TRACK_GAIN"]),
|
||||||
|
first_or_empty(fields["REPLAYGAIN_TRACK_PEAK"]),
|
||||||
|
first_or_empty(fields["REPLAYGAIN_ALBUM_GAIN"]),
|
||||||
|
first_or_empty(fields["REPLAYGAIN_ALBUM_PEAK"])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Tags {//
|
namespace Tags {//
|
||||||
@@ -198,6 +216,22 @@ bool extendedSetSupported(const TagLib::File *f)
|
|||||||
|| dynamic_cast<const TagLib::FLAC::File *>(f);
|
|| dynamic_cast<const TagLib::FLAC::File *>(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReplayGainInfo readReplayGain(TagLib::File *f)
|
||||||
|
{
|
||||||
|
ReplayGainInfo result;
|
||||||
|
if (auto ogg_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f))
|
||||||
|
{
|
||||||
|
if (auto xiph = ogg_file->tag())
|
||||||
|
result = getReplayGain(xiph);
|
||||||
|
}
|
||||||
|
else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f))
|
||||||
|
{
|
||||||
|
if (auto xiph = flac_file->xiphComment())
|
||||||
|
result = getReplayGain(xiph);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void read(MPD::MutableSong &s)
|
void read(MPD::MutableSong &s)
|
||||||
{
|
{
|
||||||
TagLib::FileRef f(s.getURI().c_str());
|
TagLib::FileRef f(s.getURI().c_str());
|
||||||
|
|||||||
34
src/tags.h
34
src/tags.h
@@ -30,6 +30,40 @@
|
|||||||
|
|
||||||
namespace Tags {//
|
namespace Tags {//
|
||||||
|
|
||||||
|
struct ReplayGainInfo
|
||||||
|
{
|
||||||
|
ReplayGainInfo() { }
|
||||||
|
ReplayGainInfo(std::string reference_loudness, std::string track_gain,
|
||||||
|
std::string track_peak, std::string album_gain,
|
||||||
|
std::string album_peak)
|
||||||
|
: m_reference_loudness(reference_loudness), m_track_gain(track_gain)
|
||||||
|
, m_track_peak(track_peak), m_album_gain(album_gain), m_album_peak(album_peak) { }
|
||||||
|
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return m_reference_loudness.empty()
|
||||||
|
&& m_track_gain.empty()
|
||||||
|
&& m_track_peak.empty()
|
||||||
|
&& m_album_gain.empty()
|
||||||
|
&& m_album_peak.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string &referenceLoudness() const { return m_reference_loudness; }
|
||||||
|
const std::string &trackGain() const { return m_track_gain; }
|
||||||
|
const std::string &trackPeak() const { return m_track_peak; }
|
||||||
|
const std::string &albumGain() const { return m_album_gain; }
|
||||||
|
const std::string &albumPeak() const { return m_album_peak; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_reference_loudness;
|
||||||
|
std::string m_track_gain;
|
||||||
|
std::string m_track_peak;
|
||||||
|
std::string m_album_gain;
|
||||||
|
std::string m_album_peak;
|
||||||
|
};
|
||||||
|
|
||||||
|
ReplayGainInfo readReplayGain(TagLib::File *f);
|
||||||
|
|
||||||
bool extendedSetSupported(const TagLib::File *f);
|
bool extendedSetSupported(const TagLib::File *f);
|
||||||
|
|
||||||
void read(MPD::MutableSong &);
|
void read(MPD::MutableSong &);
|
||||||
|
|||||||
Reference in New Issue
Block a user