annotate foosdk/sdk/foobar2000/SDK/track_property.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 "tracks.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 class track_property_provider_v5_info_source;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class track_property_provider_v3_info_source;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Callback interface for track_property_provider::enumerate_properties().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class NOVTABLE track_property_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! Sets a property list entry to display. Called by track_property_provider::enumerate_properties() implementation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! @param p_group Name of group to put the entry in, case-sensitive. Note that non-standard groups are sorted alphabetically.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! @param p_sortpriority Sort priority of the property inside its group (smaller value means earlier in the list), pass 0 if you don't care (alphabetic order by name used when more than one item has same priority).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! @param p_name Name of the property.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! @param p_value Value of the property.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 virtual void set_property(const char * p_group,double p_sortpriority,const char * p_name,const char * p_value) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 track_property_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 ~track_property_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 track_property_callback(track_property_callback const &) {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 void operator=(track_property_callback const &) {};
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! Extended version of track_property_callback
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 class NOVTABLE track_property_callback_v2 : public track_property_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! Returns a boolean value indicating whether the specified group is wanted; can be used to suppress expensive processing of information that will not be actually shown. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 //! See also set_property() p_group parameter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 virtual bool is_group_wanted(const char * p_group) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 ~track_property_callback_v2() {}
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 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 class NOVTABLE track_property_provider_v3_info_source {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 virtual trackInfoContainer::ptr get_info(size_t index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 track_property_provider_v3_info_source() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 ~track_property_provider_v3_info_source() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 track_property_provider_v3_info_source( const track_property_provider_v3_info_source & ) {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 void operator=( const track_property_provider_v3_info_source & ) {};
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! Service for adding custom entries in "Properties" tab of the properties dialog.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 class NOVTABLE track_property_provider : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! Enumerates properties of specified track list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //! @param p_tracks List of tracks to enumerate properties on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! @param p_out Callback interface receiving enumerated properties.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 virtual void enumerate_properties(trackListRef p_tracks, track_property_callback & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Returns whether specified tech info filed is processed by our service and should not be displayed among unknown fields.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! @param p_name Name of tech info field being queried.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 //! @returns True if the field is among fields processed by this track_property_provider implementation and should not be displayed among unknown fields, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 virtual bool is_our_tech_info(const char * p_name) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! Helper; calls modern versions of this API where appropriate.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //! @param items List of tracks to enumerate properties on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 //! @param info Callback object to fetch info from. Pass null to use a generic implementation querying the metadb.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! @param callback Callback interface receiving enumerated properties.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 //! @param abort The aborter for this operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 void 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
65 void 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
66 void 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
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(track_property_provider);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 class NOVTABLE track_property_provider_v2 : public track_property_provider {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v2,track_property_provider)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 virtual void enumerate_properties_v2(trackListRef p_tracks, track_property_callback_v2 & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 class NOVTABLE track_property_provider_v3 : public track_property_provider_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v3,track_property_provider_v2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 virtual void enumerate_properties_v3(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback) = 0;
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 void enumerate_properties(trackListRef p_tracks, track_property_callback & p_out) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 void enumerate_properties_v2(trackListRef p_tracks, track_property_callback_v2 & p_out) override;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 class track_property_provider_factory_t : public service_factory_single_t<T> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! Adds abortability on top of track_property_provider_v3 interface. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 //! The previous revisions of this API were only legal to call from the main thread. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 //! track_property_provider_v4 implementers should make NO ASSUMPTIONS about the thread they are in. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! Implementing track_property_provider_v4 declares your class as safe to call from any thread. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! If called via enumerate_properties_v4() method or off-main-thread, the implementation can assume the info source object to be thread-safe.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 class NOVTABLE track_property_provider_v4 : public track_property_provider_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v4, track_property_provider_v3 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 void enumerate_properties_v3(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback) override;
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 virtual void enumerate_properties_v4(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback, abort_callback & abort) = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 //! Allows metadb v2 info records to be handed over transparently.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 class NOVTABLE track_property_provider_v5_info_source {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 virtual metadb_v2_rec_t get_info(size_t index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! Allows metadb v2 info records to be handed over transparently.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 class NOVTABLE track_property_provider_v5 : public track_property_provider_v4 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v5, track_property_provider_v4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 void enumerate_properties_v4(trackListRef items, track_property_provider_v3_info_source& info, track_property_callback_v2& callback, abort_callback& abort) override;
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 virtual void enumerate_properties_v5(trackListRef items, track_property_provider_v5_info_source& info, track_property_callback_v2& callback, abort_callback& abort) = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 class track_property_provider_v5_info_source_impl : public track_property_provider_v5_info_source {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 track_property_provider_v5_info_source_impl(trackListRef items, abort_callback &a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 metadb_v2_rec_t get_info(size_t index) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 pfc::array_t< metadb_v2_rec_t > m_infos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 #if FOOBAR2000_TARGET_VERSION < 81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 metadb_handle_list m_tracks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 };