annotate foosdk/sdk/foobar2000/SDK/dsp.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "audio_chunk.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "filesystem.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 #ifdef FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "dsp-context.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #endif
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 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #include <vector>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 class dsp_preset; class dsp_chain_config; // forward declaration
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #ifdef FOOBAR2000_HAVE_METADB
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 typedef metadb_handle_ptr dsp_track_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 typedef trackRef dsp_track_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! Interface to a DSP chunk list. A DSP chunk list object is passed to the DSP chain each time, since DSPs are allowed to remove processed chunks or insert new ones.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 class NOVTABLE dsp_chunk_list {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 virtual t_size get_count() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 virtual audio_chunk * get_item(t_size n) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 virtual void remove_by_idx(t_size idx) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual void remove_mask(const bit_array & mask) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 virtual audio_chunk * insert_item(t_size idx,t_size hint_size=0) = 0;
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 audio_chunk * add_item(t_size hint_size=0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 void remove_all();
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 double get_duration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void add_chunk(const audio_chunk * chunk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void remove_bad_chunks();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 dsp_chunk_list() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 ~dsp_chunk_list() {}
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 class dsp_chunk_list_impl : public dsp_chunk_list//implementation
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 typedef std::unique_ptr<audio_chunk_impl> chunk_ptr_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 std::vector<chunk_ptr_t> m_data, m_recycled;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 dsp_chunk_list_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 dsp_chunk_list_impl(const dsp_chunk_list_impl&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 void operator=(const dsp_chunk_list_impl&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 t_size get_count() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 audio_chunk * get_item(t_size n) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 void remove_by_idx(t_size idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 void remove_mask(const bit_array & mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 audio_chunk * insert_item(t_size idx,t_size hint_size=0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 audio_chunk_impl* get_item_(size_t n) const { return m_data[n].get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! Instance of a DSP.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 //! Implementation: Derive from dsp_impl_base instead of deriving from dsp directly.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //! Instantiation: Use dsp_entry static helper methods to instantiate DSPs, or dsp_chain_config / dsp_manager to deal with entire DSP chains.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 class NOVTABLE dsp : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! Flush whatever you need to when tracks change.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 END_OF_TRACK = 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 //! Flush everything.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 FLUSH = 2
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 //! @param p_chunk_list List of chunks to process. The implementation may alter the list in any way, inserting chunks of different sample rate / channel configuration etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! @param p_cur_file Optional, location of currently decoded file. May be null.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! @param p_flags Flags. Can be null, or a combination of END_OF_TRACK and FLUSH constants.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 virtual void run(dsp_chunk_list * p_chunk_list,const dsp_track_t & p_cur_file,int p_flags)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! Flushes the DSP (reinitializes / drops any buffered data). Called after seeking, etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 virtual void flush() = 0;
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 //! Retrieves amount of data buffered by the DSP, for syncing visualisation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //! @returns Amount of buffered audio data, in seconds.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 virtual double get_latency() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 //! Returns true if DSP needs to know exact track change point (eg. for crossfading, removing silence).\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //! Signaling this will force-flush any DSPs placed before this DSP so when it gets END_OF_TRACK, relevant chunks contain last samples of the track.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 //! Signaling this will often break regular gapless playback so don't use it unless you have reasons to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 virtual bool need_track_change_mark() = 0;
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 void 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
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! Attempts to apply preset without recreating the DSP, if supported.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 //! @returns True on success, false if not supported (DSP needs re-creating).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 bool apply_preset_(const dsp_preset&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 FB2K_MAKE_SERVICE_INTERFACE(dsp,service_base);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 //! Backwards-compatible extension to dsp interface, allows abortable operation. Introduced in 0.9.2.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 class NOVTABLE dsp_v2 : public dsp {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 //! Abortable version of dsp::run(). See dsp::run() for descriptions of parameters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 virtual void run_v2(dsp_chunk_list * p_chunk_list,const dsp_track_t & p_cur_file,int p_flags,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 void run(dsp_chunk_list * p_chunk_list,const dsp_track_t & p_cur_file,int p_flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 run_v2(p_chunk_list,p_cur_file,p_flags,fb2k::noAbort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 FB2K_MAKE_SERVICE_INTERFACE(dsp_v2,dsp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 //! Extended version allowing live changes in configuration without reinitialization.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 class NOVTABLE dsp_v3 : public dsp_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 FB2K_MAKE_SERVICE_INTERFACE(dsp_v3, dsp_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 //! Live change of DSP settings. Return true if accepted, false if not (DSP will be destroyed and recreated).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 virtual bool apply_preset(const dsp_preset&) = 0;
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 //! Helper class for implementing dsps. You should derive from dsp_impl_base instead of from dsp directly.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 //! The dsp_impl_base_t template allows you to use a custom interface class as a base class for your implementation, in case you provide extended functionality.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 //! Use dsp_factory_t<> template to register your dsp implementation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 //! The implementation - as required by dsp_factory_t<> template - must also provide following methods:\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 //! A constructor taking const dsp_preset&, initializing the DSP with specified preset data.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 //! static void g_get_name(pfc::string_base &); - retrieving human-readable name of the DSP to display.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! static bool g_get_default_preset(dsp_preset &); - retrieving default preset for this DSP. Return value is reserved for future use and should always be true.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! static GUID g_get_guid(); - retrieving GUID of your DSP implementation, to be used to identify it when storing DSP chain configuration.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! static bool g_have_config_popup(); - retrieving whether your DSP implementation supplies a popup dialog for configuring it.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 //! static void g_show_config_popup(const dsp_preset & p_data,HWND p_parent, dsp_preset_edit_callback & p_callback); - displaying your DSP's settings dialog; called only when g_have_config_popup() returns true; call p_callback.on_preset_changed() whenever user has made adjustments to the preset data.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 template<class t_baseclass>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 class dsp_impl_base_t : public t_baseclass {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 typedef dsp_impl_base_t<t_baseclass> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 dsp_chunk_list * m_list = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 t_size m_chunk_ptr = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 dsp_track_t m_cur_file = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 void run_v2(dsp_chunk_list * p_list,const dsp_track_t & p_cur_file,int p_flags,abort_callback & p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 //! Call only from on_chunk / on_endoftrack (on_endoftrack will give info on track being finished).\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //! May return false when there's no known track and the metadb_handle ptr will be empty/null.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 bool get_cur_file(dsp_track_t & p_out) const {p_out = m_cur_file; return p_out.is_valid();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 dsp_track_t get_cur_file() const { return m_cur_file; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 dsp_impl_base_t() {}
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 //! Inserts a new chunk of audio data. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 //! You can call this only from on_chunk(), on_endofplayback() and on_endoftrack(). You're NOT allowed to call this from flush() which should just drop any queued data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 //! @param p_hint_size Optional, amount of buffer space that you require (in audio_samples). This is just a hint for memory allocation logic and will not cause the framework to allocate the chunk for you.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 //! @returns A pointer to the newly allocated chunk. Pass the audio data you want to insert to this chunk object. The chunk is owned by the framework, you can't delete it etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 audio_chunk * insert_chunk(t_size p_hint_size = 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 PFC_ASSERT(m_list != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 return m_list->insert_item(m_chunk_ptr++,p_hint_size);
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 audio_chunk * insert_chunk( const audio_chunk & sourceCopy ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 audio_chunk * c = insert_chunk( sourceCopy.get_used_size() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 c->copy( sourceCopy );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return c;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 //! To be overridden by a DSP implementation.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 //! Called on track change. You can use insert_chunk() to dump any data you have to flush. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 //! Note that you must implement need_track_change_mark() to return true if you need this method called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 virtual void on_endoftrack(abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 //! To be overridden by a DSP implementation.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 //! Called at the end of played stream, typically at the end of last played track, to allow the DSP to return all data it has buffered-ahead.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 //! Use insert_chunk() to return any data you have buffered.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 //! Note that this call does not imply that the DSP will be destroyed next. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 //! This is also called on track changes if some DSP placed after your DSP requests track change marks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 virtual void on_endofplayback(abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 //! To be overridden by a DSP implementation.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 //! Processes a chunk of audio data.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 //! You can call insert_chunk() from inside on_chunk() to insert any audio data before currently processed chunk.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 //! @param p_chunk Current chunk being processed. You can alter it in any way you like.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 //! @returns True to keep p_chunk (with alterations made inside on_chunk()) in the stream, false to remove it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 virtual bool on_chunk(audio_chunk * p_chunk,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 //! To be overridden by a DSP implementation.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 //! Flushes the DSP (drops any buffered data). The implementation should reset the DSP to the same state it was in before receiving any audio data. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 //! Called after seeking, etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 virtual void flush() override = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 //! To be overridden by a DSP implementation.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 //! Retrieves amount of data buffered by the DSP, for syncing visualisation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 //! @returns Amount of buffered audio data, in seconds.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 virtual double get_latency() override = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 //! To be overridden by a DSP implementation.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 //! Returns true if DSP needs to know exact track change point (eg. for crossfading, removing silence).\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 //! Signaling this will force-flush any DSPs placed before this DSP so when it gets on_endoftrack(), relevant chunks contain last samples of the track.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 //! Signaling this may interfere with gapless playback in certain scenarios (forces flush of DSPs placed before you) so don't use it unless you have reasons to.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 virtual bool need_track_change_mark() override = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 dsp_impl_base_t(const t_self&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 const t_self & operator=(const t_self &) = delete;
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 template<class t_baseclass>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 void dsp_impl_base_t<t_baseclass>::run_v2(dsp_chunk_list * p_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
199 pfc::vartoggle_t<dsp_chunk_list*> l_list_toggle(m_list,p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 auto track_toggle = pfc::autoToggle(m_cur_file, p_cur_file);
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 for(m_chunk_ptr = 0;m_chunk_ptr<m_list->get_count();m_chunk_ptr++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 audio_chunk * c = m_list->get_item(m_chunk_ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 if (c->is_empty() || !on_chunk(c,p_abort))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 m_list->remove_by_idx(m_chunk_ptr--);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 if (p_flags & dsp::FLUSH) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 on_endofplayback(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 } else if (p_flags & dsp::END_OF_TRACK) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 if (need_track_change_mark()) on_endoftrack(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
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 typedef dsp_impl_base_t<dsp_v2> dsp_impl_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 class NOVTABLE dsp_preset {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 virtual GUID get_owner() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 virtual void set_owner(const GUID & p_owner) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 virtual const void * get_data() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 virtual t_size get_data_size() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 virtual void set_data(const void * p_data,t_size p_data_size) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 virtual void set_data_from_stream(stream_reader * p_stream,t_size p_bytes,abort_callback & p_abort) = 0;
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 const dsp_preset & operator=(const dsp_preset & p_source) {copy(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 void copy(const dsp_preset & p_source) {set_owner(p_source.get_owner());set_data(p_source.get_data(),p_source.get_data_size());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 void contents_to_stream(stream_writer * p_stream,abort_callback & p_abort) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 void contents_from_stream(stream_reader * p_stream,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 static void 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
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 bool operator==(const dsp_preset & p_other) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 if (get_owner() != p_other.get_owner()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 if (get_data_size() != p_other.get_data_size()) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 if (memcmp(get_data(),p_other.get_data(),get_data_size()) != 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 bool operator!=(const dsp_preset & p_other) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 return !(*this == p_other);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 pfc::string8 get_owner_name() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 pfc::string8 get_owner_name_debug() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 pfc::string8 debug(const char * knownName = nullptr) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 dsp_preset() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 ~dsp_preset() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 class dsp_preset_writer : public stream_writer {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 void write(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 m_data.append_fromptr((const t_uint8 *) p_buffer,p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 void flush(dsp_preset & p_preset) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 p_preset.set_data(m_data.get_ptr(),m_data.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 m_data.set_size(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 pfc::array_t<t_uint8,pfc::alloc_fast_aggressive> m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 class dsp_preset_reader : public stream_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 dsp_preset_reader() : m_walk(0) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 dsp_preset_reader(const dsp_preset_reader & p_source) : m_walk(0) {*this = p_source;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 void init(const dsp_preset & p_preset) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 m_data.set_data_fromptr( (const t_uint8*) p_preset.get_data(), p_preset.get_data_size() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 m_walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 t_size read(void * p_buffer,t_size p_bytes,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 p_abort.check();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 t_size todo = pfc::min_t<t_size>(p_bytes,m_data.get_size()-m_walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 memcpy(p_buffer,m_data.get_ptr()+m_walk,todo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 m_walk += todo;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 return todo;
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 bool is_finished() {return m_walk == m_data.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 t_size m_walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 pfc::array_t<t_uint8> m_data;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 class dsp_preset_impl : public dsp_preset
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 dsp_preset_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 dsp_preset_impl(const dsp_preset_impl & p_source) {copy(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 dsp_preset_impl(const dsp_preset & p_source) {copy(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 dsp_preset_impl(dsp_preset_impl && p_source) noexcept {move(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 void clear() {m_owner = pfc::guid_null; m_data.clear();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 bool is_valid() const { return m_owner != pfc::guid_null; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 const dsp_preset_impl& operator=(const dsp_preset_impl & p_source) {copy(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 const dsp_preset_impl& operator=(const dsp_preset & p_source) {copy(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 const dsp_preset_impl& operator=(dsp_preset_impl&& p_source) noexcept { move(p_source); return *this; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 GUID get_owner() const {return m_owner;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 void set_owner(const GUID & p_owner) {m_owner = p_owner;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 const void * get_data() const {return m_data.ptr();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 t_size get_data_size() const {return m_data.size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 void set_data(const void * p_data,t_size p_data_size) {m_data.set_data_fromptr((const t_uint8*)p_data,p_data_size);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 void 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
308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 void move(dsp_preset_impl& source) noexcept {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 m_owner = source.m_owner;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 m_data = std::move(source.m_data);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 void set_data(pfc::mem_block&& data) { m_data = std::move(data); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 GUID m_owner = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 pfc::mem_block m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 };
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 class NOVTABLE dsp_preset_edit_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 virtual void on_preset_changed(const dsp_preset &) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 dsp_preset_edit_callback(const dsp_preset_edit_callback&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 const dsp_preset_edit_callback & operator=(const dsp_preset_edit_callback &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 dsp_preset_edit_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 ~dsp_preset_edit_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 class NOVTABLE dsp_preset_edit_callback_v2 : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 FB2K_MAKE_SERVICE_INTERFACE(dsp_preset_edit_callback_v2, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 virtual void get_preset( dsp_preset & outPreset ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 virtual void set_preset( const dsp_preset & inPreset ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 virtual void dsp_dialog_done( bool bOK ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 void reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
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 class NOVTABLE dsp_entry : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 virtual void get_name(pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 virtual bool get_default_preset(dsp_preset & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 virtual bool instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 virtual GUID get_guid() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 virtual bool have_config_popup() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 #ifdef FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 virtual void show_config_popup( fb2k::dspConfigContext_t parent, dsp_preset_edit_callback_v2::ptr callback ) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 #endif
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 #ifdef FOOBAR2000_DESKTOP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 //! Shows configuration popup. Call from main thread only! \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 //! Blocks until done. Returns true if preset has been altered, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 //! Legacy method, replaced in dsp_entry_v2 and newer.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 virtual bool show_config_popup(dsp_preset& p_data, fb2k::hwnd_t p_parent) { (void)p_data; (void)p_parent; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 #else // non-Windows desktop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 //! Shows configuration popup. Main thread only! \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 //! Mac: returns NSObjectWrapper holding NSViewController
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 virtual service_ptr show_config_popup(fb2k::hwnd_t parent, dsp_preset_edit_callback_v2::ptr callback) { (void)parent; (void)callback; throw pfc::exception_not_implemented(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 #endif // FOOBAR2000_DESKTOP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 //! Obsolete method, hidden DSPs now use a different entry class.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 bool is_user_accessible() { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 static constexpr unsigned flag_playback = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 flag_conversion = 1 << 1;
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 static bool 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
373 static service_ptr_t<dsp_entry> g_get_interface(const GUID&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 static bool g_instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset, unsigned flags = 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 static bool 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
376 static bool 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
377 static bool g_dsp_exists(const GUID & p_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 static bool g_get_default_preset(dsp_preset & p_out,const GUID & p_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 static bool g_have_config_popup(const GUID & p_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 static bool g_have_config_popup(const dsp_preset & p_preset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 //! Shows configuration popup. Main thread only! \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 //! Blocks until done. Returns true if preset has been altered, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 static bool 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
385 //! Shows configuration popup. Main thread only!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 //! Blocks until done. Uses callback to notify host about preset change.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 static void 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
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 //! Shows configuration popup. Main thread only! \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 //! Blocks until done. Uses callback to notify host about preset change. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 //! Implements a fallback using legacy methods if show_config_popup_v2() is not available. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 //! @returns OK/cancel status (true/false), if the dialog supports it; otherwise always true.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 bool 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
394
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 //! Shows configuration popup. Main thread only! \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 //! May either block until done and return null, or run asynchronously and return an object to release to cancel the dialog. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 //! Implements a fallback using legacy methods if show_config_popup_v3() is not available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 service_ptr 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
399 #endif
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 #ifdef FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 static void g_show_config_popup( fb2k::dspConfigContext_t parent, dsp_preset_edit_callback_v2::ptr callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 bool get_display_name_supported();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 void get_display_name_(const dsp_preset& arg, pfc::string_base& out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 bool enumerate_default_presets_(dsp_chain_config& ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 bool match_preset_subclass_(dsp_preset const& x, dsp_preset const& y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(dsp_entry);
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 class NOVTABLE dsp_entry_v2 : public dsp_entry {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 //! Shows configuration popup. Main thread only!
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 virtual void show_config_popup_v2(const dsp_preset & p_data,fb2k::hwnd_t p_parent,dsp_preset_edit_callback & p_callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 // Obsolete method, redirected to show_config_popup_v2() by default, no need to implement.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 bool show_config_popup(dsp_preset& p_data, fb2k::hwnd_t p_parent) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 private:
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 FB2K_MAKE_SERVICE_INTERFACE(dsp_entry_v2,dsp_entry);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 //! \since Late 1.6.x
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 class NOVTABLE dsp_entry_v3 : public dsp_entry_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 FB2K_MAKE_SERVICE_INTERFACE(dsp_entry_v3, dsp_entry_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 //! Returns the text to show in DSP list, for this specific preset.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 virtual void get_display_name(const dsp_preset& arg, pfc::string_base& out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 //! Shows configuration popup, asynchronous version - creates dialog then returns immediately. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 //! Since not every DSP implements this, caller must be prepared to call legacy blocking show_config_popup methods instead. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 //! show_config_popup_v3() may throw pfc::exception_not_implemented() to signal host that this DSP doesn't support this method yet. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 //! Main thread only! \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 //! @returns Object to retain by host, to be released to request the dialog to be closed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 virtual service_ptr show_config_popup_v3(fb2k::hwnd_t parent, dsp_preset_edit_callback_v2::ptr callback) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 #endif
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 //! \since 2.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 class NOVTABLE dsp_entry_v4 : public dsp_entry_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 FB2K_MAKE_SERVICE_INTERFACE(dsp_entry_v4, dsp_entry_v3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 virtual dsp::ptr instantiate_v4( const dsp_preset & arg, unsigned flags ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 };
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 //! \since 2.2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 class NOVTABLE dsp_entry_v5 : public dsp_entry_v4 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 FB2K_MAKE_SERVICE_INTERFACE(dsp_entry_v5, dsp_entry_v4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 //! If your DSP implementation is meant to preset as multiple item in available DSP list, implement this method. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 //! @returns True if preset list has been returned (your DSP will be hidden if blank), false if your DSP is meant to be shown as just one item.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 virtual bool enumerate_default_presets(dsp_chain_config& ret) { (void)ret; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 //! Can possibly reach state Y by editing state X, and vice versa? \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 //! If this DSP has no configuration UI, this should just test if the presets are identical.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 //! Frontend will use this to pin running presets to one of available DSP list items.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 virtual bool match_preset_subclass(dsp_preset const& x, dsp_preset const& y) { (void)x; (void)y; return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 };
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 class NOVTABLE dsp_entry_hidden : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(dsp_entry_hidden);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 //! Obsolete method, hidden DSPs now use a different entry class from ordinary ones.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 bool is_user_accessible() {return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 static bool g_get_interface( dsp_entry_hidden::ptr & out, const GUID & guid );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 static bool g_instantiate( dsp::ptr & out, const dsp_preset & preset );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 static bool g_dsp_exists(const GUID & p_guid);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 virtual bool instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 virtual GUID get_guid() = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 template<class T,class t_entry = dsp_entry>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 class dsp_entry_impl_nopreset_t : public t_entry {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 void get_name(pfc::string_base & p_out) override {T::g_get_name(p_out);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 bool get_default_preset(dsp_preset & p_out) override
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 p_out.set_owner(T::g_get_guid());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 p_out.set_data(0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 bool instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset) override
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 if (p_preset.get_owner() == T::g_get_guid() && p_preset.get_data_size() == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 p_out = new service_impl_t<T>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 return p_out.is_valid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 GUID get_guid() override {return T::g_get_guid();}
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 bool have_config_popup() override {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 template<typename T, typename interface_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 class dsp_entry_common_t : public interface_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 void get_name(pfc::string_base& p_out) override { T::g_get_name(p_out); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 bool get_default_preset(dsp_preset& p_out) override { return T::g_get_default_preset(p_out); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 bool instantiate(service_ptr_t<dsp>& p_out, const dsp_preset& p_preset) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 if (p_preset.get_owner() == T::g_get_guid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 p_out = new service_impl_t<T>(p_preset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 } else return false;
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 GUID get_guid() override { return T::g_get_guid(); }
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 bool have_config_popup() override { return T::g_have_config_popup(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 #ifdef FOOBAR2000_MOBILE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 void show_config_popup( fb2k::dspConfigContext_t parent, dsp_preset_edit_callback_v2::ptr callback ) override { T::g_show_config_popup(parent, callback); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 #if defined(FOOBAR2000_DESKTOP) && !defined(_WIN32)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 service_ptr show_config_popup( fb2k::hwnd_t parent, dsp_preset_edit_callback_v2::ptr callback ) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 return T::g_show_config_popup(parent, callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 template<class T, class t_entry = dsp_entry>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 class dsp_entry_impl_t : public dsp_entry_common_t<T, t_entry> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 bool show_config_popup(dsp_preset & p_data,fb2k::hwnd_t p_parent) override {return T::g_show_config_popup(p_data,p_parent);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 #endif
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 template<class T, class t_entry = dsp_entry_v2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 class dsp_entry_v2_impl_t : public dsp_entry_common_t<T, t_entry> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 void show_config_popup_v2(const dsp_preset & p_data,fb2k::hwnd_t p_parent,dsp_preset_edit_callback & p_callback) override {T::g_show_config_popup(p_data,p_parent,p_callback);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 };
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 template<class T, class t_entry = dsp_entry_v3>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 class dsp_entry_v3_impl_t : public dsp_entry_v2_impl_t<T, t_entry> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 void get_display_name(const dsp_preset& arg, pfc::string_base& out) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 T::g_get_display_name(arg, out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 service_ptr show_config_popup_v3(fb2k::hwnd_t parent, dsp_preset_edit_callback_v2::ptr callback) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 return T::g_show_config_popup_v3(parent, callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 template<class dsp_t, class entry_t = dsp_entry_v4>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 class dsp_entry_v4_impl_t : public dsp_entry_v3_impl_t< dsp_t, entry_t > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 dsp::ptr instantiate_v4( const dsp_preset & arg, unsigned flags ) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 PFC_ASSERT( arg.get_owner() == dsp_t::g_get_guid() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 return new service_impl_t< dsp_t > ( arg, flags );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 };
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 template<class dsp_t, class entry_t = dsp_entry_v5>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 class dsp_entry_v5_impl_t : public dsp_entry_v4_impl_t< dsp_t, entry_t > {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 bool enumerate_default_presets(dsp_chain_config& ret) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 return dsp_t::g_enumerate_default_presets(ret);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 bool match_preset_subclass(dsp_preset const& x, dsp_preset const& y) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 return dsp_t::g_match_preset_subclass(x, y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 }
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 template<typename dsp_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 class dsp_entry_hidden_t : public dsp_entry_hidden {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 bool instantiate(service_ptr_t<dsp> & p_out,const dsp_preset & p_preset) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 if (p_preset.get_owner() == dsp_t::g_get_guid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 p_out = new service_impl_t<dsp_t>(p_preset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 } else return false;
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 GUID get_guid() override {return dsp_t::g_get_guid();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 template<typename dsp_t, typename interface_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 class implement_dsp_entry;
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 template<typename dsp_t> class implement_dsp_entry<dsp_t, dsp_entry> : public dsp_entry_impl_t<dsp_t> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 template<typename dsp_t> class implement_dsp_entry<dsp_t, dsp_entry_v2> : public dsp_entry_v2_impl_t<dsp_t> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 template<typename dsp_t> class implement_dsp_entry<dsp_t, dsp_entry_v3> : public dsp_entry_v3_impl_t<dsp_t> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 template<typename dsp_t> class implement_dsp_entry<dsp_t, dsp_entry_v4> : public dsp_entry_v4_impl_t<dsp_t> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 template<typename dsp_t> class implement_dsp_entry<dsp_t, dsp_entry_v5> : public dsp_entry_v5_impl_t<dsp_t> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 template<typename dsp_t> class implement_dsp_entry<dsp_t, dsp_entry_hidden> : public dsp_entry_hidden_t<dsp_t> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 class dsp_factory_nopreset_t : public service_factory_single_t<dsp_entry_impl_nopreset_t<T> > {};
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 template<typename dsp_t, typename interface_t = dsp_entry_v2>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 class dsp_factory_t : public service_factory_single_t<implement_dsp_entry<dsp_t, interface_t> > {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 class dsp_factory_hidden_t : public service_factory_single_t< dsp_entry_hidden_t<T> > {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 class NOVTABLE dsp_chain_config
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 virtual t_size get_count() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 virtual const dsp_preset & get_item(t_size p_index) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 virtual void replace_item(const dsp_preset & p_data,t_size p_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 virtual void insert_item(const dsp_preset & p_data,t_size p_index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 virtual void remove_mask(const bit_array & p_mask) = 0;
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 void remove_item(t_size p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 void remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 void add_item(const dsp_preset & p_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 void copy(const dsp_chain_config & p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 void add_items(const dsp_chain_config & p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 const dsp_chain_config & operator=(const dsp_chain_config & p_source) {copy(p_source); return *this;}
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 void contents_to_stream(stream_writer * p_stream,abort_callback & p_abort) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 void contents_from_stream(stream_reader * p_stream,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 fb2k::memBlock::ptr to_blob() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 void from_blob(const void* p, size_t size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 void from_blob(fb2k::memBlock::ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 pfc::string8 get_name_list() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 void get_name_list(pfc::string_base & p_out) const;
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 static bool equals(dsp_chain_config const & v1, dsp_chain_config const & v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 static bool equals_debug(dsp_chain_config const& v1, dsp_chain_config const& v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 //! Helpers to enable/disable specific DSP in this chain. Return true if the chain has been altered, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 bool enable_dsp( const GUID & dspID );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 //! Helpers to enable/disable specific DSP in this chain. Return true if the chain has been altered, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 bool disable_dsp( const GUID & dspID );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 //! Helpers to enable/disable specific DSP in this chain. Return true if the chain has been altered, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 bool enable_dsp( const dsp_preset & preset );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 size_t find_first_of_type( const GUID & dspID ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 bool contains_dsp( const GUID & dspID ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 pfc::string8 debug() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 bool operator==(const dsp_chain_config & other) const {return equals(*this, other);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 bool operator!=(const dsp_chain_config & other) const {return !equals(*this, other);}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 FB2K_STREAM_READER_OVERLOAD(dsp_chain_config) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 value.contents_from_stream(&stream.m_stream, stream.m_abort); return stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 }
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 FB2K_STREAM_WRITER_OVERLOAD(dsp_chain_config) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 value.contents_to_stream(&stream.m_stream, stream.m_abort); return stream;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 class dsp_chain_config_impl : public dsp_chain_config
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 dsp_chain_config_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 dsp_chain_config_impl(const dsp_chain_config & p_source) {copy(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 dsp_chain_config_impl(const dsp_chain_config_impl & p_source) { copy_v2(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 dsp_chain_config_impl(dsp_chain_config_impl&& p_source) noexcept : m_data(std::move(p_source.m_data)) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 t_size get_count() const override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 const dsp_preset & get_item(t_size p_index) const override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 void replace_item(const dsp_preset & p_data,t_size p_index) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 void insert_item(const dsp_preset & p_data,t_size p_index) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 void remove_mask(const bit_array & p_mask) override;
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 const char* get_dsp_name(size_t idx) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 void 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
674 void add_item_v2(const dsp_preset& data, const char* dspName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 void copy_v2(dsp_chain_config_impl const&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 pfc::string8 debug() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 const dsp_chain_config_impl & operator=(const dsp_chain_config & p_source) {copy(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 const dsp_chain_config_impl & operator=(const dsp_chain_config_impl & p_source) {copy_v2(p_source); return *this;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 const dsp_chain_config_impl & operator=(dsp_chain_config_impl&& p_source) noexcept { m_data = std::move(p_source.m_data); p_source.m_data.remove_all(); return *this; }
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 ~dsp_chain_config_impl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 void reorder( const size_t * order, size_t count );
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 void supply_name(size_t idx, pfc::string8 && name) { m_data[idx]->dspName = std::move(name); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 const char* find_dsp_name(const GUID& guid) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 private:
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 struct entry_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 dsp_preset_impl data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 pfc::string8 dspName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694
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 pfc::ptr_list_t<entry_t> m_data;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 //! Helper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 class dsp_preset_parser : public stream_reader_formatter<> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 dsp_preset_parser(const dsp_preset& in) : stream_reader_formatter(_m_stream, fb2k::noAbort), m_data(in), _m_stream(in.get_data(), in.get_data_size()) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 void reset() { _m_stream.reset(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 t_size get_remaining() const { return _m_stream.get_remaining(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 void assume_empty() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 if (get_remaining() != 0) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 }
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 GUID get_owner() const { return m_data.get_owner(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 const dsp_preset& m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 stream_reader_memblock_ref _m_stream;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 //! Helper.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 class dsp_preset_builder : public stream_writer_formatter<> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 dsp_preset_builder() : stream_writer_formatter(_m_stream, fb2k::noAbort) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 void finish(const GUID& id, dsp_preset& out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 out.set_owner(id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 out.set_data(_m_stream.m_buffer.get_ptr(), _m_stream.m_buffer.get_size());
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 void reset() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 _m_stream.m_buffer.set_size(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 stream_writer_buffer_simple _m_stream;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 #ifdef __APPLE__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 // NSObjectWrapper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 #include "commonObjects-Apple.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 #endif
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 #endif