mirror of
https://github.com/clangen/musikcube.git
synced 2025-03-14 04:18:36 +00:00
Additional prep work for supporting async Track queries in TrackListView
This commit is contained in:
parent
d235b3b116
commit
7aa7cf276d
@ -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;
|
||||
}
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
} } }
|
||||
|
@ -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[] = {
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user