comparison 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
comparison
equal deleted inserted replaced
0:e9bb126753e7 1:20d02a178406
1 #pragma once
2
3 #include "tracks.h"
4
5 class track_property_provider_v5_info_source;
6 class track_property_provider_v3_info_source;
7
8 //! Callback interface for track_property_provider::enumerate_properties().
9 class NOVTABLE track_property_callback {
10 public:
11 //! Sets a property list entry to display. Called by track_property_provider::enumerate_properties() implementation.
12 //! @param p_group Name of group to put the entry in, case-sensitive. Note that non-standard groups are sorted alphabetically.
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).
14 //! @param p_name Name of the property.
15 //! @param p_value Value of the property.
16 virtual void set_property(const char * p_group,double p_sortpriority,const char * p_name,const char * p_value) = 0;
17 protected:
18 track_property_callback() {}
19 ~track_property_callback() {}
20 track_property_callback(track_property_callback const &) {};
21 void operator=(track_property_callback const &) {};
22 };
23
24 //! Extended version of track_property_callback
25 class NOVTABLE track_property_callback_v2 : public track_property_callback {
26 public:
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
28 //! See also set_property() p_group parameter.
29 virtual bool is_group_wanted(const char * p_group) = 0;
30 protected:
31 ~track_property_callback_v2() {}
32 };
33
34 //! \since 1.3
35 class NOVTABLE track_property_provider_v3_info_source {
36 public:
37 virtual trackInfoContainer::ptr get_info(size_t index) = 0;
38
39 protected:
40 track_property_provider_v3_info_source() {}
41 ~track_property_provider_v3_info_source() {}
42 track_property_provider_v3_info_source( const track_property_provider_v3_info_source & ) {};
43 void operator=( const track_property_provider_v3_info_source & ) {};
44 };
45
46 //! Service for adding custom entries in "Properties" tab of the properties dialog.
47 class NOVTABLE track_property_provider : public service_base {
48 public:
49 //! Enumerates properties of specified track list.
50 //! @param p_tracks List of tracks to enumerate properties on.
51 //! @param p_out Callback interface receiving enumerated properties.
52 virtual void enumerate_properties(trackListRef p_tracks, track_property_callback & p_out) = 0;
53 //! Returns whether specified tech info filed is processed by our service and should not be displayed among unknown fields.
54 //! @param p_name Name of tech info field being queried.
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.
56 virtual bool is_our_tech_info(const char * p_name) = 0;
57
58
59 //! Helper; calls modern versions of this API where appropriate.
60 //! @param items List of tracks to enumerate properties on.
61 //! @param info Callback object to fetch info from. Pass null to use a generic implementation querying the metadb.
62 //! @param callback Callback interface receiving enumerated properties.
63 //! @param abort The aborter for this operation.
64 void enumerate_properties_helper(trackListRef items, track_property_provider_v3_info_source * info, track_property_callback_v2 & callback, abort_callback & abort);
65 void enumerate_properties_helper(trackListRef items, track_property_provider_v5_info_source* info, track_property_callback_v2& callback, abort_callback& abort);
66 void enumerate_properties_helper(trackListRef items, std::nullptr_t, track_property_callback_v2& callback, abort_callback& abort);
67
68 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(track_property_provider);
69 };
70
71 class NOVTABLE track_property_provider_v2 : public track_property_provider {
72 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v2,track_property_provider)
73 public:
74 virtual void enumerate_properties_v2(trackListRef p_tracks, track_property_callback_v2 & p_out) = 0;
75 };
76
77
78 //! \since 1.3
79 class NOVTABLE track_property_provider_v3 : public track_property_provider_v2 {
80 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v3,track_property_provider_v2)
81 public:
82 virtual void enumerate_properties_v3(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback) = 0;
83
84 void enumerate_properties(trackListRef p_tracks, track_property_callback & p_out) override;
85 void enumerate_properties_v2(trackListRef p_tracks, track_property_callback_v2 & p_out) override;
86 };
87
88 template<typename T>
89 class track_property_provider_factory_t : public service_factory_single_t<T> {};
90
91 //! \since 1.5
92 //! Adds abortability on top of track_property_provider_v3 interface. \n
93 //! The previous revisions of this API were only legal to call from the main thread. \n
94 //! track_property_provider_v4 implementers should make NO ASSUMPTIONS about the thread they are in. \n
95 //! Implementing track_property_provider_v4 declares your class as safe to call from any thread. \n
96 //! If called via enumerate_properties_v4() method or off-main-thread, the implementation can assume the info source object to be thread-safe.
97 class NOVTABLE track_property_provider_v4 : public track_property_provider_v3 {
98 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v4, track_property_provider_v3 );
99 public:
100 void enumerate_properties_v3(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback) override;
101
102 virtual void enumerate_properties_v4(trackListRef items, track_property_provider_v3_info_source & info, track_property_callback_v2 & callback, abort_callback & abort) = 0;
103 };
104
105 //! \since 2.0
106 //! Allows metadb v2 info records to be handed over transparently.
107 class NOVTABLE track_property_provider_v5_info_source {
108 public:
109 virtual metadb_v2_rec_t get_info(size_t index) = 0;
110 };
111
112 //! \since 2.0
113 //! Allows metadb v2 info records to be handed over transparently.
114 class NOVTABLE track_property_provider_v5 : public track_property_provider_v4 {
115 FB2K_MAKE_SERVICE_INTERFACE(track_property_provider_v5, track_property_provider_v4);
116 public:
117 void enumerate_properties_v4(trackListRef items, track_property_provider_v3_info_source& info, track_property_callback_v2& callback, abort_callback& abort) override;
118
119 virtual void enumerate_properties_v5(trackListRef items, track_property_provider_v5_info_source& info, track_property_callback_v2& callback, abort_callback& abort) = 0;
120 };
121
122 class track_property_provider_v5_info_source_impl : public track_property_provider_v5_info_source {
123 public:
124 track_property_provider_v5_info_source_impl(trackListRef items, abort_callback &a);
125 metadb_v2_rec_t get_info(size_t index) override;
126 private:
127 pfc::array_t< metadb_v2_rec_t > m_infos;
128 #if FOOBAR2000_TARGET_VERSION < 81
129 metadb_handle_list m_tracks;
130 #endif
131 };