summaryrefslogtreecommitdiff
path: root/src/database/include/track.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-12-12 12:59:38 +1100
committerjacqueline <me@jacqueline.id.au>2023-12-12 12:59:38 +1100
commit01eb8683733f39a6de984111f035bb8f71dcf8b8 (patch)
treefb682164eb781a26d1798294180632e63a724f52 /src/database/include/track.hpp
parentbd730c82b0423af65f7148bb4abe01e1c3430691 (diff)
downloadtangara-fw-01eb8683733f39a6de984111f035bb8f71dcf8b8.tar.gz
Support more datatypes in track tags
Diffstat (limited to 'src/database/include/track.hpp')
-rw-r--r--src/database/include/track.hpp63
1 files changed, 47 insertions, 16 deletions
diff --git a/src/database/include/track.hpp b/src/database/include/track.hpp
index 0497c94d..610ab487 100644
--- a/src/database/include/track.hpp
+++ b/src/database/include/track.hpp
@@ -15,6 +15,7 @@
#include <string>
#include <unordered_map>
#include <utility>
+#include <variant>
#include "leveldb/db.h"
#include "memory_resource.hpp"
@@ -51,12 +52,21 @@ enum class Tag {
kTitle = 0,
kArtist = 1,
kAlbum = 2,
- kAlbumTrack = 3,
- kGenre = 4,
- kDuration = 5,
+ kAlbumArtist = 3,
+ kDisc = 4,
+ kTrack = 5,
+ kAlbumOrder = 6,
+ kGenres = 7,
};
-auto TagToString(Tag t) -> std::string;
+using TagValue = std::variant<std::monostate,
+ std::pmr::string,
+ uint32_t,
+ cpp::span<const std::pmr::string>>;
+
+auto tagName(Tag) -> std::string;
+auto tagHash(const TagValue&) -> uint64_t;
+auto tagToString(const TagValue&) -> std::string;
/*
* Owning container for tag-related track metadata that was extracted from a
@@ -65,29 +75,43 @@ auto TagToString(Tag t) -> std::string;
class TrackTags {
public:
TrackTags()
- : encoding_(Container::kUnsupported), tags_(&memory::kSpiRamResource) {}
+ : encoding_(Container::kUnsupported), genres_(&memory::kSpiRamResource) {}
TrackTags(const TrackTags& other) = delete;
TrackTags& operator=(TrackTags& other) = delete;
bool operator==(const TrackTags&) const = default;
+ auto get(Tag) const -> TagValue;
+ auto set(Tag, std::string_view) -> void;
+
+ auto allPresent() const -> std::vector<Tag>;
+
auto encoding() const -> Container { return encoding_; };
auto encoding(Container e) -> void { encoding_ = e; };
- std::optional<int> channels;
- std::optional<int> sample_rate;
- std::optional<int> bits_per_sample;
+ auto title() const -> const std::optional<std::pmr::string>&;
+ auto title(std::string_view) -> void;
+
+ auto artist() const -> const std::optional<std::pmr::string>&;
+ auto artist(std::string_view) -> void;
- std::optional<int> duration;
+ auto album() const -> const std::optional<std::pmr::string>&;
+ auto album(std::string_view) -> void;
- auto set(const Tag& key, const std::pmr::string& val) -> void;
- auto at(const Tag& key) const -> std::optional<std::pmr::string>;
- auto operator[](const Tag& key) const -> std::optional<std::pmr::string>;
+ auto albumArtist() const -> const std::optional<std::pmr::string>&;
+ auto albumArtist(std::string_view) -> void;
- auto tags() const -> const std::pmr::unordered_map<Tag, std::pmr::string>& {
- return tags_;
- }
+ auto disc() const -> const std::optional<uint8_t>&;
+ auto disc(const std::string_view) -> void;
+
+ auto track() const -> const std::optional<uint16_t>&;
+ auto track(const std::string_view) -> void;
+
+ auto albumOrder() const -> uint32_t;
+
+ auto genres() const -> cpp::span<const std::pmr::string>;
+ auto genres(const std::string_view) -> void;
/*
* Returns a hash of the 'identifying' tags of this track. That is, a hash
@@ -99,7 +123,14 @@ class TrackTags {
private:
Container encoding_;
- std::pmr::unordered_map<Tag, std::pmr::string> tags_;
+
+ std::optional<std::pmr::string> title_;
+ std::optional<std::pmr::string> artist_;
+ std::optional<std::pmr::string> album_;
+ std::optional<std::pmr::string> album_artist_;
+ std::optional<uint8_t> disc_;
+ std::optional<uint16_t> track_;
+ std::pmr::vector<std::pmr::string> genres_;
};
/*