annotate foosdk/sdk/foobar2000/SDK/metadb.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "metadb.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "metadb_callbacks.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "file_info_filter_impl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "playback_control.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "playlist.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 void metadb::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
9 handle_create(p_out,make_playable_location(p_new_path,p_source->get_subsong_index()));
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void metadb::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
13 pfc::string8 path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 filesystem::g_get_canonical_path(p_new_path,path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 handle_create_replace_path_canonical(p_out,p_source,path);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 void metadb::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
19 metadb_handle_ptr temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 handle_create_replace_path_canonical(temp,p_out,p_new_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 p_out = temp;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 metadb_io::t_load_info_state metadb_io::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
26 return load_info_multi(pfc::list_single_ref_t<metadb_handle_ptr>(p_item),p_type,p_parent_window,p_show_errors);
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 metadb_io::t_update_info_state metadb_io::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
30 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 file_info * blah = &p_info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 return update_info_multi(pfc::list_single_ref_t<metadb_handle_ptr>(p_item),pfc::list_single_ref_t<file_info*>(blah),p_parent_window,p_show_errors);
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
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 void metadb_io::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
37 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 const file_info * blargh = &p_info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 hint_multi_async(pfc::list_single_ref_t<metadb_handle_ptr>(p_item),pfc::list_single_ref_t<const file_info *>(blargh),pfc::list_single_ref_t<t_filestats>(p_stats), pfc::bit_array_val(p_fresh));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 bool metadb::g_get_random_handle(metadb_handle_ptr & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (playback_control::get()->get_now_playing(p_out)) return true;
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 auto api = playlist_manager::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 t_size playlist_count = api->get_playlist_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 t_size active_playlist = api->get_active_playlist();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (active_playlist != ~0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 if (api->playlist_get_focus_item_handle(p_out,active_playlist)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 for(t_size n = 0; n < playlist_count; n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 if (api->playlist_get_focus_item_handle(p_out,n)) return true;
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 if (active_playlist != ~0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 t_size item_count = api->playlist_get_item_count(active_playlist);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 if (item_count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 if (api->playlist_get_item_handle(p_out,active_playlist,0)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 for(t_size n = 0; n < playlist_count; n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 t_size item_count = api->playlist_get_item_count(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 if (item_count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 if (api->playlist_get_item_handle(p_out,n,0)) return true;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 return false;
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 void metadb_io_v2::update_info_async_simple(const pfc::list_base_const_t<metadb_handle_ptr> & 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
79 update_info_async(p_list,new service_impl_t<file_info_filter_impl>(p_list,p_new_info),p_parent_window,p_op_flags,p_notify);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 void metadb_io_v2::on_file_rechaptered( const char * path, metadb_handle_list_cref newItems ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 metadb_handle_list handles( newItems );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 pfc::string8 pathLocal( path );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 auto notify = fb2k::makeCompletionNotify( [handles, pathLocal] (unsigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 playlist_manager::get()->on_file_rechaptered( pathLocal, handles );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 load_info_async( handles, metadb_io::load_info_force, core_api::get_main_window(), metadb_io_v3::op_flag_delay_ui, notify );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 void metadb_io_v2::on_files_rechaptered( metadb_handle_list_cref newHandles ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 metadb_handle_list local ( newHandles );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 auto notify = fb2k::makeCompletionNotify( [local] (unsigned) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 playlist_manager::get()->on_files_rechaptered(local);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 load_info_async( newHandles, metadb_io::load_info_force, core_api::get_main_window(), metadb_io_v3::op_flag_delay_ui, notify );
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
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 metadb_hint_list::ptr metadb_hint_list::create() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 return metadb_io_v2::get()->create_hint_list();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 metadb_hint_list_v2::ptr metadb_hint_list_v2::create() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 metadb_hint_list_v2::ptr ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 ret ^= metadb_hint_list::create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 metadb_hint_list_v3::ptr metadb_hint_list_v3::create() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 metadb_hint_list_v3::ptr ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 ret ^= metadb_hint_list::create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 return ret;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 metadb_hint_list_v4::ptr metadb_hint_list_v4::create() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 metadb_hint_list_v4::ptr ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 ret ^= metadb_hint_list::create();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 void metadb_io_callback_dynamic::register_callback() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 metadb_io_v3::get()->register_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
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 void metadb_io_callback_dynamic::unregister_callback() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 metadb_io_v3::get()->unregister_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 void metadb_io_callback_v2_dynamic::register_callback() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 metadb_io_v5::get()->register_callback_v2(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 void metadb_io_callback_v2_dynamic::unregister_callback() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 metadb_io_v5::get()->unregister_callback_v2(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 bool metadb_io_callback_v2_dynamic::try_register_callback() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 auto api = metadb_io_v5::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 if (api.is_empty()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 api->register_callback_v2(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 void metadb_io_callback_v2_dynamic::try_unregister_callback() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 auto api = metadb_io_v5::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 if (api.is_valid()) api->unregister_callback_v2(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 metadb_io_callback_dynamic_impl_base::metadb_io_callback_dynamic_impl_base() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 register_callback();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 metadb_io_callback_dynamic_impl_base::~metadb_io_callback_dynamic_impl_base() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 unregister_callback();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 metadb_io_callback_v2_dynamic_impl_base::metadb_io_callback_v2_dynamic_impl_base() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 register_callback();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 metadb_io_callback_v2_dynamic_impl_base::~metadb_io_callback_v2_dynamic_impl_base() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 unregister_callback();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }