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

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef FOOBAR2000_HAVE_DSP
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 //! A resampler DSP entry. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 //! It is STRICTLY REQUIRED that the output is: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! (A) In the requested sample rate (specified when creating the preset), \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! (B) .. or untouched if the conversion cannot be performed / there's no conversion to be performed (input rate == output rate). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Not every resampler supports every possible sample rate conversion ratio. Bundled PPHS resampler (always installed since foobar2000 v1.6) does accept every possible conversion.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 class NOVTABLE resampler_entry : public dsp_entry
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 virtual bool is_conversion_supported(unsigned p_srate_from,unsigned p_srate_to) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 virtual bool create_preset(dsp_preset & p_out,unsigned p_target_srate,float p_qualityscale) = 0;//p_qualityscale is 0...1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 virtual float get_priority() = 0;//value is 0...1, where high-quality (SSRC etc) has 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 static bool g_get_interface(service_ptr_t<resampler_entry> & p_out,unsigned p_srate_from,unsigned p_srate_to);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 static bool g_create(service_ptr_t<dsp> & p_out,unsigned p_srate_from,unsigned p_srate_to,float p_qualityscale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 static bool g_create_preset(dsp_preset & p_out,unsigned p_srate_from,unsigned p_srate_to,float p_qualityscale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 FB2K_MAKE_SERVICE_INTERFACE(resampler_entry,dsp_entry);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 template<typename impl_t, typename base_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 class implement_resampler_entry : public base_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 bool is_conversion_supported(unsigned p_srate_from, unsigned p_srate_to) override { return impl_t::g_is_conversion_supported(p_srate_from, p_srate_to); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 bool create_preset(dsp_preset& p_out, unsigned p_target_srate, float p_qualityscale) override { return impl_t::g_create_preset(p_out, p_target_srate, p_qualityscale); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 float get_priority() override { return impl_t::g_get_priority(); }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 class resampler_entry_impl_t : public implement_resampler_entry<T, dsp_entry_impl_t<T,resampler_entry> > {};
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 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 class resampler_factory_t : public service_factory_single_t<resampler_entry_impl_t<T> > {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 #ifdef FOOBAR2000_DESKTOP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 //! \since 1.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 //! Supersedes resampler_entry::get_priority, allows the user to specify which resampler should be preferred when a component asks for one.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 class resampler_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 FB2K_MAKE_SERVICE_COREAPI(resampler_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 //! Locate the preferred resampler that is capable of performing conversion from the source to destination rate. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! If input sample rate is not known in advance or may change in mid-conversion, it's recommended to use make_chain() instead to full obey user settings.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 virtual resampler_entry::ptr get_resampler( unsigned rateFrom, unsigned rateTo ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! Compatibility wrapper, see resampler_manager_v2::make_chain().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void make_chain_(dsp_chain_config& outChain, unsigned rateFrom, unsigned rateTo, float qualityScale);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 class dsp_chain_config;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 //! \since 1.6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 class resampler_manager_v2 : public resampler_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(resampler_manager_v2, resampler_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! Make a chain of resamplers. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //! Pass the intended sample rates for rateFrom & rateTo. Pass 0 rateFrom if it is not known in advance or may change in mid-conversion.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 //! With rateFrom known in advance, the chain should hold only one DSP. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! If rateFrom is not known in advance, multiple DSPs may be returned - a preferred one that accepts common conversion ratios but not all of them, and a fallback one that handles every scenario if the first one failed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 //! For an example, by default, SSRC (higher quality) is used, but PPHS (more compatible) is added to clean up odd sample rates that SSRC failed to process. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //! Note that it is required that resamplers pass untouched data if no resampling is performed, so additional DSPs have no effect on the audio coming thru, as just one resampler will actually do anything.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 virtual void make_chain( dsp_chain_config & outChain, unsigned rateFrom, unsigned rateTo, float qualityScale) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! \since 1.6.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 class resampler_manager_v3 : public resampler_manager_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(resampler_manager_v3, resampler_manager_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //! Extended make_chain that also manipulates channel layout.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual void make_chain_v3(dsp_chain_config& outChain, unsigned rateFrom, unsigned rateTo, float qualityScale, unsigned chmask) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 #endif // FOOBAR2000_HAVE_DSP