Additional prep work for supporting async Track queries in TrackListView

This commit is contained in:
casey langen 2020-09-30 00:13:27 -07:00
parent d235b3b116
commit 7aa7cf276d
10 changed files with 65 additions and 21 deletions

View File

@ -73,7 +73,7 @@ TrackMetadataQuery::TrackMetadataQuery(TrackPtr target, ILibraryPtr library, Typ
}
bool TrackMetadataQuery::OnRun(Connection& db) {
OutputDebugStringA(ALL_METADATA_QUERY_BY_ID.c_str());
result->SetMetadataState(MetadataState::Loading);
bool queryById = this->result->GetId() != 0;
@ -139,8 +139,10 @@ bool TrackMetadataQuery::OnRun(Connection& db) {
result->SetValue(constants::Track::SOURCE_ID, trackQuery.ColumnText(1));
}
result->SetMetadataState(MetadataState::Loaded);
return true;
}
result->SetMetadataState(MetadataState::Missing);
return false;
}

View File

@ -184,7 +184,7 @@ void IndexerTrack::SetThumbnail(const char *data, long size) {
int64_t IndexerTrack::GetThumbnailId() {
std::string key = this->GetString("album") + "-" + this->GetString("album_artist");
size_t id = hash32(key.c_str());
auto it = thumbnailIdCache.find(id);
auto it = thumbnailIdCache.find((int) id);
if (it != thumbnailIdCache.end()) {
return it->second;
}
@ -208,14 +208,15 @@ void IndexerTrack::SetReplayGain(const ReplayGain& replayGain) {
}
ReplayGain IndexerTrack::GetReplayGain() {
/* note: in practice this will never be called. the indexer only ever sets
the replay gain value, but never queries it. just return a dummy value. */
ReplayGain gain;
gain.albumGain = 1.0f;
gain.albumPeak = 1.0f;
gain.trackGain = 1.0f;
gain.trackPeak = 1.0f;
return gain;
throw std::runtime_error("not implemented");
}
MetadataState IndexerTrack::GetMetadataState() {
throw std::runtime_error("not implemented");
}
void IndexerTrack::SetMetadataState(MetadataState state) {
throw std::runtime_error("not implemented");
}
std::string IndexerTrack::Uri() {
@ -223,11 +224,11 @@ std::string IndexerTrack::Uri() {
}
int IndexerTrack::GetString(const char* key, char* dst, int size) {
return CopyString(this->GetString(key), dst, size);
return (int) CopyString(this->GetString(key), dst, size);
}
int IndexerTrack::Uri(char* dst, int size) {
return CopyString(this->Uri(), dst, size);
return (int) CopyString(this->Uri(), dst, size);
}
Track::MetadataIteratorRange IndexerTrack::GetValues(const char* metakey) {
@ -632,7 +633,7 @@ int64_t IndexerTrack::SaveAlbum(db::Connection& dbConnection, int64_t thumbnailI
updateStatement.BindInt64(1, albumId);
updateStatement.Step();
thumbnailIdCache[albumId] = thumbnailId;
thumbnailIdCache[(int) albumId] = thumbnailId;
}
return albumId;

View File

@ -62,13 +62,14 @@ namespace musik { namespace core {
virtual std::string Uri();
virtual int Uri(char* dst, int size);
virtual musik::core::sdk::ReplayGain GetReplayGain();
virtual musik::core::sdk::MetadataState GetMetadataState();
virtual MetadataIteratorRange GetValues(const char* metakey);
virtual MetadataIteratorRange GetAllValues();
virtual TrackPtr Copy();
virtual int64_t GetId();
virtual void SetId(int64_t trackId) { this->trackId = trackId; }
virtual void SetMetadataState(musik::core::sdk::MetadataState state);
bool NeedsToBeIndexed(
const boost::filesystem::path &file,

View File

@ -48,19 +48,22 @@ using namespace musik::core::sdk;
LibraryTrack::LibraryTrack()
: id(0)
, libraryId(0)
, gain(nullptr) {
, gain(nullptr)
, state(MetadataState::NotLoaded) {
}
LibraryTrack::LibraryTrack(int64_t id, int libraryId)
: id(id)
, libraryId(libraryId)
, gain(nullptr) {
, gain(nullptr)
, state(MetadataState::NotLoaded) {
}
LibraryTrack::LibraryTrack(int64_t id, ILibraryPtr library)
: id(id)
, libraryId(library->Id())
, gain(nullptr) {
, gain(nullptr)
, state(MetadataState::NotLoaded) {
}
LibraryTrack::~LibraryTrack() {
@ -151,6 +154,14 @@ void LibraryTrack::SetReplayGain(const ReplayGain& replayGain) {
*this->gain = replayGain;
}
MetadataState LibraryTrack::GetMetadataState() {
return this->state;
}
void LibraryTrack::SetMetadataState(musik::core::sdk::MetadataState state) {
this->state = state;
}
ReplayGain LibraryTrack::GetReplayGain() {
if (this->gain) {
return *gain;
@ -210,6 +221,8 @@ bool LibraryTrack::Load(Track *target, db::Connection &db) {
return false;
}
target->SetMetadataState(MetadataState::Loading);
db::Statement idFromFn(
"SELECT id " \
"FROM tracks " \
@ -293,8 +306,10 @@ bool LibraryTrack::Load(Track *target, db::Connection &db) {
target->SetReplayGain(gain);
}
target->SetMetadataState(MetadataState::Loaded);
return true;
}
target->SetMetadataState(MetadataState::Missing);
return false;
}

View File

@ -39,6 +39,7 @@
#include <core/library/LocalLibrary.h>
#include <core/db/Connection.h>
#include <mutex>
#include <atomic>
namespace musik { namespace core {
@ -72,6 +73,8 @@ namespace musik { namespace core {
virtual int GetString(const char* key, char* dst, int size);
virtual int Uri(char* dst, int size);
virtual musik::core::sdk::ReplayGain GetReplayGain();
virtual musik::core::sdk::MetadataState GetMetadataState();
virtual void SetMetadataState(musik::core::sdk::MetadataState state);
virtual MetadataIteratorRange GetValues(const char* metakey);
virtual MetadataIteratorRange GetAllValues();
@ -84,6 +87,7 @@ namespace musik { namespace core {
int libraryId;
Track::MetadataMap metadata;
std::mutex mutex;
std::atomic<musik::core::sdk::MetadataState> state;
musik::core::sdk::ReplayGain* gain;
};

View File

@ -102,6 +102,10 @@ class SdkWrapper : public Track {
return track->GetReplayGain();
}
virtual MetadataState GetMetadataState() {
return track->GetMetadataState();
}
/* pure virtual methods defined by Track, but not defined in ITrack. therefore,
these methods cannot be called by the SDK, and should throw. */
#define NO_IMPL throw std::runtime_error("not implemented");
@ -117,6 +121,7 @@ class SdkWrapper : public Track {
virtual MetadataIteratorRange GetValues(const char* metakey) override { NO_IMPL }
virtual MetadataIteratorRange GetAllValues() override { NO_IMPL }
virtual TrackPtr Copy() override { NO_IMPL }
virtual void SetMetadataState(MetadataState state) override { NO_IMPL }
#undef NO_IMPL
private:

View File

@ -95,6 +95,7 @@ namespace musik { namespace core {
virtual MetadataIteratorRange GetValues(const char* metakey) = 0;
virtual MetadataIteratorRange GetAllValues() = 0;
virtual TrackPtr Copy() = 0;
virtual void SetMetadataState(musik::core::sdk::MetadataState state) = 0;
/* for SDK interop */
ITrack* GetSdkValue();

View File

@ -36,6 +36,7 @@
#include "IMap.h"
#include "ReplayGain.h"
#include "constants.h"
namespace musik { namespace core { namespace sdk {
@ -46,6 +47,7 @@ namespace musik { namespace core { namespace sdk {
/* sdk v19 */
virtual ReplayGain GetReplayGain() = 0;
virtual MetadataState GetMetadataState() = 0;
};
} } }

View File

@ -83,7 +83,7 @@ namespace musik {
PathLibrary = 4
};
enum class Capability : int {
enum class Capability: int {
Prebuffer = 0x01
};
@ -92,13 +92,13 @@ namespace musik {
ScanRollback = 2
};
enum class ReplayGainMode : int {
enum class ReplayGainMode: int {
Disabled = 0,
Track = 1,
Album = 2
};
enum class TransportType : int {
enum class TransportType: int {
Gapless = 0,
Crossfade = 1
};
@ -114,6 +114,13 @@ namespace musik {
NoDSP = 1
};
enum class MetadataState: int {
NotLoaded = 0,
Loading = 1,
Loaded = 2,
Missing = 3
};
static const size_t EqualizerBandCount = 18;
static const size_t EqualizerBands[] = {

View File

@ -462,11 +462,17 @@ IScrollAdapter::EntryPtr TrackListView::Adapter::GetEntry(cursespp::ScrollableWi
size_t trackIndex = this->parent.headers.AdapterToTrackListIndex(rawIndex);
TrackPtr track = parent.tracks->Get(trackIndex);
if (!track) {
if (!track ||
track->GetMetadataState() == MetadataState::Missing ||
track->GetMetadataState() == MetadataState::NotLoaded)
{
auto entry = std::shared_ptr<SingleLineEntry>(new SingleLineEntry("track missing"));
entry->SetAttrs(selected ? Color::ListItemHighlighted : Color::TextError);
return entry;
}
else if (track->GetMetadataState() == MetadataState::Loading) {
return std::shared_ptr<SingleLineEntry>(new SingleLineEntry(" -"));
}
Color attrs = Color::Default;