annotate foosdk/sdk/foobar2000/helpers/track_property_callback_impl.h @ 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 #pragma once
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 <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <SDK/track_property.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 class groupname_comparator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 static int compare(pfc::stringp p_name1,pfc::stringp p_name2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 int temp = uStringCompare(p_name1,p_name2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 if (temp != 0) return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 return strcmp(p_name1,p_name2);
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 };
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 struct propertyname_container {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 pfc::string m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 double m_priority;
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 class propertyname_comparator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 static int compare(const propertyname_container & p_item1,const propertyname_container & p_item2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 int state = pfc::compare_t(p_item1.m_priority,p_item2.m_priority);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 if (state != 0) return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 return uStringCompare(p_item1.m_name.ptr(),p_item2.m_name.ptr());
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 typedef pfc::map_t<propertyname_container,pfc::string,propertyname_comparator> property_group;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 typedef pfc::map_t<pfc::string,property_group,groupname_comparator> t_property_group_list;
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 class track_property_callback_impl : public track_property_callback_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 void set_property(const char * p_group,double p_sortpriority,const char * p_name,const char * p_value) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 bool is_group_wanted(const char * p_group) override;
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 merge( track_property_callback_impl const & other );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 t_property_group_list m_entries;
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 bool m_cutMultiLine = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 typedef std::function<bool ( const char * ) > groupFilter_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 groupFilter_t m_groupFilter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 };
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 // Helper function to walk all track property providers in an optimized multithread manner
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 // Various *source arguments have been std::function'd so you can reference your own data structures gracefully
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 // If the function is aborted, it returns immediately - while actual worker threads may not yet have completed, and may still reference *source arguments.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 // You must ensure - by means of std::shared_ptr<> or such - that all of the *source arguments remain accessible even after enumerateTrackProperties() returns, until the std::functions are released.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 // Legacy track property providers that do not support off main thread operation will be invoked via main_thread_callback in main thread, and the function will stall until they have returned (unless aborted).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 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
53 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);