From c6bb42cdd21b63accd20012373a8a0e41d8566f5 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 15 Jun 2023 10:42:28 +1000 Subject: song -> track --- src/database/track.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/database/track.cpp (limited to 'src/database/track.cpp') diff --git a/src/database/track.cpp b/src/database/track.cpp new file mode 100644 index 00000000..00acc1f6 --- /dev/null +++ b/src/database/track.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "track.hpp" + +#include + +namespace database { + +/* Helper function to update a komihash stream with a std::string. */ +auto HashString(komihash_stream_t* stream, std::string str) -> void { + komihash_stream_update(stream, str.c_str(), str.length()); +} + +/* + * Uses a komihash stream to incrementally hash tags. This lowers the function's + * memory footprint a little so that it's safe to call from any stack. + */ +auto TrackTags::Hash() const -> uint64_t { + // TODO(jacqueline): this function doesn't work very well for tracks with no + // tags at all. + komihash_stream_t stream; + komihash_stream_init(&stream, 0); + HashString(&stream, title.value_or("")); + HashString(&stream, artist.value_or("")); + HashString(&stream, album.value_or("")); + return komihash_stream_final(&stream); +} + +auto TrackData::UpdateHash(uint64_t new_hash) const -> TrackData { + return TrackData(id_, filepath_, new_hash, play_count_, is_tombstoned_); +} + +auto TrackData::Entomb() const -> TrackData { + return TrackData(id_, filepath_, tags_hash_, play_count_, true); +} + +auto TrackData::Exhume(const std::string& new_path) const -> TrackData { + return TrackData(id_, new_path, tags_hash_, play_count_, false); +} + +void swap(Track& first, Track& second) { + Track temp = first; + first = second; + second = temp; +} + +} // namespace database -- cgit v1.2.3