annotate foosdk/sdk/foobar2000/SDK/dsp.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 "dsp.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "resampler.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 #ifdef FOOBAR2000_HAVE_DSP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <math.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 audio_chunk * dsp_chunk_list::add_item(t_size hint_size) { return insert_item(get_count(), hint_size); }
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 void dsp_chunk_list::remove_all() { remove_mask(pfc::bit_array_true()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 double dsp_chunk_list::get_duration() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 double rv = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 t_size n, m = get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 for (n = 0; n<m; n++) rv += get_item(n)->get_duration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 void dsp_chunk_list::add_chunk(const audio_chunk * chunk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 audio_chunk * dst = insert_item(get_count(), chunk->get_used_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 if (dst) dst->copy(*chunk);
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 t_size dsp_chunk_list_impl::get_count() const {return m_data.size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 audio_chunk * dsp_chunk_list_impl::get_item(t_size n) const {return n<m_data.size() ? m_data[n].get() : 0; }
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 void dsp_chunk_list_impl::remove_by_idx(t_size idx)
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 PFC_ASSERT(idx < get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 m_recycled.push_back(std::move(m_data[idx]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 m_data.erase(m_data.begin() + idx);
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 dsp_chunk_list_impl::remove_mask(const bit_array & mask)
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 auto total = m_data.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 mask.for_each(true, 0, total, [&](size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 m_recycled.push_back(std::move(m_data[idx]));
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 pfc::remove_mask_t(m_data, mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
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 audio_chunk * dsp_chunk_list_impl::insert_item(t_size idx,t_size hint_size)
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 t_size max = get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 if (idx>max) idx = max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 chunk_ptr_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 if (!m_recycled.empty())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 t_size best;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (hint_size > 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 best = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 t_size best_found = m_recycled[0]->get_data_size(), n, total = m_recycled.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 for (n = 1; n < total; n++)
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 (best_found == hint_size) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 t_size size = m_recycled[n]->get_data_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 int delta_old = abs((int)best_found - (int)hint_size), delta_new = abs((int)size - (int)hint_size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 if (delta_new < delta_old)
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 best_found = size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 best = n;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 } else best = m_recycled.size() - 1;
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 ret = std::move(m_recycled[best]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 m_recycled.erase(m_recycled.begin() + best);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 ret->set_sample_count(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 ret->set_channels(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 ret->set_srate(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 } else ret = std::make_unique<audio_chunk_impl>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 auto pRet = &*ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (idx == max) m_data.push_back(std::move(ret));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 else m_data.insert(m_data.begin() + idx, std::move(ret));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 return pRet;
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 dsp_chunk_list::remove_bad_chunks()
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 bool blah = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 t_size idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 for(idx=0;idx<get_count();)
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 audio_chunk * chunk = get_item(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 if (!chunk->is_valid())
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 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 FB2K_console_formatter() << "Removing bad chunk: " << chunk->formatChunkSpec();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 chunk->reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 remove_by_idx(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 blah = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 else idx++;
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 if (blah) console::info("one or more bad chunks removed from dsp chunk list");
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 bool dsp_entry_hidden::g_dsp_exists(const GUID & p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 dsp_entry_hidden::ptr p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 return g_get_interface(p, p_guid);
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 bool dsp_entry_hidden::g_get_interface( dsp_entry_hidden::ptr & out, const GUID & guid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 for (auto p : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 if (p->get_guid() == guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 out = p; return true;
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 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
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 bool dsp_entry_hidden::g_instantiate( dsp::ptr & out, const dsp_preset & preset ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 dsp_entry_hidden::ptr i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 if (!g_get_interface(i, preset.get_owner())) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 return i->instantiate(out, preset);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 bool dsp_entry::g_instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset, unsigned flags )
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 service_ptr_t<dsp_entry> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (!g_get_interface(ptr,p_preset.get_owner())) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if ( flags != 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 dsp_entry_v4::ptr v4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 if (v4 &= ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 p_out = v4->instantiate_v4(p_preset, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 return ptr->instantiate(p_out,p_preset);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 bool dsp_entry::g_instantiate_default(service_ptr_t<dsp> & p_out,const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 service_ptr_t<dsp_entry> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 if (!g_get_interface(ptr,p_guid)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 dsp_preset_impl preset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (!ptr->get_default_preset(preset)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 return ptr->instantiate(p_out,preset);
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 dsp_entry::g_name_from_guid(pfc::string_base & p_out,const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 service_ptr_t<dsp_entry> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 if (!g_get_interface(ptr,p_guid)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 ptr->get_name(p_out);
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 bool dsp_entry::g_dsp_exists(const GUID & p_guid)
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 service_ptr_t<dsp_entry> blah;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return g_get_interface(blah,p_guid);
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 bool dsp_entry::g_get_default_preset(dsp_preset & p_out,const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 service_ptr_t<dsp_entry> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 if (!g_get_interface(ptr,p_guid)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 return ptr->get_default_preset(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
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 void dsp_chain_config::contents_to_stream(stream_writer * p_stream,abort_callback & p_abort) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 uint32_t n, count = pfc::downcast_guarded<uint32_t>( get_count() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 p_stream->write_lendian_t(count,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 for(n=0;n<count;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 get_item(n).contents_to_stream(p_stream,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 }
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 fb2k::memBlock::ptr dsp_chain_config::to_blob() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 stream_writer_buffer_simple out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 this->contents_to_stream(&out, fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 return fb2k::memBlock::blockWithVector(out.m_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 void dsp_chain_config::from_blob(const void* p, size_t size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 if (size == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 remove_all(); return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 stream_reader_memblock_ref reader(p, size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 this->contents_from_stream(&reader, fb2k::noAbort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 void dsp_chain_config::from_blob(fb2k::memBlock::ptr b) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 if (b.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 from_blob(b->data(), b->size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 this->remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 void dsp_chain_config::contents_from_stream(stream_reader * p_stream,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 t_uint32 n,count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 p_stream->read_lendian_t(count,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 dsp_preset_impl temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 for(n=0;n<count;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 temp.contents_from_stream(p_stream,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 add_item(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 void dsp_chain_config::remove_item(t_size p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 remove_mask(pfc::bit_array_one(p_index));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 void dsp_chain_config::add_item(const dsp_preset & p_data)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 insert_item(p_data,get_count());
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 void dsp_chain_config::remove_all()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 remove_mask(pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 size_t dsp_chain_config::find_first_of_type( const GUID & dspID ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 const size_t count = this->get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 for(size_t w = 0; w < count; ++w) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 if (this->get_item(w).get_owner() == dspID) return w;
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 return SIZE_MAX;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 bool dsp_chain_config::contains_dsp( const GUID & dspID ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 return find_first_of_type( dspID ) != pfc_infinite;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 bool dsp_chain_config::enable_dsp( const GUID & dspID ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 if (this->contains_dsp( dspID )) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 dsp_preset_impl preset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 dsp_entry::g_get_default_preset( preset, dspID );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 insert_item( preset, 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 return true;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 bool dsp_chain_config::disable_dsp( const GUID & dspID ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 const size_t count = this->get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 if (count == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 bool rv = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 pfc::bit_array_bittable mask( count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 for(size_t w = 0; w < count; ++ w) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 if (this->get_item(w).get_owner() == dspID ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 rv = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 mask.set(w, true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 if (rv) this->remove_mask( mask );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 bool dsp_chain_config::enable_dsp( const dsp_preset & preset ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 dsp_chain_config & cfg = *this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 bool found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 bool changed = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 t_size n,m = cfg.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 if (cfg.get_item(n).get_owner() == preset.get_owner()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 found = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 if (cfg.get_item(n) != preset) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 cfg.replace_item(preset,n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 changed = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 if (!found) {cfg.insert_item(preset,0); changed = true;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 return changed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 void dsp_chain_config_impl::reorder(const size_t * order, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 PFC_ASSERT( count == m_data.get_count() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 m_data.reorder( order );
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 t_size dsp_chain_config_impl::get_count() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 return m_data.get_count();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 const dsp_preset & dsp_chain_config_impl::get_item(t_size p_index) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 return m_data[p_index]->data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 void dsp_chain_config_impl::replace_item(const dsp_preset & p_data,t_size p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 auto& obj = *m_data[p_index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 if (p_data.get_owner() != obj.data.get_owner()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 obj.dspName = p_data.get_owner_name();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 obj.data = p_data;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 void dsp_chain_config_impl::insert_item(const dsp_preset & p_data,t_size p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 this->insert_item_v2(p_data, nullptr, p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 void dsp_chain_config_impl::remove_mask(const bit_array & p_mask)
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 m_data.delete_mask(p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 }
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 dsp_chain_config_impl::~dsp_chain_config_impl()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 m_data.delete_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 }
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 const char* dsp_chain_config_impl::get_dsp_name(size_t idx) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 auto& n = m_data[idx]->dspName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 if (n.is_empty()) return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 return n.c_str();
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 void dsp_chain_config_impl::insert_item_v2(const dsp_preset& data, const char* dspName_, size_t index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 pfc::string8 dspName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 if (dspName_) dspName = dspName_;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 if (dspName.length() == 0) dspName = data.get_owner_name();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 m_data.insert_item(new entry_t{ data, std::move(dspName) }, index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 const char* dsp_chain_config_impl::find_dsp_name(const GUID& guid) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 for (size_t walk = 0; walk < m_data.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 auto& obj = *m_data[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 if (obj.data.get_owner() == guid && obj.dspName.length() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 return obj.dspName.c_str();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 }
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 pfc::string8 dsp_preset::get_owner_name() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 dsp_entry::ptr obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 if (dsp_entry::g_get_interface(obj, this->get_owner())) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 obj->get_name(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 return ret;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 pfc::string8 dsp_preset::get_owner_name_debug() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 dsp_entry::ptr obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 if (dsp_entry::g_get_interface(obj, this->get_owner())) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 obj->get_name(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 ret = "[unknown]";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 return ret;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 pfc::string8 dsp_preset::debug(const char * knownName) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 pfc::string8 name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 if (knownName) name = knownName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 else name = this->get_owner_name_debug();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 ret << name << " :: " << pfc::print_guid(this->get_owner()) << " :: " << pfc::format_hexdump(this->get_data(), this->get_data_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 }
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 pfc::string8 dsp_chain_config::debug() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 const size_t count = get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 ret << "dsp_chain_config: " << count << " items";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 for (size_t walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 ret << "\n" << get_item(walk).debug();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 }
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 void dsp_chain_config_impl::add_item_v2(const dsp_preset& data, const char* dspName) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 insert_item_v2(data, dspName, get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 void dsp_chain_config_impl::copy_v2(dsp_chain_config_impl const& p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 t_size n, m = p_source.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 for (n = 0; n < m; n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 add_item_v2(p_source.get_item(n), p_source.get_dsp_name(n));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 pfc::string8 dsp_chain_config_impl::debug() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 const size_t count = get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 ret << "dsp_chain_config_impl: " << count << " items";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 for (size_t walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 ret << "\n" << get_item(walk).debug( this->get_dsp_name(walk) );
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 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 }
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 void dsp_preset::contents_to_stream(stream_writer * p_stream,abort_callback & p_abort) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 t_uint32 size = pfc::downcast_guarded<t_uint32>(get_data_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 p_stream->write_lendian_t(get_owner(),p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 p_stream->write_lendian_t(size,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 if (size > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 p_stream->write_object(get_data(),size,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 void dsp_preset::contents_from_stream(stream_reader * p_stream,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 t_uint32 size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 GUID guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 p_stream->read_lendian_t(guid,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 set_owner(guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 p_stream->read_lendian_t(size,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 if (size > 1024*1024*32) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 set_data_from_stream(p_stream,size,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 void dsp_preset::g_contents_from_stream_skip(stream_reader * p_stream,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 t_uint32 size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 GUID guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 p_stream->read_lendian_t(guid,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 p_stream->read_lendian_t(size,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 if (size > 1024*1024*32) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 p_stream->skip_object(size,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 void dsp_preset_impl::set_data_from_stream(stream_reader * p_stream,t_size p_bytes,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 m_data.resize(p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 if (p_bytes > 0) p_stream->read_object(m_data.ptr(),p_bytes,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 void dsp_chain_config::add_items(const dsp_chain_config & p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 t_size n, m = p_source.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 for(n=0;n<m;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 add_item(p_source.get_item(n));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 void dsp_chain_config::copy(const dsp_chain_config & p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 add_items( p_source );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 bool dsp_entry::g_have_config_popup(const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 service_ptr_t<dsp_entry> entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 if (!g_get_interface(entry,p_guid)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 return entry->have_config_popup();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 bool dsp_entry::g_have_config_popup(const dsp_preset & p_preset)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 return g_have_config_popup(p_preset.get_owner());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 bool dsp_entry::g_show_config_popup(dsp_preset & p_preset,fb2k::hwnd_t p_parent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 service_ptr_t<dsp_entry> entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 if (!g_get_interface(entry,p_preset.get_owner())) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 return entry->show_config_popup(p_preset,p_parent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 bool dsp_entry::show_config_popup_v2_(const dsp_preset& p_preset, fb2k::hwnd_t p_parent, dsp_preset_edit_callback& p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 PFC_ASSERT(p_preset.get_owner() == this->get_guid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 service_ptr_t<dsp_entry_v2> entry_v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 if (entry_v2 &= this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 entry_v2->show_config_popup_v2(p_preset, p_parent, p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 } catch (pfc::exception_not_implemented const&) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 dsp_preset_impl temp(p_preset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 bool rv = this->show_config_popup(temp, p_parent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 if (rv) p_callback.on_preset_changed(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 class dsp_preset_edit_callback_callV2 : public dsp_preset_edit_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 dsp_preset_edit_callback_v2::ptr chain;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 void on_preset_changed(const dsp_preset& arg) override { chain->set_preset(arg); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 service_ptr dsp_entry::show_config_popup_v3_(fb2k::hwnd_t parent, dsp_preset_edit_callback_v2::ptr callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 dsp_entry_v3::ptr v3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 if (v3 &= this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 return v3->show_config_popup_v3(parent, callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 } catch (pfc::exception_not_implemented const &) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 dsp_preset_edit_callback_callV2 cb;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 cb.chain = callback;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 dsp_preset_impl initPreset; callback->get_preset(initPreset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 bool status = this->show_config_popup_v2_(initPreset, parent, cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 callback->dsp_dialog_done(status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 void dsp_entry::g_show_config_popup_v2(const dsp_preset & p_preset,fb2k::hwnd_t p_parent,dsp_preset_edit_callback & p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 auto api = g_get_interface(p_preset.get_owner());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 if (api.is_valid()) api->show_config_popup_v2_(p_preset, p_parent, p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 service_ptr_t<dsp_entry> dsp_entry::g_get_interface(const GUID& guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 for (auto ptr : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 if (ptr->get_guid() == guid) return ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 bool dsp_entry::g_get_interface(service_ptr_t<dsp_entry> & p_out,const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 for (auto ptr : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 if (ptr->get_guid() == p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 p_out = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 bool resampler_entry::g_get_interface(service_ptr_t<resampler_entry> & p_out,unsigned p_srate_from,unsigned p_srate_to)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 #if defined(FOOBAR2000_DESKTOP) && FOOBAR2000_TARGET_VERSION >= 79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 auto r = resampler_manager::get()->get_resampler( p_srate_from, p_srate_to );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 bool v = r.is_valid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 if ( v ) p_out = std::move(r);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 return v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 #ifdef FOOBAR2000_DESKTOP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 resampler_manager::ptr api;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 if ( resampler_manager::tryGet(api) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 auto r = api->get_resampler( p_srate_from, p_srate_to );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 bool v = r.is_valid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 if (v) p_out = std::move(r);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 return v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 resampler_entry::ptr ptr_resampler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 service_enum_t<dsp_entry> e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 float found_priority = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 resampler_entry::ptr found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 while(e.next(ptr_resampler))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 if (p_srate_from == 0 || ptr_resampler->is_conversion_supported(p_srate_from,p_srate_to))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 float priority = ptr_resampler->get_priority();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 if (found.is_empty() || priority > found_priority)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 found = ptr_resampler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 found_priority = priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 if (found.is_empty()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 p_out = found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 bool resampler_entry::g_create_preset(dsp_preset & p_out,unsigned p_srate_from,unsigned p_srate_to,float p_qualityscale)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 service_ptr_t<resampler_entry> entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 if (!g_get_interface(entry,p_srate_from,p_srate_to)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 return entry->create_preset(p_out,p_srate_to,p_qualityscale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 bool resampler_entry::g_create(service_ptr_t<dsp> & p_out,unsigned p_srate_from,unsigned p_srate_to,float p_qualityscale)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 service_ptr_t<resampler_entry> entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 if (!g_get_interface(entry,p_srate_from,p_srate_to)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 dsp_preset_impl preset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 if (!entry->create_preset(preset,p_srate_to,p_qualityscale)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 return entry->instantiate(p_out,preset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 bool dsp_chain_config::equals(dsp_chain_config const & v1, dsp_chain_config const & v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 const t_size count = v1.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 if (count != v2.get_count()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 for(t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 if (v1.get_item(walk) != v2.get_item(walk)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 bool dsp_chain_config::equals_debug(dsp_chain_config const& v1, dsp_chain_config const& v2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 FB2K_DebugLog() << "Comparing DSP chains";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 const t_size count = v1.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 if (count != v2.get_count()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 FB2K_DebugLog() << "Count mismatch, " << count << " vs " << v2.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 for (t_size walk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 if (v1.get_item(walk) != v2.get_item(walk)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 FB2K_DebugLog() << "Item " << (walk+1) << " mismatch";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 FB2K_DebugLog() << "Item 1: " << v1.get_item(walk).debug();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 FB2K_DebugLog() << "Item 2: " << v2.get_item(walk).debug();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 FB2K_DebugLog() << "DSP chains are identical";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 void dsp_chain_config::get_name_list(pfc::string_base & p_out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 p_out = get_name_list();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 pfc::string8 dsp_chain_config::get_name_list() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 const size_t count = get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 pfc::string8 output; output.prealloc(1024);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 for (size_t n = 0; n < count; n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 const auto& preset = get_item(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 service_ptr_t<dsp_entry> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 if (dsp_entry::g_get_interface(ptr, preset.get_owner()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 pfc::string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 ptr->get_display_name_(preset, temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 if (temp.length() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 if (output.length() > 0) output += ", ";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 output += temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 return output;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 void dsp::run_abortable(dsp_chunk_list * p_chunk_list,const dsp_track_t & p_cur_file,int p_flags,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 service_ptr_t<dsp_v2> this_v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 if (this->service_query_t(this_v2)) this_v2->run_v2(p_chunk_list,p_cur_file,p_flags,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 else run(p_chunk_list,p_cur_file,p_flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 bool dsp::apply_preset_(const dsp_preset& arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 dsp_v3::ptr v3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 if (v3 &= this) return v3->apply_preset(arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 class dsp_preset_edit_callback_impl : public dsp_preset_edit_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 dsp_preset_edit_callback_impl(dsp_preset & p_data) : m_data(p_data) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 void on_preset_changed(const dsp_preset & p_data) {m_data = p_data;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 dsp_preset & m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 bool dsp_entry_v2::show_config_popup(dsp_preset & p_data,fb2k::hwnd_t p_parent) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 PFC_ASSERT(p_data.get_owner() == get_guid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 dsp_preset_impl temp(p_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 dsp_preset_edit_callback_impl cb(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 show_config_popup_v2(p_data,p_parent,cb);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 PFC_ASSERT(temp.get_owner() == get_guid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 if (temp == p_data) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 p_data = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 #ifdef FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 void dsp_entry::g_show_config_popup( menu_context_ptr ctx, dsp_preset_edit_callback_v2::ptr callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 GUID dspID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 dsp_preset_impl temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 callback->get_preset( temp );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 dspID = temp.get_owner();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 dsp_entry::ptr entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 if (!g_get_interface( entry, dspID)) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 if (!entry->have_config_popup()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 entry->show_config_popup( ctx, callback );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 #endif // FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 #ifdef FOOBAR2000_DESKTOP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 void resampler_manager::make_chain_(dsp_chain_config& outChain, unsigned rateFrom, unsigned rateTo, float qualityScale) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 resampler_manager_v2::ptr v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 if (v2 &= this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 v2->make_chain(outChain, rateFrom, rateTo, qualityScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 outChain.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 auto obj = this->get_resampler(rateFrom, rateTo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 if (obj.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 dsp_preset_impl p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 if (obj->create_preset(p, rateTo, qualityScale)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 outChain.add_item(p);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 void dsp_preset_edit_callback_v2::reset() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 dsp_preset_impl temp; get_preset( temp );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 GUID id = temp.get_owner(); temp.set_data(nullptr, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 if (dsp_entry::g_get_default_preset( temp, id )) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 this->set_preset( temp );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 PFC_ASSERT(!"Should not get here - no such DSP");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 bool dsp_entry::get_display_name_supported() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 dsp_entry_v3::ptr v3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 return v3 &= this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 void dsp_entry::get_display_name_(const dsp_preset& arg, pfc::string_base& out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 PFC_ASSERT(arg.get_owner() == this->get_guid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 dsp_entry_v3::ptr v3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 if (v3 &= this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 v3->get_display_name(arg, out); return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 get_name(out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 bool dsp_entry::enumerate_default_presets_(dsp_chain_config& ret) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 ret.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 dsp_entry_v5::ptr v5;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 if (v5 &= this) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 bool rv = v5->enumerate_default_presets(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 for (size_t walk = 0; walk < ret.get_count(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 PFC_ASSERT(ret.get_item(walk).get_owner() == get_guid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 bool dsp_entry::match_preset_subclass_(dsp_preset const& x, dsp_preset const& y) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 dsp_entry_v5::ptr v5;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 if (v5 &= this) return v5->match_preset_subclass(x, y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 #endif // FOOBAR2000_HAVE_DSP