annotate foosdk/sdk/foobar2000/SDK/track_property.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "track_property.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "metadb_info_container_impl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class track_property_provider_v3_info_source_impl : public track_property_provider_v3_info_source {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 track_property_provider_v3_info_source_impl(trackListRef items) : m_items(items) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 trackInfoContainer::ptr get_info(size_t index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 return trackGetInfoRef(m_items, index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 trackListRef m_items;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 class track_property_callback_v2_proxy : public track_property_callback_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 track_property_callback_v2_proxy(track_property_callback & callback) : m_callback(callback) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 void set_property(const char * p_group, double p_sortpriority, const char * p_name, const char * p_value) { m_callback.set_property(p_group, p_sortpriority, p_name, p_value); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 bool is_group_wanted(const char*) { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 track_property_callback & m_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 void track_property_provider_v3::enumerate_properties(trackListRef p_tracks, track_property_callback & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 track_property_provider_v3_info_source_impl src(p_tracks); track_property_callback_v2_proxy cb(p_out); enumerate_properties_v3(p_tracks, src, cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 void track_property_provider_v3::enumerate_properties_v2(trackListRef p_tracks, track_property_callback_v2 & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 track_property_provider_v3_info_source_impl src(p_tracks); enumerate_properties_v3(p_tracks, src, p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void track_property_provider_v4::enumerate_properties_v3(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 this->enumerate_properties_v4(items, info, callback, fb2k::noAbort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 class track_property_provider_v5_info_source_wrap : public track_property_provider_v5_info_source {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 track_property_provider_v5_info_source_wrap(track_property_provider_v3_info_source& chain, trackListRef items) : m_chain(chain), m_items(items) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 track_property_provider_v3_info_source & m_chain;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 trackListRef m_items;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 // Not very efficient but gets the job done
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 metadb_v2_rec_t get_info(size_t index) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 auto ret = m_items[index]->query_v2_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 ret.info = m_chain.get_info(index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 void track_property_provider_v5::enumerate_properties_v4(trackListRef items, track_property_provider_v3_info_source& info, track_property_callback_v2& callback, abort_callback& abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 track_property_provider_v5_info_source_wrap wrap(info, items);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 this->enumerate_properties_v5(items, wrap, callback, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 class track_property_provider_v3_info_source_wrap_v5 : public track_property_provider_v3_info_source {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 track_property_provider_v5_info_source* chain;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 trackInfoContainer::ptr get_info(size_t index) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 auto ret = chain->get_info(index).info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (ret.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 ret = m_blank;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 metadb_info_container::ptr m_blank = fb2k::service_new<metadb_info_container_const_impl>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 metadb_v2_rec_t track_property_provider_v5_info_source_impl::get_info(size_t index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 #if FOOBAR2000_TARGET_VERSION >= 81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 return m_infos[index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 if (index < m_infos.get_size()) return m_infos[index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 else if (index < m_tracks.get_size()) return m_tracks[index]->query_v2_();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 else uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 track_property_provider_v5_info_source_impl::track_property_provider_v5_info_source_impl(trackListRef items, abort_callback & a) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #if FOOBAR2000_TARGET_VERSION >= 81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 m_infos.resize(items.get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 metadb_v2::get()->queryMultiParallel_(items, [this, &a](size_t idx, metadb_v2_rec_t const& rec) {a.check(); this->m_infos[idx] = rec; });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 auto api = metadb_v2::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (api.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 m_infos.resize(items.get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 api->queryMultiParallel_(items, [this](size_t idx, metadb_v2_rec_t const& rec) {this->m_infos[idx] = rec; });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 // pre-2.0 metadb, talking to metadb directly is OK, no need to get info preemptively
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 m_tracks = items;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 void track_property_provider::enumerate_properties_helper(trackListRef items, track_property_provider_v5_info_source* info, track_property_callback_v2& callback, abort_callback& abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 if (info == nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 this->enumerate_properties_helper(items, nullptr, callback, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 track_property_provider_v5::ptr v5;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 if (v5 &= this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 v5->enumerate_properties_v5(items, *info, callback, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 track_property_provider_v3_info_source_wrap_v5 wrap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 wrap.chain = info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 this->enumerate_properties_helper(items, &wrap, callback, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 void track_property_provider::enumerate_properties_helper(trackListRef items, std::nullptr_t, track_property_callback_v2& callback, abort_callback& abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 track_property_provider_v5::ptr v5;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 if (v5 &= this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 track_property_provider_v5_info_source_impl infoImpl(items, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 v5->enumerate_properties_v5(items, infoImpl, callback, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 track_property_provider_v3_info_source* dummy = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 this->enumerate_properties_helper(items, dummy, callback, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 void track_property_provider::enumerate_properties_helper(trackListRef items, track_property_provider_v3_info_source * info, track_property_callback_v2 & callback, abort_callback & abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 track_property_provider_v2::ptr v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 if ( ! this->cast( v2 ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 // no v2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 this->enumerate_properties( items, callback ); return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 track_property_provider_v3::ptr v3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if ( ! (v3 &= v2 ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 // no v3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 v2->enumerate_properties_v2( items, callback ); return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 track_property_provider_v3_info_source_impl infoFallback ( items );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 if ( info == nullptr ) info = & infoFallback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 track_property_provider_v4::ptr v4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 if (! ( v4 &= v3 ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 // no v4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 PFC_ASSERT( core_api::is_main_thread() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 v3->enumerate_properties_v3( items, *info, callback );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 v4->enumerate_properties_v4( items, *info, callback, abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }