diff --git a/.codex b/.codex
deleted file mode 100644
index e69de29..0000000
diff --git a/ewsdr.lpi b/ewsdr.lpi
index 36ed465..5e963e2 100644
--- a/ewsdr.lpi
+++ b/ewsdr.lpi
@@ -17,9 +17,9 @@
-
+
-
+
@@ -115,6 +115,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/native/dmr/CMakeLists.txt b/native/dmr/CMakeLists.txt
deleted file mode 100644
index 1db80f9..0000000
--- a/native/dmr/CMakeLists.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-cmake_minimum_required(VERSION 3.10)
-project(ewsdr_dmr C)
-
-find_path(MBELIB_INCLUDE_DIR mbelib.h REQUIRED)
-find_library(MBELIB_LIBRARY NAMES mbe REQUIRED)
-
-add_library(ewsdr_dmr SHARED ewsdr_dmr.c)
-target_compile_definitions(ewsdr_dmr PRIVATE EWSDR_DMR_BUILD)
-target_include_directories(ewsdr_dmr
- PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
- PRIVATE ${MBELIB_INCLUDE_DIR})
-target_link_libraries(ewsdr_dmr PRIVATE ${MBELIB_LIBRARY})
-set_target_properties(ewsdr_dmr PROPERTIES
- C_VISIBILITY_PRESET hidden
- VISIBILITY_INLINES_HIDDEN YES)
-
-include(GNUInstallDirs)
-install(TARGETS ewsdr_dmr
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
-install(FILES ewsdr_dmr.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/native/dmr/README.md b/native/dmr/README.md
deleted file mode 100644
index e2713f5..0000000
--- a/native/dmr/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# EWSDR DMR native adapter
-
-This optional shared library isolates `mbelib` and the imported DMR core from
-the Lazarus application. It intentionally does not depend on PulseAudio,
-ncurses, libsndfile or the DSD-FME command-line frontend.
-
-Build on Linux:
-
-```sh
-cmake -S native/dmr -B build/dmr -DCMAKE_BUILD_TYPE=Release
-cmake --build build/dmr
-```
-
-The Pascal burst/FEC layer extracts three row-major `char[4][24]` AMBE+2
-frames from each selected voice-slot burst and feeds them through this ABI.
-Decoded 8 kHz mono PCM is resampled to EWSDR's 48 kHz speaker/web route.
-
-For a build-tree run, either copy `libewsdr_dmr.so` beside the EWSDR executable
-or add `build/dmr` to `LD_LIBRARY_PATH`. `cmake --install build/dmr` installs the
-adapter system-wide. The GUI and daemon remain usable (with metadata but no
-voice) when this optional library is absent.
diff --git a/native/dmr/ewsdr_dmr.c b/native/dmr/ewsdr_dmr.c
deleted file mode 100644
index f60fd76..0000000
--- a/native/dmr/ewsdr_dmr.c
+++ /dev/null
@@ -1,86 +0,0 @@
-#include "ewsdr_dmr.h"
-
-#include
-#include
-#include
-
-struct ewsdr_dmr_mbe {
- mbe_parms current;
- mbe_parms previous;
- mbe_parms previous_enhanced;
- int uv_quality;
-};
-
-uint32_t ewsdr_dmr_abi_version(void)
-{
- return EWSDR_DMR_ABI_VERSION;
-}
-
-void ewsdr_dmr_mbe_reset(ewsdr_dmr_mbe *decoder)
-{
- if (decoder == NULL)
- return;
- mbe_initMbeParms(&decoder->current, &decoder->previous,
- &decoder->previous_enhanced);
-}
-
-ewsdr_dmr_mbe *ewsdr_dmr_mbe_create(int uv_quality)
-{
- ewsdr_dmr_mbe *decoder = calloc(1, sizeof(*decoder));
- if (decoder == NULL)
- return NULL;
- if (uv_quality < 1)
- uv_quality = 1;
- if (uv_quality > 64)
- uv_quality = 64;
- decoder->uv_quality = uv_quality;
- ewsdr_dmr_mbe_reset(decoder);
- return decoder;
-}
-
-void ewsdr_dmr_mbe_destroy(ewsdr_dmr_mbe *decoder)
-{
- if (decoder == NULL)
- return;
- memset(decoder, 0, sizeof(*decoder));
- free(decoder);
-}
-
-int ewsdr_dmr_mbe_decode(ewsdr_dmr_mbe *decoder,
- const uint8_t ambe_bits[EWSDR_DMR_AMBE_BITS],
- float pcm_out[EWSDR_DMR_PCM_SAMPLES],
- ewsdr_dmr_mbe_result *result)
-{
- char frame[4][24];
- char data[49];
- char error_text[64];
- int errors_c0 = 0;
- int errors_total = 0;
- size_t row;
- size_t col;
-
- if (decoder == NULL || ambe_bits == NULL || pcm_out == NULL)
- return -1;
-
- for (row = 0; row < 4; ++row) {
- for (col = 0; col < 24; ++col) {
- const uint8_t bit = ambe_bits[row * 24 + col];
- if (bit > 1)
- return -2;
- frame[row][col] = (char)bit;
- }
- }
-
- memset(data, 0, sizeof(data));
- memset(error_text, 0, sizeof(error_text));
- mbe_processAmbe3600x2450Framef(
- pcm_out, &errors_c0, &errors_total, error_text, frame, data,
- &decoder->current, &decoder->previous, &decoder->previous_enhanced,
- decoder->uv_quality);
-
- if (result != NULL) {
- result->errors_c0 = errors_c0;
- result->errors_total = errors_total;
- }
- return 0;
-}
diff --git a/native/dmr/ewsdr_dmr.h b/native/dmr/ewsdr_dmr.h
deleted file mode 100644
index 6120f44..0000000
--- a/native/dmr/ewsdr_dmr.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef EWSDR_DMR_H
-#define EWSDR_DMR_H
-
-#include
-#include
-
-#if defined(_WIN32)
-# if defined(EWSDR_DMR_BUILD)
-# define EWSDR_DMR_API __declspec(dllexport)
-# else
-# define EWSDR_DMR_API __declspec(dllimport)
-# endif
-#else
-# define EWSDR_DMR_API __attribute__((visibility("default")))
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define EWSDR_DMR_ABI_VERSION 1u
-#define EWSDR_DMR_AMBE_BITS 96u
-#define EWSDR_DMR_PCM_SAMPLES 160u
-
-typedef struct ewsdr_dmr_mbe ewsdr_dmr_mbe;
-
-typedef struct ewsdr_dmr_mbe_result {
- int errors_c0;
- int errors_total;
-} ewsdr_dmr_mbe_result;
-
-EWSDR_DMR_API uint32_t ewsdr_dmr_abi_version(void);
-EWSDR_DMR_API ewsdr_dmr_mbe *ewsdr_dmr_mbe_create(int uv_quality);
-EWSDR_DMR_API void ewsdr_dmr_mbe_destroy(ewsdr_dmr_mbe *decoder);
-EWSDR_DMR_API void ewsdr_dmr_mbe_reset(ewsdr_dmr_mbe *decoder);
-
-/*
- * Decode one already deinterleaved DMR AMBE+2 frame. ambe_bits is a row-major
- * char[4][24] matrix containing only 0/1 values. pcm_out receives 160 float
- * samples at 8 kHz. Frame extraction/deinterleaving remains in the DMR burst
- * layer, keeping mbelib and its state behind this stable ABI.
- */
-EWSDR_DMR_API int ewsdr_dmr_mbe_decode(
- ewsdr_dmr_mbe *decoder,
- const uint8_t ambe_bits[EWSDR_DMR_AMBE_BITS],
- float pcm_out[EWSDR_DMR_PCM_SAMPLES],
- ewsdr_dmr_mbe_result *result);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif