diff --git a/.gitignore b/.gitignore index ad3cd24..f8aea42 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,10 @@ java/build/ # third_party — only fftw is downloaded manually, rnnoise and libspecbleach are tracked third_party/fftw/ +third_party/**/*.o +third_party/**/*.a +third_party/fftw-3.3.11.tar.gz +third_party/fftw-3.3.11/ # macOS .DS_Store diff --git a/Makefile.android b/Makefile.android index a540ea5..5ce574d 100644 --- a/Makefile.android +++ b/Makefile.android @@ -5,17 +5,39 @@ # Optional overrides: # ANDROID_NDK=/path/to/ndk ANDROID_API=24 ANDROID_ABIS="arm64-v8a x86_64" # -# Requires FFTW source in third_party/fftw/ -# Download from https://www.fftw.org/download.html and extract so that -# third_party/fftw/configure exists. +# FFTW source is downloaded and extracted automatically. +# Override FFTW_SRC to use an existing directory. -ANDROID_NDK ?= /home/vladimir/Android/Sdk/ndk/29.0.14206865 +# Auto-detect NDK path (can always be overridden by setting ANDROID_NDK explicitly): +# 1. ANDROID_NDK_HOME environment variable +# 2. Latest NDK under ANDROID_SDK_ROOT or ANDROID_HOME +# 3. Default SDK locations: ~/Android/Sdk (Linux) or ~/Library/Android/sdk (macOS) +ifeq ($(origin ANDROID_NDK),undefined) + ifdef ANDROID_NDK_HOME + ANDROID_NDK := $(ANDROID_NDK_HOME) + else + _SDK_ROOT := $(or $(ANDROID_SDK_ROOT),$(ANDROID_HOME),\ + $(wildcard $(HOME)/Android/Sdk),\ + $(wildcard $(HOME)/Library/Android/sdk)) + ifdef _SDK_ROOT + ANDROID_NDK := $(lastword $(sort $(wildcard $(_SDK_ROOT)/ndk/*))) + endif + endif +endif +ifndef ANDROID_NDK + $(error Cannot find Android NDK. Set ANDROID_NDK, ANDROID_NDK_HOME, ANDROID_SDK_ROOT, or ANDROID_HOME) +endif ANDROID_API ?= 24 ANDROID_ABIS ?= arm64-v8a armeabi-v7a x86_64 ANDROID_HOST_TAG ?= $(shell uname -s | tr '[:upper:]' '[:lower:]' | sed 's/darwin/darwin/;s/linux/linux/')-$(shell uname -m | sed 's/aarch64/arm64/;s/x86_64/x86_64/') -JBR_BIN ?= /opt/android-studio/jbr/bin -JAVAC ?= $(JBR_BIN)/javac +# Auto-detect javac: JAVA_HOME > system PATH > Android Studio JBR (Linux/macOS) +_JAVAC_CANDIDATES := \ + $(if $(JAVA_HOME),$(wildcard $(JAVA_HOME)/bin/javac)) \ + $(shell command -v javac 2>/dev/null) \ + $(wildcard /opt/android-studio/jbr/bin/javac) \ + $(wildcard /Applications/Android\ Studio.app/Contents/jbr/Contents/Home/bin/javac) +JAVAC ?= $(firstword $(_JAVAC_CANDIDATES)) TOOLCHAIN := $(ANDROID_NDK)/toolchains/llvm/prebuilt/$(ANDROID_HOST_TAG) @@ -24,7 +46,10 @@ COMMON_CPPFLAGS ?= -I. -I third_party/rnnoise/include -I third_party/libspecblea ANDROID_JNI_CFLAGS ?= -std=gnu89 -Wno-implicit-function-declaration -Wno-int-conversion \ -Wno-incompatible-pointer-types -Wno-incompatible-pointer-types-discards-qualifiers -FFTW_SRC ?= third_party/fftw +FFTW_VERSION := 3.3.11 +FFTW_TAR := fftw-$(FFTW_VERSION).tar.gz +FFTW_URL := https://fftw.org/pub/fftw/$(FFTW_TAR) +FFTW_SRC ?= third_party/fftw-$(FFTW_VERSION) FFTW_MAKEJOBS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) WDSP_SOURCES = amd.c \ @@ -148,9 +173,9 @@ ANDROID_OBJ_ROOT := obj/android ANDROID_LIB_ROOT := lib/android ANDROID_JAVA_OUT := lib/android/java -.PHONY: all clean java-classes check-fftw-src +.PHONY: all clean distclean java-classes -all: check-fftw-src \ +all: $(FFTW_SRC)/configure \ $(foreach abi,$(ANDROID_ABIS),\ $(ANDROID_LIB_ROOT)/$(abi)/libfftw3.so \ $(ANDROID_LIB_ROOT)/$(abi)/libfftw3f.so \ @@ -158,15 +183,21 @@ all: check-fftw-src \ $(ANDROID_LIB_ROOT)/$(abi)/libwdspj.so) \ java-classes -check-fftw-src: - @test -f $(FFTW_SRC)/configure || { \ - echo ""; \ - echo "ERROR: FFTW source not found at $(FFTW_SRC)/configure"; \ - echo "Download and extract FFTW from https://www.fftw.org/download.html"; \ - echo "so that $(FFTW_SRC)/configure exists."; \ - echo ""; \ - exit 1; \ - } +# ── Автоматическое получение FFTW ──────────────────────────────────────────── + +third_party/$(FFTW_TAR): + mkdir -p third_party + @echo ">>> Скачиваем FFTW $(FFTW_VERSION)..." + @if command -v wget >/dev/null 2>&1; then \ + wget -q --show-progress -O $@ "$(FFTW_URL)"; \ + else \ + curl -L --progress-bar -o $@ "$(FFTW_URL)"; \ + fi + +$(FFTW_SRC)/configure: third_party/$(FFTW_TAR) + @echo ">>> Распаковываем FFTW..." + tar xf $< -C third_party/ + @touch $@ # abi_target: compiler triple for NDK clang wrapper define abi_target @@ -226,11 +257,12 @@ ABI_$(1)_WDSP_OBJS := $$(patsubst %.c,$$(ABI_$(1)_OBJDIR)/%.o,$$(ALL_C_SOURCES)) ABI_$(1)_JNI_OBJ := $$(ABI_$(1)_OBJDIR)/$(JNI_SOURCE:.c=.o) # --- Build fftw3 (double) --- -$$(ABI_$(1)_FFTW_STAMP): +$$(ABI_$(1)_FFTW_STAMP): $(FFTW_SRC)/configure @mkdir -p $$(ABI_$(1)_OBJDIR)/fftw-build $$(ABI_$(1)_FFTW_PREFIX) cd $$(ABI_$(1)_OBJDIR)/fftw-build && \ $(abspath $(FFTW_SRC))/configure \ - --host=$(call fftw_host,$(1)) \ + --build=$(shell uname -m)-linux-gnu \ + --host=$(strip $(call fftw_host,$(1))) \ CC="$$(ABI_$(1)_CC)" \ CFLAGS="-fPIC" \ --prefix=$(abspath $$(ABI_$(1)_FFTW_PREFIX)) \ @@ -240,11 +272,12 @@ $$(ABI_$(1)_FFTW_STAMP): @touch $$@ # --- Build fftw3f (float/single) --- -$$(ABI_$(1)_FFTWF_STAMP): +$$(ABI_$(1)_FFTWF_STAMP): $(FFTW_SRC)/configure @mkdir -p $$(ABI_$(1)_OBJDIR)/fftwf-build $$(ABI_$(1)_FFTWF_PREFIX) cd $$(ABI_$(1)_OBJDIR)/fftwf-build && \ $(abspath $(FFTW_SRC))/configure \ - --host=$(call fftw_host,$(1)) \ + --build=$(shell uname -m)-linux-gnu \ + --host=$(strip $(call fftw_host,$(1))) \ CC="$$(ABI_$(1)_CC)" \ CFLAGS="-fPIC" \ --prefix=$(abspath $$(ABI_$(1)_FFTWF_PREFIX)) \ @@ -311,3 +344,6 @@ java-classes: $(JAVA_SOURCE) clean: rm -rf $(ANDROID_OBJ_ROOT) $(ANDROID_LIB_ROOT) + +distclean: clean + -rm -rf $(FFTW_SRC) third_party/$(FFTW_TAR) diff --git a/Makefile.windows b/Makefile.windows new file mode 100644 index 0000000..0730dec --- /dev/null +++ b/Makefile.windows @@ -0,0 +1,294 @@ +# +# Makefile.windows — кросс-компиляция WDSP для 64-bit Windows на Linux (MinGW-w64) +# +# Использование: +# make -f Makefile.windows # DLL + статическая библиотека +# make -f Makefile.windows dll # только DLL +# make -f Makefile.windows static # только статическая библиотека +# make -f Makefile.windows clean # удалить артефакты сборки +# make -f Makefile.windows distclean # + удалить собранный и скачанный FFTW +# +# Зависимости (установить до запуска): +# Arch: sudo pacman -S mingw-w64-gcc (тянет mingw-w64-headers автоматически) +# Debian: sudo apt install mingw-w64 (мета-пакет: компилятор + заголовки + CRT) +# Fedora: sudo dnf install mingw64-gcc (тянет mingw64-headers автоматически) +# + wget или curl, tar +# + +MINGW_PREFIX ?= x86_64-w64-mingw32 + +CC := $(MINGW_PREFIX)-gcc +AR := $(MINGW_PREFIX)-ar +RANLIB := $(MINGW_PREFIX)-ranlib + +CFLAGS ?= -O3 -Wno-parentheses -Wno-incompatible-pointer-types +LDFLAGS ?= + +# ── FFTW: сборка из исходников ──────────────────────────────────────────────── + +FFTW_VERSION := 3.3.11 +FFTW_TAR := fftw-$(FFTW_VERSION).tar.gz +FFTW_URL := https://fftw.org/pub/fftw/$(FFTW_TAR) + +# Абсолютные пути — нужны для configure --prefix и sub-make -C +FFTW_SRC := $(CURDIR)/third_party/fftw-$(FFTW_VERSION) +FFTW_INST := $(CURDIR)/third_party/fftw-win64 + +# Раздельные build-директории для double и float precision +FFTW_BUILD_D := $(FFTW_INST)/build-double +FFTW_BUILD_F := $(FFTW_INST)/build-float + +# FFTW_MARCH задаёт минимальный набор инструкций для Windows-бинарника. +# haswell (2013+) гарантирует AVX2+FMA — оптимальный выбор для SDR на современном ПК. +# Для совместимости со старыми машинами замените на -march=sandybridge (AVX, 2011+) +# или -march=core2 (SSSE3, 2007+). +FFTW_MARCH ?= -march=haswell + +FFTW_CONF_COMMON = \ + --host=$(MINGW_PREFIX) \ + CC=$(CC) \ + CFLAGS="$(FFTW_MARCH)" \ + --prefix=$(FFTW_INST) \ + --enable-shared \ + --disable-static \ + --with-our-malloc \ + --enable-sse2 \ + --enable-avx \ + --enable-avx2 \ + --disable-fortran \ + --quiet + +# Sentinel-файлы для отслеживания готовности FFTW +FFTW_HEADER := $(FFTW_INST)/include/fftw3.h +FFTW_LIB_D := $(FFTW_INST)/lib/libfftw3.dll.a +FFTW_LIB_F := $(FFTW_INST)/lib/libfftw3f.dll.a +FFTW_DLL_D := $(FFTW_INST)/bin/libfftw3-3.dll +FFTW_DLL_F := $(FFTW_INST)/bin/libfftw3f-3.dll + +# ── Выходные директории и файлы ─────────────────────────────────────────────── + +OBJDIR := obj_win +OUTDIR := lib_win + +DLL := $(OUTDIR)/libwdsp.dll +IMPLIB := $(OUTDIR)/libwdsp.dll.a +STATIC_LIB := $(OUTDIR)/libwdsp.a + +# ── Исходники (копия из основного Makefile) ─────────────────────────────────── + +SOURCES = \ + amd.c ammod.c amsq.c analyzer.c anf.c anr.c apfshadow.c \ + bandpass.c calcc.c calculus.c cblock.c cfcomp.c cfir.c \ + channel.c cmath.c compress.c delay.c dexp.c div.c doublepole.c \ + eer.c emnr.c emph.c eq.c fcurve.c FDnoiseIQ.c fir.c firmin.c \ + fmd.c fmmod.c fmsq.c gain.c gaussian.c gen.c icfir.c iir.c \ + impulse_cache.c iobuffs.c iqc.c linux_port.c lmath.c main.c \ + matchedCW.c meter.c meterlog10.c nbp.c nob.c nobII.c osctrl.c \ + patchpanel.c resample.c rmatch.c rnnr.c RXA.c sbnr.c sender.c \ + shift.c siphon.c slew.c snb.c ssql.c syncbuffs.c TXA.c \ + utilities.c varsamp.c version.c wcpAGC.c wisdom.c zetaHat.c + +OBJS := $(addprefix $(OBJDIR)/, $(SOURCES:.c=.o)) + +# ── NR3/NR4: исходники third-party ──────────────────────────────────────────── +# +# Компилируем rnnoise и libspecbleach напрямую в obj_win/, минуя их sub-make. +# Это исключает конфликт с Linux-сборкой: third_party/*.a содержат ELF-объекты, +# и если они "свежее" исходников, sub-make считает их up-to-date и не пересобирает. + +RNNOISE_DIR := third_party/rnnoise +SPECBLEACH_DIR := third_party/libspecbleach + +RNNOISE_SRCS := \ + src/denoise.c src/celt_lpc.c src/kiss_fft.c src/nnet.c \ + src/nnet_default.c src/parse_lpcnet_weights.c src/pitch.c \ + src/rnn.c src/rnnoise_data.c \ + src/rnnoise_data_1.c src/rnnoise_data_2.c src/rnnoise_data_3.c \ + src/rnnoise_data_4.c src/rnnoise_data_5.c src/rnnoise_data_6.c \ + src/rnnoise_tables.c + +SPECBLEACH_SRCS := \ + src/processors/specbleach_adenoiser.c \ + src/processors/specbleach_denoiser.c \ + src/processors/adaptivedenoiser/adaptive_denoiser.c \ + src/shared/gain_estimation/gain_estimators.c \ + src/shared/noise_estimation/adaptive_noise_estimator.c \ + src/shared/pre_estimation/absolute_hearing_thresholds.c \ + src/shared/pre_estimation/critical_bands.c \ + src/shared/pre_estimation/masking_estimator.c \ + src/shared/pre_estimation/noise_scaling_criterias.c \ + src/shared/pre_estimation/spectral_smoother.c \ + src/shared/pre_estimation/transient_detector.c \ + src/shared/post_estimation/noise_floor_manager.c \ + src/shared/post_estimation/postfilter.c \ + src/shared/post_estimation/spectral_whitening.c \ + src/shared/utils/denoise_mixer.c \ + src/shared/utils/general_utils.c \ + src/shared/utils/spectral_features.c \ + src/shared/utils/spectral_utils.c \ + src/shared/stft/stft_processor.c \ + src/shared/stft/fft_transform.c \ + src/shared/stft/stft_buffer.c \ + src/shared/stft/stft_windows.c + +RNNOISE_OBJS := $(addprefix $(OBJDIR)/rnnoise/, $(RNNOISE_SRCS:.c=.o)) +SPECBLEACH_OBJS := $(addprefix $(OBJDIR)/specbleach/, $(SPECBLEACH_SRCS:.c=.o)) + +RNNOISE_LIB := $(OUTDIR)/librnnoise.a +SPECBLEACH_LIB := $(OUTDIR)/libspecbleach.a + +# ── Флаги компиляции ────────────────────────────────────────────────────────── + +NR34_INC := -I$(RNNOISE_DIR)/include -I$(SPECBLEACH_DIR)/include +FFTW_INC := -I$(FFTW_INST)/include + +COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC) + +NR34_DEPS := $(RNNOISE_LIB) $(SPECBLEACH_LIB) + +# avrt нужен т.к. comm.h включает под _WIN32 +LINK_LIBS := $(NR34_DEPS) \ + -L$(FFTW_INST)/lib -lfftw3 -lfftw3f \ + -lavrt -lm + +# ── Цели ────────────────────────────────────────────────────────────────────── + +.PHONY: all dll static fftw fftw-double fftw-float third-party check-tools clean distclean + +all: dll static + +dll: check-tools fftw third-party $(DLL) +static: check-tools fftw third-party $(STATIC_LIB) + +# ── Проверка инструментов ───────────────────────────────────────────────────── + +check-tools: + @command -v $(CC) >/dev/null 2>&1 || { \ + echo ""; \ + echo "ОШИБКА: $(CC) не найден. Установите mingw-w64:"; \ + echo " Arch: sudo pacman -S mingw-w64-gcc"; \ + echo " Debian: sudo apt install mingw-w64"; \ + echo " Fedora: sudo dnf install mingw64-gcc"; \ + echo ""; exit 1; } + @echo '#include ' | $(CC) -x c - -fsyntax-only -Wno-pragma-once-outside-header 2>/dev/null || { \ + echo ""; \ + echo "ОШИБКА: Windows API заголовки не найдены."; \ + echo "Установите пакет с заголовками MinGW-w64:"; \ + echo " Arch: sudo pacman -S mingw-w64-headers"; \ + echo " Debian: sudo apt install mingw-w64 # не gcc-mingw-w64-x86-64!"; \ + echo " Fedora: sudo dnf install mingw64-headers"; \ + echo ""; exit 1; } + @(command -v wget >/dev/null 2>&1 || command -v curl >/dev/null 2>&1) || { \ + echo "ОШИБКА: требуется wget или curl"; exit 1; } + +# ── FFTW: скачать исходники → собрать double → собрать float ────────────────── + +fftw: fftw-double fftw-float + +# Шаг 1: скачать tarball +third_party/$(FFTW_TAR): + mkdir -p third_party + @echo ">>> Скачиваем FFTW $(FFTW_VERSION)..." + @if command -v wget >/dev/null 2>&1; then \ + wget -q --show-progress -O $@ "$(FFTW_URL)"; \ + else \ + curl -L --progress-bar -o $@ "$(FFTW_URL)"; \ + fi + +# Шаг 2: распаковать +$(FFTW_SRC)/configure: third_party/$(FFTW_TAR) + @echo ">>> Распаковываем FFTW..." + tar xf $< -C third_party/ + @touch $@ + +# Шаг 3a: configure для double precision +$(FFTW_BUILD_D)/Makefile: $(FFTW_SRC)/configure + mkdir -p $(FFTW_BUILD_D) + @echo ">>> Конфигурируем FFTW (double)..." + cd $(FFTW_BUILD_D) && $(FFTW_SRC)/configure $(FFTW_CONF_COMMON) + +# Шаг 4a: сборка и установка double precision +fftw-double: $(FFTW_LIB_D) +$(FFTW_LIB_D): $(FFTW_BUILD_D)/Makefile + @echo ">>> Собираем FFTW (double)..." + $(MAKE) -C $(FFTW_BUILD_D) install + +# Шаг 3b: configure для float precision (--enable-float) +$(FFTW_BUILD_F)/Makefile: $(FFTW_SRC)/configure + mkdir -p $(FFTW_BUILD_F) + @echo ">>> Конфигурируем FFTW (float)..." + cd $(FFTW_BUILD_F) && $(FFTW_SRC)/configure $(FFTW_CONF_COMMON) --enable-float + +# Шаг 4b: сборка и установка float precision +# Зависит от fftw-double чтобы install-шаги не конкурировали за prefix +fftw-float: $(FFTW_LIB_F) +$(FFTW_LIB_F): $(FFTW_BUILD_F)/Makefile $(FFTW_LIB_D) + @echo ">>> Собираем FFTW (float)..." + $(MAKE) -C $(FFTW_BUILD_F) install + +# ── Third-party библиотеки (кросс-компиляция) ───────────────────────────────── + +third-party: $(NR34_DEPS) + +$(RNNOISE_LIB): $(RNNOISE_OBJS) | $(OUTDIR) + $(AR) rv $@ $^ + $(RANLIB) $@ + +$(SPECBLEACH_LIB): $(SPECBLEACH_OBJS) | $(OUTDIR) + $(AR) rv $@ $^ + $(RANLIB) $@ + +# % в GNU make совпадает через '/', поэтому паттерн покрывает вложенные пути +$(OBJDIR)/rnnoise/%.o: $(RNNOISE_DIR)/%.c + @mkdir -p $(@D) + $(CC) $(CFLAGS) -I$(RNNOISE_DIR)/include -I$(RNNOISE_DIR)/src -c -o $@ $< + +$(OBJDIR)/specbleach/%.o: $(SPECBLEACH_DIR)/%.c | $(FFTW_LIB_D) + @mkdir -p $(@D) + $(CC) $(CFLAGS) -I$(FFTW_INST)/include \ + -I$(SPECBLEACH_DIR)/include -I$(SPECBLEACH_DIR)/src -I$(SPECBLEACH_DIR)/src/shared \ + -c -o $@ $< + +# ── Основная библиотека ─────────────────────────────────────────────────────── + +$(OUTDIR) $(OBJDIR): + mkdir -p $@ + +$(DLL): $(OBJS) $(NR34_DEPS) $(FFTW_LIB_D) $(FFTW_LIB_F) | $(OUTDIR) + @echo ">>> Линкуем $@..." + $(CC) -shared \ + -Wl,--out-implib,$(IMPLIB) \ + $(LDFLAGS) \ + -o $@ \ + $(OBJS) $(LINK_LIBS) + @cp $(FFTW_DLL_D) $(FFTW_DLL_F) $(OUTDIR)/ + @echo "" + @echo "=== Готово ===" + @echo " DLL: $(DLL)" + @echo " Import lib: $(IMPLIB)" + @echo " Заголовок: wdsp.h" + @echo "" + @echo " FFTW DLL скопированы в $(OUTDIR)/ — включите их в дистрибутив" + @echo " рядом с libwdsp.dll." + +$(STATIC_LIB): $(OBJS) | $(OUTDIR) + $(AR) rv $@ $(OBJS) + $(RANLIB) $@ + @echo "" + @echo "=== Готово ===" + @echo " Статическая: $(STATIC_LIB)" + @echo " Линкуйте приложение с:" + @echo " $(STATIC_LIB) $(NR34_DEPS)" + @echo " -L$(FFTW_INST)/lib -lfftw3 -lfftw3f -lavrt -lm" + +$(OBJDIR)/%.o: %.c | $(OBJDIR) $(FFTW_LIB_D) + $(COMPILE) -c -o $@ $< + +# ── Очистка ─────────────────────────────────────────────────────────────────── + +clean: + -rm -rf $(OBJDIR) $(OUTDIR) + +# distclean удаляет собранный и скачанный FFTW — при следующем запуске пересоберётся +distclean: clean + -rm -rf $(FFTW_INST) $(FFTW_SRC) third_party/$(FFTW_TAR) diff --git a/README.md b/README.md index 3887eb6..b513d91 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,18 @@ wdsp/ ├── org_openhpsdr_dsp_Wdsp.c/.h — JNI bridge ├── Makefile — host build (Linux / macOS) ├── Makefile.android — Android cross-build +├── Makefile.windows — Windows cross-build (MinGW-w64, runs on Linux) ├── java/ │ └── org/openhpsdr/dsp/Wdsp.java ├── third_party/ -│ ├── fftw/ — FFTW source (download manually, see below) +│ ├── fftw-3.3.11/ — FFTW source (downloaded automatically) +│ ├── fftw-win64/ — FFTW Windows binaries (downloaded automatically) │ ├── rnnoise/ — RNNoise noise suppression │ └── libspecbleach/ — spectral noise reduction ├── obj/ — object files (generated) -└── lib/ — built libraries (generated) +├── obj_win/ — Windows object files (generated) +├── lib/ — built libraries (generated) +└── lib_win/ — Windows libraries (generated) ``` --- @@ -81,20 +85,95 @@ make clean --- +## Windows build (кросс-компиляция с Linux) + +Сборка выполняется на Linux с помощью MinGW-w64. FFTW скачивается и собирается из исходников автоматически. + +### Зависимости + +```bash +# Arch +sudo pacman -S mingw-w64-gcc # тянет mingw-w64-headers автоматически + +# Debian / Ubuntu — нужен мета-пакет mingw-w64, а не только компилятор +sudo apt install mingw-w64 + +# Fedora +sudo dnf install mingw64-gcc # тянет mingw64-headers автоматически +``` + +Также нужен `wget` или `curl`. + +> **Debian/Ubuntu:** пакет `gcc-mingw-w64-x86-64` содержит только компилятор без Windows API заголовков — `Windows.h` не будет найден. Используйте `mingw-w64`. + +### Сборка + +```bash +# DLL + статическая библиотека (рекомендуется) +make -f Makefile.windows + +# Только DLL +make -f Makefile.windows dll + +# Только статическая библиотека +make -f Makefile.windows static +``` + +Результат в `lib_win/`: + +| Файл | Назначение | +|---|---| +| `libwdsp.dll` | DLL для Windows | +| `libwdsp.dll.a` | Import library для MinGW (`-lwdsp`) | +| `libwdsp.a` | Статическая библиотека | +| `libfftw3-3.dll` | Runtime dependency — распространять вместе с DLL | +| `libfftw3f-3.dll` | Runtime dependency — распространять вместе с DLL | + +### Линковка приложения + +**MinGW:** +```bash +gcc myapp.c -Llib_win -lwdsp -o myapp.exe +``` + +**MSVC** — переименовать `libwdsp.dll.a` в `libwdsp.lib` и подключить обычным образом. + +**Статически** (MinGW): +```bash +gcc myapp.c libwdsp.a third_party/rnnoise/librnnoise.a \ + third_party/libspecbleach/libspecbleach.a \ + -Lthird_party/fftw-win64 -lfftw3-3 -lfftw3f-3 -lavrt -lm -o myapp.exe +``` + +### Параметры + +| Переменная | По умолчанию | Описание | +|---|---|---| +| `MINGW_PREFIX` | `x86_64-w64-mingw32` | Префикс MinGW toolchain | +| `FFTW_VERSION` | `3.3.11` | Версия FFTW | +| `CFLAGS` | `-O3 -Wno-parentheses` | Флаги компилятора | + +```bash +make -f Makefile.windows MINGW_PREFIX=i686-w64-mingw32 # 32-bit Windows +``` + +### Очистка + +```bash +make -f Makefile.windows clean # артефакты сборки +make -f Makefile.windows distclean # + удалить скачанный FFTW +``` + +--- + ## Android build ### Prerequisites 1. **Android NDK** r23 or newer -2. **FFTW source** — download and extract into `third_party/fftw/`: +2. **Java compiler** — for building the `.class` file (Android Studio's JBR or any JDK) -```bash -wget https://www.fftw.org/fftw-3.3.10.tar.gz -tar xf fftw-3.3.10.tar.gz -mv fftw-3.3.10 third_party/fftw -``` - -3. **Java compiler** — for building the `.class` file (Android Studio's JBR or any JDK) +FFTW 3.3.11 скачивается и собирается автоматически. Чтобы использовать уже скачанный исходник, передайте `FFTW_SRC=/path/to/fftw-3.3.11`. ### Build @@ -144,8 +223,8 @@ make -f Makefile.android \ ### Clean ```bash -make -f Makefile.android clean -# removes obj/android/ and lib/android/ +make -f Makefile.android clean # удаляет obj/android/ и lib/android/ +make -f Makefile.android distclean # + удаляет скачанный FFTW ``` --- diff --git a/comm.h b/comm.h index 2477e36..796ad85 100644 --- a/comm.h +++ b/comm.h @@ -33,7 +33,7 @@ warren@wpratt.com #endif #ifdef _WIN32 -#include +#include #include #include #endif @@ -43,6 +43,11 @@ warren@wpratt.com #ifdef _WIN32 #include #endif + +#ifndef WDSP_FPE_GUARD +#define WDSP_FPE_GUARD ((void)0) +#define WDSP_FPE_RESTORE ((void)0) +#endif #include "fftw3.h" #include "amd.h" diff --git a/third_party/libspecbleach/libspecbleach.a b/third_party/libspecbleach/libspecbleach.a deleted file mode 100644 index 76e3ab4..0000000 Binary files a/third_party/libspecbleach/libspecbleach.a and /dev/null differ diff --git a/third_party/libspecbleach/src/processors/adaptivedenoiser/adaptive_denoiser.o b/third_party/libspecbleach/src/processors/adaptivedenoiser/adaptive_denoiser.o deleted file mode 100644 index 462cdbb..0000000 Binary files a/third_party/libspecbleach/src/processors/adaptivedenoiser/adaptive_denoiser.o and /dev/null differ diff --git a/third_party/libspecbleach/src/processors/specbleach_adenoiser.o b/third_party/libspecbleach/src/processors/specbleach_adenoiser.o deleted file mode 100644 index c3ffb4d..0000000 Binary files a/third_party/libspecbleach/src/processors/specbleach_adenoiser.o and /dev/null differ diff --git a/third_party/libspecbleach/src/processors/specbleach_denoiser.o b/third_party/libspecbleach/src/processors/specbleach_denoiser.o deleted file mode 100644 index 6b8734d..0000000 Binary files a/third_party/libspecbleach/src/processors/specbleach_denoiser.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/gain_estimation/gain_estimators.o b/third_party/libspecbleach/src/shared/gain_estimation/gain_estimators.o deleted file mode 100644 index 89ea85b..0000000 Binary files a/third_party/libspecbleach/src/shared/gain_estimation/gain_estimators.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/noise_estimation/adaptive_noise_estimator.o b/third_party/libspecbleach/src/shared/noise_estimation/adaptive_noise_estimator.o deleted file mode 100644 index ec8beca..0000000 Binary files a/third_party/libspecbleach/src/shared/noise_estimation/adaptive_noise_estimator.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/post_estimation/noise_floor_manager.o b/third_party/libspecbleach/src/shared/post_estimation/noise_floor_manager.o deleted file mode 100644 index d22dee7..0000000 Binary files a/third_party/libspecbleach/src/shared/post_estimation/noise_floor_manager.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/post_estimation/postfilter.o b/third_party/libspecbleach/src/shared/post_estimation/postfilter.o deleted file mode 100644 index b11e7bc..0000000 Binary files a/third_party/libspecbleach/src/shared/post_estimation/postfilter.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/post_estimation/spectral_whitening.o b/third_party/libspecbleach/src/shared/post_estimation/spectral_whitening.o deleted file mode 100644 index 3e9e7af..0000000 Binary files a/third_party/libspecbleach/src/shared/post_estimation/spectral_whitening.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/pre_estimation/absolute_hearing_thresholds.o b/third_party/libspecbleach/src/shared/pre_estimation/absolute_hearing_thresholds.o deleted file mode 100644 index 8922f38..0000000 Binary files a/third_party/libspecbleach/src/shared/pre_estimation/absolute_hearing_thresholds.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/pre_estimation/critical_bands.o b/third_party/libspecbleach/src/shared/pre_estimation/critical_bands.o deleted file mode 100644 index a28c8db..0000000 Binary files a/third_party/libspecbleach/src/shared/pre_estimation/critical_bands.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/pre_estimation/masking_estimator.o b/third_party/libspecbleach/src/shared/pre_estimation/masking_estimator.o deleted file mode 100644 index 198bac3..0000000 Binary files a/third_party/libspecbleach/src/shared/pre_estimation/masking_estimator.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/pre_estimation/noise_scaling_criterias.o b/third_party/libspecbleach/src/shared/pre_estimation/noise_scaling_criterias.o deleted file mode 100644 index 79a95a6..0000000 Binary files a/third_party/libspecbleach/src/shared/pre_estimation/noise_scaling_criterias.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/pre_estimation/spectral_smoother.o b/third_party/libspecbleach/src/shared/pre_estimation/spectral_smoother.o deleted file mode 100644 index 6e79fc3..0000000 Binary files a/third_party/libspecbleach/src/shared/pre_estimation/spectral_smoother.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/pre_estimation/transient_detector.o b/third_party/libspecbleach/src/shared/pre_estimation/transient_detector.o deleted file mode 100644 index d7789dc..0000000 Binary files a/third_party/libspecbleach/src/shared/pre_estimation/transient_detector.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/stft/fft_transform.o b/third_party/libspecbleach/src/shared/stft/fft_transform.o deleted file mode 100644 index 67de3f4..0000000 Binary files a/third_party/libspecbleach/src/shared/stft/fft_transform.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/stft/stft_buffer.o b/third_party/libspecbleach/src/shared/stft/stft_buffer.o deleted file mode 100644 index affbe7c..0000000 Binary files a/third_party/libspecbleach/src/shared/stft/stft_buffer.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/stft/stft_processor.o b/third_party/libspecbleach/src/shared/stft/stft_processor.o deleted file mode 100644 index d84cf06..0000000 Binary files a/third_party/libspecbleach/src/shared/stft/stft_processor.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/stft/stft_windows.o b/third_party/libspecbleach/src/shared/stft/stft_windows.o deleted file mode 100644 index 3bce110..0000000 Binary files a/third_party/libspecbleach/src/shared/stft/stft_windows.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/utils/denoise_mixer.o b/third_party/libspecbleach/src/shared/utils/denoise_mixer.o deleted file mode 100644 index ee3b61d..0000000 Binary files a/third_party/libspecbleach/src/shared/utils/denoise_mixer.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/utils/general_utils.o b/third_party/libspecbleach/src/shared/utils/general_utils.o deleted file mode 100644 index e4d39e3..0000000 Binary files a/third_party/libspecbleach/src/shared/utils/general_utils.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/utils/spectral_features.o b/third_party/libspecbleach/src/shared/utils/spectral_features.o deleted file mode 100644 index 16521c2..0000000 Binary files a/third_party/libspecbleach/src/shared/utils/spectral_features.o and /dev/null differ diff --git a/third_party/libspecbleach/src/shared/utils/spectral_utils.o b/third_party/libspecbleach/src/shared/utils/spectral_utils.o deleted file mode 100644 index 74687b4..0000000 Binary files a/third_party/libspecbleach/src/shared/utils/spectral_utils.o and /dev/null differ diff --git a/third_party/rnnoise/librnnoise.a b/third_party/rnnoise/librnnoise.a deleted file mode 100644 index 49be887..0000000 Binary files a/third_party/rnnoise/librnnoise.a and /dev/null differ diff --git a/third_party/rnnoise/src/celt_lpc.o b/third_party/rnnoise/src/celt_lpc.o deleted file mode 100644 index c98d145..0000000 Binary files a/third_party/rnnoise/src/celt_lpc.o and /dev/null differ diff --git a/third_party/rnnoise/src/denoise.o b/third_party/rnnoise/src/denoise.o deleted file mode 100644 index 4736b43..0000000 Binary files a/third_party/rnnoise/src/denoise.o and /dev/null differ diff --git a/third_party/rnnoise/src/kiss_fft.o b/third_party/rnnoise/src/kiss_fft.o deleted file mode 100644 index 851847d..0000000 Binary files a/third_party/rnnoise/src/kiss_fft.o and /dev/null differ diff --git a/third_party/rnnoise/src/nnet.o b/third_party/rnnoise/src/nnet.o deleted file mode 100644 index a7e6f71..0000000 Binary files a/third_party/rnnoise/src/nnet.o and /dev/null differ diff --git a/third_party/rnnoise/src/nnet_default.o b/third_party/rnnoise/src/nnet_default.o deleted file mode 100644 index a4e89ff..0000000 Binary files a/third_party/rnnoise/src/nnet_default.o and /dev/null differ diff --git a/third_party/rnnoise/src/parse_lpcnet_weights.o b/third_party/rnnoise/src/parse_lpcnet_weights.o deleted file mode 100644 index 6334df0..0000000 Binary files a/third_party/rnnoise/src/parse_lpcnet_weights.o and /dev/null differ diff --git a/third_party/rnnoise/src/pitch.o b/third_party/rnnoise/src/pitch.o deleted file mode 100644 index 1f86cac..0000000 Binary files a/third_party/rnnoise/src/pitch.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnn.o b/third_party/rnnoise/src/rnn.o deleted file mode 100644 index 0800175..0000000 Binary files a/third_party/rnnoise/src/rnn.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_data.o b/third_party/rnnoise/src/rnnoise_data.o deleted file mode 100644 index dbab3b9..0000000 Binary files a/third_party/rnnoise/src/rnnoise_data.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_data_1.o b/third_party/rnnoise/src/rnnoise_data_1.o deleted file mode 100644 index 00d42ba..0000000 Binary files a/third_party/rnnoise/src/rnnoise_data_1.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_data_2.o b/third_party/rnnoise/src/rnnoise_data_2.o deleted file mode 100644 index ace9429..0000000 Binary files a/third_party/rnnoise/src/rnnoise_data_2.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_data_3.o b/third_party/rnnoise/src/rnnoise_data_3.o deleted file mode 100644 index 4e786e5..0000000 Binary files a/third_party/rnnoise/src/rnnoise_data_3.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_data_4.o b/third_party/rnnoise/src/rnnoise_data_4.o deleted file mode 100644 index 62aa121..0000000 Binary files a/third_party/rnnoise/src/rnnoise_data_4.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_data_5.o b/third_party/rnnoise/src/rnnoise_data_5.o deleted file mode 100644 index ad91f72..0000000 Binary files a/third_party/rnnoise/src/rnnoise_data_5.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_data_6.o b/third_party/rnnoise/src/rnnoise_data_6.o deleted file mode 100644 index 7901f58..0000000 Binary files a/third_party/rnnoise/src/rnnoise_data_6.o and /dev/null differ diff --git a/third_party/rnnoise/src/rnnoise_tables.o b/third_party/rnnoise/src/rnnoise_tables.o deleted file mode 100644 index 363ae4b..0000000 Binary files a/third_party/rnnoise/src/rnnoise_tables.o and /dev/null differ