annotate foosdk/sdk/foobar2000/SDK/metadb.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 "metadb_handle.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 file_info_filter; // forward decl; file_info_filter moved to file_info_filter.h
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 class metadb_io_callback_dynamic; class metadb_io_callback_v2_dynamic;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! API for tag read/write operations. Legal to call from main thread only, except for hint_multi_async() / hint_async() / hint_reader().\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Implemented only by core, do not reimplement.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! Use static_api_ptr_t template to access metadb_io methods.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! WARNING: Methods that perform file access (tag reads/writes) run a modal message loop. They SHOULD NOT be called from global callbacks and such.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 class NOVTABLE metadb_io : public service_base
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 enum t_load_info_type {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 load_info_default,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 load_info_force,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 load_info_check_if_changed
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 enum t_update_info_state {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 update_info_success,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 update_info_aborted,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 update_info_errors,
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 enum t_load_info_state {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 load_info_success,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 load_info_aborted,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 load_info_errors,
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 //! No longer used - returns false always.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 FB2K_DEPRECATED virtual bool is_busy() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! No longer used - returns false always.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 FB2K_DEPRECATED virtual bool is_updating_disabled() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 //! No longer used - returns false always.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 FB2K_DEPRECATED virtual bool is_file_updating_blocked() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! No longer used.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 FB2K_DEPRECATED virtual void highlight_running_process() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 //! Loads tags from multiple items. Use the async version in metadb_io_v2 instead if possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 FB2K_DEPRECATED virtual t_load_info_state load_info_multi(metadb_handle_list_cref p_list,t_load_info_type p_type,fb2k::hwnd_t p_parent_window,bool p_show_errors) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! Updates tags on multiple items. Use the async version in metadb_io_v2 instead if possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 FB2K_DEPRECATED virtual t_update_info_state update_info_multi(metadb_handle_list_cref p_list,const pfc::list_base_const_t<file_info*> & p_new_info,fb2k::hwnd_t p_parent_window,bool p_show_errors) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 //! Rewrites tags on multiple items. Use the async version in metadb_io_v2 instead if possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 FB2K_DEPRECATED virtual t_update_info_state rewrite_info_multi(metadb_handle_list_cref p_list,fb2k::hwnd_t p_parent_window,bool p_show_errors) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //! Removes tags from multiple items. Use the async version in metadb_io_v2 instead if possible.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 FB2K_DEPRECATED virtual t_update_info_state remove_info_multi(metadb_handle_list_cref p_list,fb2k::hwnd_t p_parent_window,bool p_show_errors) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 virtual void hint_multi(metadb_handle_list_cref p_list,const pfc::list_base_const_t<const file_info*> & p_infos,const pfc::list_base_const_t<t_filestats> & p_stats,const bit_array & p_fresh_mask) = 0;
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 virtual void hint_multi_async(metadb_handle_list_cref p_list,const pfc::list_base_const_t<const file_info*> & p_infos,const pfc::list_base_const_t<t_filestats> & p_stats,const bit_array & p_fresh_mask) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 virtual void hint_reader(service_ptr_t<class input_info_reader> p_reader,const char * p_path,abort_callback & p_abort) = 0;
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 //! For internal use only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 virtual void path_to_handles_simple(const char * p_path, metadb_handle_list_ref p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! Dispatches metadb_io_callback calls with specified items. To be used with metadb_display_field_provider when your component needs specified items refreshed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 virtual void dispatch_refresh(metadb_handle_list_cref p_list) = 0;
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 void dispatch_refresh(metadb_handle_ptr const & handle) {dispatch_refresh(pfc::list_single_ref_t<metadb_handle_ptr>(handle));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 void hint_async(metadb_handle_ptr p_item,const file_info & p_info,const t_filestats & p_stats,bool p_fresh);
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 FB2K_DEPRECATED t_load_info_state load_info(metadb_handle_ptr p_item,t_load_info_type p_type,fb2k::hwnd_t p_parent_window,bool p_show_errors);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 FB2K_DEPRECATED t_update_info_state update_info(metadb_handle_ptr p_item,file_info & p_info,fb2k::hwnd_t p_parent_window,bool p_show_errors);
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 FB2K_MAKE_SERVICE_COREAPI(metadb_io);
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 //! Advanced interface for passing infos read from files to metadb backend. Use metadb_io_v2::create_hint_list() to instantiate. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! Thread safety: all methods other than on_done() are intended for worker threads. Instantiate and use the object in a worker thread, call on_done() in main thread to finalize. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //! Typical usage pattern: create a hint list (in any thread), hand infos to it from files that you work with (in a worker thread), call on_done() in main thread. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 class NOVTABLE metadb_hint_list : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 FB2K_MAKE_SERVICE_INTERFACE(metadb_hint_list,service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! Helper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 static metadb_hint_list::ptr create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //! Adds a hint to the list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 //! @param p_location Location of the item the hint applies to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 //! @param p_info file_info object describing the item.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //! @param p_stats Information about the file containing item the hint applies to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 //! @param p_freshflag Set to true if the info has been directly read from the file, false if it comes from another source such as a playlist file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 virtual void add_hint(metadb_handle_ptr const & p_location,const file_info & p_info,const t_filestats & p_stats,bool p_freshflag) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 //! Reads info from specified info reader instance and adds hints. May throw an exception in case info read has failed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 //! If the file has multiple subsongs, info from all the subsongs will be read and pssed to add_hint(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! Note that an input_info_writer is a subclass of input_info_reader - so any input_info_reader OR input_info_writer is a valid argument for add_hint_reader(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! This method is often called with your input_info_writer instance after committing tag updates, to notify metadb about altered tags.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 virtual void add_hint_reader(const char * p_path,service_ptr_t<input_info_reader> const & p_reader,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 //! Call this when you're done working with this metadb_hint_list instance, to apply hints and dispatch callbacks. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! If you don't call this, all added hints will be ignored. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! As a general rule, you should add as many infos as possible - such as all the tracks involved in some operation that you perform - then call on_done() once. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //! on_done() is expensive because it not only updates the metadb, but tells all components about the changes made - refreshes playlists/autoplaylists, library viewers, etc. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 //! Calling on_done() repeatedly is inefficient and should be avoided.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 virtual void on_done() = 0;
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 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 //! To obtain metadb_hint_list_v2, use service_query on a metadb_hint_list object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 //! Simplified: metadb_hint_list_v2::ptr v2; v2 ^= myHintList; ( causes bugcheck if old fb2k / no interface ).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 class NOVTABLE metadb_hint_list_v2 : public metadb_hint_list {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 FB2K_MAKE_SERVICE_INTERFACE(metadb_hint_list_v2, metadb_hint_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 //! Helper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 static metadb_hint_list_v2::ptr create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 //! Hint with browse info. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 //! See: metadb_handle::get_browse_info() for browse info rationale.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 //! @param p_location Location for which we're providing browse info.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! @param p_info Browse info for this location.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 //! @param browseTS timestamp of the browse info - such as last-modified time of the playlist file providing browse info.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 virtual void add_hint_browse(metadb_handle_ptr const & p_location,const file_info & p_info, t_filetimestamp browseTS) = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 //! To obtain metadb_hint_list_v3, use service_query on a metadb_hint_list object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 //! Simplified: metadb_hint_list_v3::ptr v3; v3 ^= myHintList; ( causes bugcheck if old fb2k / no interface ).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 class NOVTABLE metadb_hint_list_v3 : public metadb_hint_list_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 FB2K_MAKE_SERVICE_INTERFACE(metadb_hint_list_v3, metadb_hint_list_v2);
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 //! Helper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 static metadb_hint_list_v3::ptr create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! Hint primary info with a metadb_info_container.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 virtual void add_hint_v3(metadb_handle_ptr const & p_location, metadb_info_container::ptr info,bool p_freshflag) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Hint browse info with a metadb_info_container.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 virtual void add_hint_browse_v3(metadb_handle_ptr const & p_location,metadb_info_container::ptr info) = 0;
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 //! Add a forced hint.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 //! A normal hint may or may not cause metadb update - metadb is not updated if the file has not changed according to last modified time. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! A forced hint always updates metadb regardless of timestamps.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 virtual void add_hint_forced(metadb_handle_ptr const & p_location, const file_info & p_info,const t_filestats & p_stats,bool p_freshflag) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 //! Add a forced hint, with metadb_info_container. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 //! Forced hint rationale - see add_hint_forced().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 virtual void add_hint_forced_v3(metadb_handle_ptr const & p_location, metadb_info_container::ptr info,bool p_freshflag) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 //! Adds a forced hint, with an input_info_reader. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 //! Forced hint rationale - see add_hint_forced(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //! Info reader use rationale - see add_hint_reader().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 virtual void add_hint_forced_reader(const char * p_path,service_ptr_t<input_info_reader> const & p_reader,abort_callback & p_abort) = 0;
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 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 //! Allows dispatching of metadb_io_edit_callback from your code.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 class NOVTABLE metadb_hint_list_v4 : public metadb_hint_list_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 FB2K_MAKE_SERVICE_INTERFACE( metadb_hint_list_v4, metadb_hint_list_v3 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 static metadb_hint_list_v4::ptr create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 virtual void before_edit( const char * path, service_ptr_t<input_info_reader> reader, abort_callback & a ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 virtual void after_edit( const char * path, service_ptr_t<input_info_reader> reader, abort_callback & a ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 //! New in 0.9.3. Extends metadb_io functionality with nonblocking versions of tag read/write functions, and some other utility features.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 class NOVTABLE metadb_io_v2 : public metadb_io {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 //! By default, when some part of requested operation could not be performed for reasons other than user abort, a popup dialog with description of the problem is spawned.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 //! Set this flag to disable error notification.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 op_flag_no_errors = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 //! Set this flag to make the progress dialog not steal focus on creation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 op_flag_background = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 //! Set this flag to delay the progress dialog becoming visible, so it does not appear at all during short operations. Also implies op_flag_background effect.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 op_flag_delay_ui = 1 << 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 //! \since 1.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 //! Indicates that the caller is aware of the metadb partial info feature introduced at v1.3.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 //! When not specified, affected info will be quietly preserved when updating tags.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 //! Obsolete in 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 op_flag_partial_info_aware = 1 << 3,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 //! Do not show any user interface.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 op_flag_silent = 1 << 4,
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 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 op_flag_detect_rechapter = 1 << 5,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 };
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 //! Preloads information from the specified tracks. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 //! Use from main thread only (starts a threaded_process to show a progress dialog).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 //! @param p_list List of items to process.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 //! @param p_op_flags Can be null, or one or more of op_flag_* enum values combined, altering behaviors of the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 //! @param p_notify Called when the task is completed. Status code is one of t_load_info_state values. Can be null if caller doesn't care.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 virtual void load_info_async(metadb_handle_list_cref p_list,t_load_info_type p_type,fb2k::hwnd_t p_parent_window,t_uint32 p_op_flags,completion_notify_ptr p_notify) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 //! Updates tags of the specified tracks. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 //! Use from main thread only (starts a threaded_process to show a progress dialog).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 //! @param p_list List of items to process.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 //! @param p_op_flags Can be null, or one or more of op_flag_* enum values combined, altering behaviors of the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 //! @param p_notify Called when the task is completed. Status code is one of t_update_info values. Can be null if caller doesn't care.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 //! @param p_filter Callback handling actual file_info alterations. Typically used to replace entire meta part of file_info, or to alter something else such as ReplayGain while leaving meta intact.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 virtual void update_info_async(metadb_handle_list_cref p_list,service_ptr_t<file_info_filter> p_filter,fb2k::hwnd_t p_parent_window,t_uint32 p_op_flags,completion_notify_ptr p_notify) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 //! Rewrites tags of the specified tracks; similar to update_info_async() but using last known/cached file_info values rather than values passed by caller. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 //! Use from main thread only (starts a threaded_process to show a progress dialog).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 //! @param p_list List of items to process.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 //! @param p_op_flags Can be null, or one or more of op_flag_* enum values combined, altering behaviors of the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 //! @param p_notify Called when the task is completed. Status code is one of t_update_info values. Can be null if caller doesn't care.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 virtual void rewrite_info_async(metadb_handle_list_cref p_list,fb2k::hwnd_t p_parent_window,t_uint32 p_op_flags,completion_notify_ptr p_notify) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 //! Strips all tags / metadata fields from the specified tracks. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 //! Use from main thread only (starts a threaded_process to show a progress dialog).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 //! @param p_list List of items to process.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 //! @param p_op_flags Can be null, or one or more of op_flag_* enum values combined, altering behaviors of the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 //! @param p_notify Called when the task is completed. Status code is one of t_update_info values. Can be null if caller doesn't care.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 virtual void remove_info_async(metadb_handle_list_cref p_list,fb2k::hwnd_t p_parent_window,t_uint32 p_op_flags,completion_notify_ptr p_notify) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 //! Creates a metadb_hint_list object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 //! Contrary to other metadb_io methods, this can be safely called in a worker thread. You only need to call the hint list's on_done() method in main thread to finalize.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 virtual metadb_hint_list::ptr create_hint_list() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 //! Updates tags of the specified tracks. Helper; uses update_info_async internally. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 //! Use from main thread only (starts a threaded_process to show a progress dialog).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 //! @param p_list List of items to process.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 //! @param p_op_flags Can be null, or one or more of op_flag_* enum values combined, altering behaviors of the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 //! @param p_notify Called when the task is completed. Status code is one of t_update_info values. Can be null if caller doesn't care.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 //! @param p_new_info New infos to write to specified items.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 void update_info_async_simple(metadb_handle_list_cref p_list,const pfc::list_base_const_t<const file_info*> & p_new_info, fb2k::hwnd_t p_parent_window,t_uint32 p_op_flags,completion_notify_ptr p_notify);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 //! Helper to be called after a file has been rechaptered. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 //! Forcibly reloads info then tells playlist_manager to update all affected playlists. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 //! Call from main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 void on_file_rechaptered( const char * path, metadb_handle_list_cref newItems );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 //! Helper to be called after a file has been rechaptered. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 //! Forcibly reloads info then tells playlist_manager to update all affected playlists. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 //! Call from main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 void on_files_rechaptered( metadb_handle_list_cref newHandles );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(metadb_io_v2,metadb_io);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 //! \since 0.9.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 class NOVTABLE metadb_io_v3 : public metadb_io_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 //! Registers a callback object to receive notifications about metadb_io operations. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 //! See: metadb_io_callback_dynamic \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 //! Call from main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 virtual void register_callback(metadb_io_callback_dynamic * p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 //! Unregisters a callback object to receive notifications about metadb_io operations. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 //! See: metadb_io_callback_dynamic \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 //! Call from main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 virtual void unregister_callback(metadb_io_callback_dynamic * p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(metadb_io_v3,metadb_io_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 class threaded_process_callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 //! \since 1.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 class NOVTABLE metadb_io_v4 : public metadb_io_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(metadb_io_v4, metadb_io_v3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 //! Creates an update-info task, that can be either fed to threaded_process API, or invoked by yourself respecting threaded_process semantics. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 //! May return null pointer if the operation has been refused (by user settings or such). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 //! Useful for performing the operation with your own in-dialog progress display instead of the generic progress popup. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 //! Main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 virtual service_ptr_t<threaded_process_callback> spawn_update_info( metadb_handle_list_cref items, service_ptr_t<file_info_filter> p_filter, uint32_t opFlags, completion_notify_ptr reply ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 //! Creates an remove-info task, that can be either fed to threaded_process API, or invoked by yourself respecting threaded_process semantics. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 //! May return null pointer if the operation has been refused (by user settings or such). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 //! Useful for performing the operation with your own in-dialog progress display instead of the generic progress popup. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 //! Main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 virtual service_ptr_t<threaded_process_callback> spawn_remove_info( metadb_handle_list_cref items, uint32_t opFlags, completion_notify_ptr reply) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 //! Creates an load-info task, that can be either fed to threaded_process API, or invoked by yourself respecting threaded_process semantics. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 //! May return null pointer if the operation has been refused (for an example no loading is needed for these items). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 //! Useful for performing the operation with your own in-dialog progress display instead of the generic progress popup. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 //! Main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 virtual service_ptr_t<threaded_process_callback> spawn_load_info( metadb_handle_list_cref items, t_load_info_type opType, uint32_t opFlags, completion_notify_ptr reply) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 // \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 class NOVTABLE metadb_io_v5 : public metadb_io_v4 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(metadb_io_v5, metadb_io_v4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 //! Register a metadb_io_callback_v2_dynamic object to receive notifications about metadb_io events. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 //! Main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 virtual void register_callback_v2(metadb_io_callback_v2_dynamic*) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 //! Unregister a metadb_io_callback_v2_dynamic object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 //! Main thread only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 virtual void unregister_callback_v2(metadb_io_callback_v2_dynamic*) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 //! Entrypoint service for metadb_handle related operations.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 //! Implemented only by core, do not reimplement.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 //! Use metadb::get() to obtain an instance.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 class NOVTABLE metadb : public service_base
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 virtual void database_lock()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 virtual void database_unlock()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 //! Returns a metadb_handle object referencing the specified location. If one doesn't exist yet a new one is created. There can be only one metadb_handle object referencing specific location. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 //! This function should never fail unless there's something critically wrong (can't allocate memory for the new object, etc). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 //! Speed: O(log(n)) to total number of metadb_handles present. It's recommended to pass metadb_handles around whenever possible rather than pass playable_locations then retrieve metadb_handles on demand when needed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 //! @param p_out Receives the metadb_handle pointer.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 //! @param p_location Location to create a metadb_handle for.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 virtual void handle_create(metadb_handle_ptr & p_out,const playable_location & p_location)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 void handle_create_replace_path_canonical(metadb_handle_ptr & p_out,const metadb_handle_ptr & p_source,const char * p_new_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 void handle_replace_path_canonical(metadb_handle_ptr & p_out,const char * p_new_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 void handle_create_replace_path(metadb_handle_ptr & p_out,const metadb_handle_ptr & p_source,const char * p_new_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 //! Helper function; attempts to retrieve a handle to any known playable location to be used for e.g. titleformatting script preview.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 //! @returns True on success; false on failure (no known playable locations).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 static bool g_get_random_handle(metadb_handle_ptr & p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 enum {case_sensitive = playable_location::case_sensitive};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 typedef playable_location::path_comparator path_comparator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 inline static int path_compare_ex(const char * p1,t_size len1,const char * p2,t_size len2) {return case_sensitive ? pfc::strcmp_ex(p1,len1,p2,len2) : stricmp_utf8_ex(p1,len1,p2,len2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 inline static int path_compare_nc(const char * p1, size_t len1, const char * p2, size_t len2) {return case_sensitive ? pfc::strcmp_nc(p1,len1,p2,len2) : stricmp_utf8_ex(p1,len1,p2,len2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 inline static int path_compare(const char * p1,const char * p2) {return case_sensitive ? strcmp(p1,p2) : stricmp_utf8(p1,p2);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 inline static int path_compare_metadb_handle(const metadb_handle_ptr & p1,const metadb_handle_ptr & p2) {return path_compare(p1->get_path(),p2->get_path());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 metadb_handle_ptr handle_create(playable_location const & l) {metadb_handle_ptr temp; handle_create(temp, l); return temp;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 metadb_handle_ptr handle_create(const char * path, uint32_t subsong) {return handle_create(make_playable_location(path, subsong));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 FB2K_MAKE_SERVICE_COREAPI(metadb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 class metadb_v2 : public metadb {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(metadb_v2, metadb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 typedef metadb_v2_rec_t rec_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 //! Query info record by location, bypassing metadb_handle layer.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 virtual rec_t query(playable_location const& loc) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 //! Callback class for queryMulti(). See metadb_v2::queryMulti().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 class queryMultiCallback_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 virtual void onInfo(size_t idx, const rec_t& rec) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 //! Callback class for queryMultiParallel(). See metadb_v2::queryMultiParallel().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 class queryMultiParallelCallback_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 virtual void* initThreadContext() { return nullptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 virtual void onInfo(size_t idx, const rec_t& rec, void * ctx) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 virtual void clearThreadContext(void*) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 //! Optimized multi-item metadb info query. Supply a callback to receive info records for all requested tracks. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 //! This is considerably faster than reading info records one by one, batch database queries are used to speed operation up. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 //! The infos may come in different order than requested - pay attention to idx argument of callback's onInfo(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 //! See also: queryMulti_(), using a lambda instead of a callback object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 virtual void queryMulti(metadb_handle_list_cref items, queryMultiCallback_t& cb) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 //! Multi-thread optimized version of queryMulti(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 //! Faster if used with thousands of items, needs the callback to handle concurrent calls from many threads. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 //! See also: queryMultiParallel_() and queryMultiParallelEx_(), helpers using lambdas and classes to implement the callback for you.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 virtual void queryMultiParallel(metadb_handle_list_cref items, queryMultiParallelCallback_t& cb) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 //! Format title without database access, use preloaded metadb v2 record.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 virtual void formatTitle_v2( const metadb_handle_ptr & handle, const rec_t & rec, titleformat_hook* p_hook, pfc::string_base& p_out, const service_ptr_t<titleformat_object>& p_script, titleformat_text_filter* p_filter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 //! Helper around queryMulti(). Implements callback for you using passed lambda.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 void queryMulti_(metadb_handle_list_cref items, std::function< void(size_t idx, const rec_t& rec) > f) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 class qmc_impl : public queryMultiCallback_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 void onInfo(size_t idx, const rec_t& rec) override { m_f(idx, rec); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 decltype(f) m_f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 qmc_impl cb; cb.m_f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 this->queryMulti(items, cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 //! Simplified helper around queryMultiParallel(). No per-thread data object used. Implements callback for you using passed labmda.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 void queryMultiParallel_(metadb_handle_list_cref items, std::function< void(size_t, const rec_t&) > f) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 class qmc_impl : public queryMultiParallelCallback_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 void onInfo(size_t idx, const rec_t& rec, void*) override {m_f(idx, rec);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 decltype(f) m_f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 qmc_impl cb; cb.m_f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 this->queryMultiParallel(items, cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 //! Simplified helper around queryMultiParallel(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 //! instance_t implements per-thread context data, one will be created in each worker threads. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 //! While lambda itself will be called from many threads at once, only one instance_t will be used in each thread, so instance_t can be accessed without thread safety measures.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 template<typename instance_t> void queryMultiParallelEx_(metadb_handle_list_cref items, std::function<void(size_t, const rec_t&, instance_t&)> f) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 class qmc_impl : public queryMultiParallelCallback_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 void* initThreadContext() override {return reinterpret_cast<void*>(new instance_t);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 void onInfo(size_t idx, const rec_t& rec, void* ctx) override { m_f(idx, rec, * reinterpret_cast<instance_t*>(ctx)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 void clearThreadContext(void* ctx) override { delete reinterpret_cast<instance_t*>(ctx); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 decltype(f) m_f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 qmc_impl cb; cb.m_f = f;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 this->queryMultiParallel(items, cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 //! Simplified helper for retrieving info of multiple tracks efficiently. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 //! Uses the fastest way to pull info from thousands of tracks - queryMultiParallel(). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 //! Keep in mind that it results in all affected info becoming loaded into application memory at once. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 //! If possible, use methods with callbacks/lambdas instead and process info in callbacks instead of keeping it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 pfc::array_t<rec_t> queryMultiSimple(metadb_handle_list_cref items) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 pfc::array_t<rec_t> ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 ret.resize(items.get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 this->queryMultiParallel_(items, [&](size_t idx, const rec_t& rec) {ret[idx] = rec;});
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 };