diff --git a/lib/soundtouch-master/include/soundtouch/SourceSpan.h b/lib/soundtouch-master/include/soundtouch/SourceSpan.h new file mode 100644 index 00000000..a3a78bb2 --- /dev/null +++ b/lib/soundtouch-master/include/soundtouch/SourceSpan.h @@ -0,0 +1,22 @@ +/* uTun: происхождение PCM без изменения DSP. Индексы — сэмплы НА КАНАЛ от clear(). + * Copy: out[i] происходит из input0+i. Mix: источники input0+i и input1+i, + * вес второго i/count, первого 1-i/count. Это описание происхождения, не PCM. + * Reset начинает новую шкалу. Invalid запрещает её использование до clear(). + * Callback синхронный: нельзя вызывать SoundTouch повторно, блокировать поток или + * сохранять ссылку на событие. Ошибки передаются через Invalid; логирует потребитель. */ +#ifndef SOUNDTOUCH_SOURCE_SPAN_H +#define SOUNDTOUCH_SOURCE_SPAN_H +#include + +namespace soundtouch { +enum class SourceKind { Reset, Copy, Mix, Invalid }; +enum class SourceError { None, Profile, Reconfigure, Flush, LateAttach }; +struct SourceSpan { + SourceKind kind; + SourceError error = SourceError::None; + uint64_t output = 0, input0 = 0, input1 = 0; + uint32_t count = 0; +}; +using SourceCallback = void (*)(void*, const SourceSpan&); +} +#endif diff --git a/lib/soundtouch-master/source/SoundTouch/InterpolateCubic.h b/lib/soundtouch-master/source/SoundTouch/InterpolateCubic.h index 4eae60a6..eccb52e5 100644 --- a/lib/soundtouch-master/source/SoundTouch/InterpolateCubic.h +++ b/lib/soundtouch-master/source/SoundTouch/InterpolateCubic.h @@ -58,6 +58,9 @@ public: virtual void resetRegisters() override; + // При fract=0 кубический интерполятор копирует psrc[1], сохраняя четыре входных сэмпла. + int unitySourceOffset() const override { return rate == 1.0 && fract == 0.0 ? 1 : -1; } + virtual int getLatency() const override { return 1; diff --git a/lib/soundtouch-master/source/SoundTouch/RateTransposer.h b/lib/soundtouch-master/source/SoundTouch/RateTransposer.h index addf780a..28311ba4 100644 --- a/lib/soundtouch-master/source/SoundTouch/RateTransposer.h +++ b/lib/soundtouch-master/source/SoundTouch/RateTransposer.h @@ -83,6 +83,9 @@ public: virtual void setChannels(int channels); virtual int getLatency() const = 0; + // uTun: смещение точного копирования при rate=1; -1 если реализация не поддерживает карту. + virtual int unitySourceOffset() const { return -1; } + virtual void resetRegisters() = 0; // static factory function @@ -133,6 +136,8 @@ public: AAFilter *getAAFilter(); /// Enables/disables the anti-alias filter. Zero to disable, nonzero to enable + int unitySourceOffset() const { return bUseAAFilter ? -1 : pTransposer->unitySourceOffset(); } + void enableAAFilter(bool newMode); /// Returns nonzero if anti-alias filter is enabled.