Skip to content

monosyde/modio

Repository files navigation

modio

Объединение mesh-audio и apo-profile-switcher в одно приложение с улучшенной синхронизацией и встроенными EQ-профилями.

Что внутри

  • VB-Cable — установка/проверка/статус источника по умолчанию + одна кнопка «сделать VB-Cable источником» (через IPolicyConfig::SetDefaultEndpoint).
  • EqualizerAPO — авто-детект через реестр + кнопка «Установить EqualizerAPO» (если не обнаружен).
  • Колонки — выбор устройств для зеркалирования + per-device trim громкости + per-device offset + ★ кнопка «сделать default» на каждом устройстве.
  • EqualizerAPO профили — 10 встроенных профилей (Bass Boost, Classic, JBL Punch, …) + опционально папка пользователя.
  • Синхронизация — Global delay, Ring buffer, Warmup, Stability mode, Auto adjust + 8 пресетов (включая BT Rock Stable).
  • Метрики — статус источника, заполнение буфера, число корректировок, master volume.
  • Тёмная/светлая тема (запоминается в localStorage).

Портативность

  • Все 10 EQ-профилей зашиты в бинарь через include_str!. Никаких внешних файлов рядом с .exe.
  • EqualizerAPO путь определяется автоматически:
    1. Реестр HKLM\SOFTWARE\EqualizerAPO (InstallLocation / InstallPath).
    2. %ProgramFiles%\EqualizerAPO\config, %ProgramFiles(x86)%\EqualizerAPO\config.
    3. Fallback на C:\Program Files\EqualizerAPO\config.
    4. Можно переопределить через UI (раздел EQ профили → ▼ → Choose EqualizerAPO config).
  • modio.exe пишет config.txt напрямую в найденную папку EqualizerAPO. Контент профилей инлайнится — никаких Include: на внешние файлы. Установка модуля в любой каталог.
  • Состояние modio (выбранные профили, настройки) хранится в %LOCALAPPDATA%\modio\modio.json.

Синхронизация: Continuous SRC через IAudioClock + rubato

Старая реактивная схема (discrete skip/inject когда ring buffer уходит от target'а) заменена на непрерывное rate-matched resampling:

  1. На каждое render-устройство навешивается IAudioClock. Каждые 200 ms берётся GetPosition (frames played + QPC timestamp в 100-наносекундных тиках) — это даёт реальную скорость устройства в кадрах на wallclock-секунду.
  2. Per-device resampler (rubato::FastFixedIn, полиномиальная интерполяция, 480-сэмпловые input-чанки) удерживается на ratio = device_rate / source_rate с EMA-сглаживанием (α=0.3). Изменения ratio применяются с ramp'ом — без щелчков.
  3. Source audio из ring buffer → resampler → WASAPI render. Каждое устройство получает РОВНО столько кадров в секунду, сколько физически потребляет.

Почему это лечит «через половину песни разъезжается»:

  • Дискретных коррекций больше нет → нет относительных фазовых сдвигов между колонками, которые накапливались в старой схеме (каждый skip = микро-десинк).
  • Resampler непрерывно компенсирует расхождение часов на сотые доли процента (типичный BT drift укладывается в ±0.1%, далеко от max_relative=1.10).
  • Дрейф BT-кодека (динамический рост latency из-за качества линка) не виден через WASAPI buffer fill, но виден через IAudioClock как изменение device_rate → resampler реагирует автоматически.

Fallback: если у устройства нет IAudioClock или формат не Float32, mirror идёт сырыми байтами без resampling (как в старой схеме без auto-adjust). В логе будет видна причина.

UI-control'ы (Stability mode, Auto adjust, BT Stable и прочие пресеты) остались для обратной совместимости команд, но не влияют на runtime — SRC работает всегда.

Громкость по-прежнему: effective_session_volume = master × per-device trim, master опрашивается через IAudioEndpointVolume каждые 220 ms.

Сборка

npm install
npm run tauri:build

Артефакты:

  • src-tauri/target/release/modio.exe — портативный exe (≈2.6 MB).
  • src-tauri/target/release/bundle/msi/modio_1.0.0_x64_en-US.msi — MSI установщик.
  • src-tauri/target/release/bundle/nsis/modio_1.0.0_x64-setup.exe — NSIS установщик.

Запуск в dev режиме

npm run tauri:dev

Локализация

src/i18n.ts — два словаря (ru/en), переключение через setLocale('en'). По умолчанию — русский.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors