annotate foosdk/sdk/foobar2000/helpers/track_property_callback_impl.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 "StdAfx.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 <list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <memory>
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 #include "track_property_callback_impl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <SDK/threadPool.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include <SDK/track_property.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 void track_property_callback_impl::set_property(const char * p_group, double p_sortpriority, const char * p_name, const char * p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 propertyname_container temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 temp.m_name = p_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 temp.m_priority = p_sortpriority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 pfc::string8 fixEOL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if (m_cutMultiLine && strchr(p_value, '\n') != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 fixEOL = p_value; fixEOL.fix_eol(); p_value = fixEOL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 m_entries.find_or_add(p_group).set(temp, p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
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 bool track_property_callback_impl::is_group_wanted(const char * p_group) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 if (m_groupFilter) return m_groupFilter(p_group);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 return true;
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 void track_property_callback_impl::merge(track_property_callback_impl const & other) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 for (auto iterGroup = other.m_entries.first(); iterGroup.is_valid(); ++iterGroup) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 auto & in = iterGroup->m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 auto & out = m_entries[iterGroup->m_key];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 for (auto iterEntry = in.first(); iterEntry.is_valid(); ++iterEntry) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 out.set(iterEntry->m_key, iterEntry->m_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
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 static bool is_filtered_info_field(const char * p_name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 for (auto ptr : track_property_provider::enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 if (ptr->is_our_tech_info(p_name)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 static const char strGroupOther[] = "Other";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 static pfc::string8 encloseInfoName(const char* name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 pfc::string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 temp << "<";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 uAddStringUpper(temp, name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 temp << ">";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 return temp;
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 static void enumOtherHere(track_property_callback_impl & callback, metadb_info_container::ptr info_) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 if (info_.is_empty()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 const file_info * infoptr = &info_->info();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 for (t_size n = 0, m = infoptr->info_get_count(); n < m; n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 const char * name = infoptr->info_enum_name(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 if (!is_filtered_info_field(name)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 callback.set_property(strGroupOther, 0, encloseInfoName(name), infoptr->info_enum_value(n));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 static trackInfoContainer::ptr getInfoHelper(track_property_provider_v3_info_source* source, size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 return source->get_info(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
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 static trackInfoContainer::ptr getInfoHelper(track_property_provider_v5_info_source* source, size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 return source->get_info(idx).info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
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 template<typename infoSource_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 static void enumOther( track_property_callback_impl & callback, metadb_handle_list_cref items, infoSource_t* infoSource ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 const size_t itemCount = items.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 if (itemCount == 1 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 enumOtherHere(callback, getInfoHelper(infoSource,0) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 typedef file_info::field_name_comparator field_name_comparator_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 typedef pfc::comparator_stricmp_ascii value_comparator_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 typedef pfc::avltree_t< pfc::string8, field_name_comparator_t > field_mask_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 struct stats_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 size_t count = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 double totalDuration = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 typedef pfc::map_t<pfc::string8,stats_t,value_comparator_t > field_results_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 typedef pfc::map_t<pfc::string8, field_results_t, field_name_comparator_t> results_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 results_t results;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 field_mask_t fieldsIgnore, fieldsUse;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 bool useDuration = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 double totalDuration = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 for (size_t itemWalk = 0; itemWalk < itemCount; ++itemWalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 auto info_ = getInfoHelper(infoSource, itemWalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 if (info_.is_empty()) continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 const file_info * infoptr = &info_->info();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 const size_t numInfo = infoptr->info_get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 const double duration = infoptr->get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 if (duration > 0) totalDuration += duration;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 else useDuration = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 for (size_t infoWalk = 0; infoWalk < numInfo; ++infoWalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 const char * name = infoptr->info_enum_name(infoWalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 if ( fieldsIgnore.contains( name )) continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 if (!fieldsUse.contains(name)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 const bool bUse = !is_filtered_info_field( name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 if ( bUse ) fieldsUse += name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 else { fieldsIgnore += name; continue; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 const char * value = infoptr->info_enum_value(infoWalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 auto & stats = results[name][value];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 ++ stats.count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 if ( duration > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 stats.totalDuration += duration;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 for (auto iter = results.first(); iter.is_valid(); ++iter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 const auto key = encloseInfoName(iter->m_key);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 pfc::string8 out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 if (iter->m_value.get_count() == 1 && iter->m_value.first()->m_value.count == itemCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 out = iter->m_value.first()->m_key;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 for (auto iterValue = iter->m_value.first(); iterValue.is_valid(); ++iterValue) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 double percentage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 if ( useDuration ) percentage = iterValue->m_value.totalDuration / totalDuration;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 else percentage = (double) iterValue->m_value.count / (double) itemCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 if (!out.is_empty()) out << "; ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 out << iterValue->m_key << " (" << pfc::format_fixedpoint( pfc::rint64( percentage * 1000.0), 1) << "%)";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 callback.set_property(strGroupOther, 0, key, out);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 template<typename source_t> static void enumerateTrackProperties_(track_property_callback_impl& callback, std::function< metadb_handle_list_cref() > itemsSource, source_t infoSource, std::function<abort_callback& () > abortSource) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 if (core_api::is_main_thread()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 // should not get here like this
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 // but that does make our job easier
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 auto& items = itemsSource();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 auto info = infoSource();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 for (auto ptr : track_property_provider::enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 ptr->enumerate_properties_helper(items, info, callback, abortSource());
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 if (callback.is_group_wanted(strGroupOther)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 enumOther(callback, items, info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 std::list<std::shared_ptr<pfc::event> > lstWaitFor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 std::list<std::shared_ptr< track_property_callback_impl > > lstMerge;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 for (auto ptr : track_property_provider::enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 auto evt = std::make_shared<pfc::event>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 auto cb = std::make_shared< track_property_callback_impl >(callback); // clone watched group info
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 auto work = [ptr, itemsSource, evt, cb, infoSource, abortSource] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 ptr->enumerate_properties_helper(itemsSource(), infoSource(), *cb, abortSource());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 } catch (...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 evt->set_state(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 track_property_provider_v4::ptr v4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 if (v4 &= ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 // Supports v4 = split a worker thread, work in parallel
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 fb2k::inCpuWorkerThread(work);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 // No v4 = delegate to main thread. Ugly but gets the job done.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 fb2k::inMainThread(work);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 lstWaitFor.push_back(std::move(evt));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 lstMerge.push_back(std::move(cb));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 if (callback.is_group_wanted(strGroupOther)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 enumOther(callback, itemsSource(), infoSource());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 for (auto& i : lstWaitFor) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 abortSource().waitForEvent(*i, -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 for (auto& i : lstMerge) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 callback.merge(*i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 void enumerateTrackProperties(track_property_callback_impl& callback, std::function< metadb_handle_list_cref() > itemsSource, std::function<track_property_provider_v3_info_source* ()> infoSource, std::function<abort_callback& () > abortSource) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 enumerateTrackProperties_(callback, itemsSource, infoSource, abortSource);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 void enumerateTrackProperties_v5(track_property_callback_impl& callback, std::function< metadb_handle_list_cref() > itemsSource, std::function<track_property_provider_v5_info_source* ()> infoSource, std::function<abort_callback& () > abortSource) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 enumerateTrackProperties_(callback, itemsSource, infoSource, abortSource);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }