Каждый раз, когда пользователь жалуется в поддержку «эквалайзер не работает на моём Xiaomi», мы объясняем по сотой за неделю, почему это не наш баг и как это чинить. Решили положить весь технический бэкграунд в одну статью - для тех, кому любопытно, как звук в MUZLOO устроен на уровне фреймворка Android.
Мы не пишем DSP с нуля - и правильно делаем
MUZLOO не обрабатывает звук своими алгоритмами. Мы используем три класса из пакета android.media.audiofx: Equalizer, BassBoost и PresetReverb. Всё, что крутит пользователь в интерфейсе - это тонкая обёртка над системными эффектами Android. Почему так?
- Системные эффекты работают на уровне аудиомикшера ОС - производительнее и стабильнее любого самописного DSP.
- Автоматически применяются ко всем аудиопотокам в приложении, включая стриминг из VK CDN и локальные скачанные файлы.
- Уважают общесистемные настройки звука (Bluetooth-кодек, громкость, фокус).
- Легальны с точки зрения патентов на обработку звука - Google уже разобрался с лицензиями.
5 полос эквалайзера - но частоты плавают от устройства к устройству
Мы просим Android создать эквалайзер на 5 полос: Equalizer eq = new Equalizer(priority, audioSessionId);
Дальше мы узнаём центральные частоты черезeq.getCenterFreq(band). На большинстве устройств это 60 Hz / 230 Hz / 910 Hz / 3.6 kHz / 14 kHz - но на некоторых прошивках производители отклоняются на ±50-100 Hz. Поэтому на UI мы рисуем частоты, которые реально вернул твой телефон, а не хардкод.
Диапазон усиления тоже определяется системой:eq.getBandLevelRange() обычно отдаёт -1500...+1500 миллибел (это ±15 дБ). Слайдеры в MUZLOO мапятся на этот диапазон - так что «0» на нашем ползунке соответствует нейтральному уровню системного эквалайзера.
BassBoost - отдельный эффект, не первая полоса EQ
Это частый вопрос: зачем ручка BASS, если у эквалайзера уже есть полоса 60 Hz? Отвечаем:
- Первая полоса EQ - это точечное усиление в узкой полосе вокруг 60 Hz (обычно Q≈1.4). Добавляет суб-бас, но делает это хирургически.
BassBoost- этоbroadband-эффект, усиливает весь диапазон 60-200 Hz целиком с мягким падением АЧХ. Результат: звук «мясистее», без провала между суб-басом и mid-bass.
На практике BassBoost работает лучше для хип-хопа и электроники, первая полоса EQ - для вокала и акустики, где нужен аккуратный низ. В MUZLOO их можно комбинировать, они не конфликтуют.
«3D» - это реверберация, а не настоящий spatial audio
Честное признание: режим 3D в MUZLOO - этоPresetReverb с параметромPRESET_LARGEHALL. По-научному это не 3D, это эффект концертного зала - звук «разваливается» в стороны и кажется объёмнее. На наушниках работает хорошо, на колонке - почти незаметно (у колонок своя акустика помещения).
Настоящий spatial audio (который у Apple Music и Dolby Atmos) требует многоканального исходника и аппаратной поддержки. VK отдаёт стереофонию, так что максимум, что мы можем сделать честно - это пространственная реверберация. Называется «3D» по устоявшейся традиции в приложениях типа Poweramp и Neutron.
Почему эквалайзер молчит на Xiaomi, Samsung, Huawei
Самая частая жалоба. Дело не в нас, дело в фирменных аудио-эффектах производителя:
- Samsung Dolby Atmos - перехватывает системный аудиомикшер, ставит себя в цепочку эффектов последней. Любой сторонний EQ работает до Dolby, а тот его «сглаживает».
- Xiaomi Sound (на MIUI) - делает то же самое плюс применяет свой «Hi-Fi режим», который блокирует AudioEffects полностью.
- Huawei Histen - аналогично: свой аудиопайплайн, сторонние эффекты в молоко.
Единственное универсальное лечение - отключить фирменные звуковые эффекты в системных настройках телефона. После этого MUZLOO снова получает контроль над миксером. На некоторых прошивках (особенно китайских «лайт»-версий Android) AudioEffects не реализованы вовсе - и там мы не можем сделать ничего, только дописать это в FAQ.
Bluetooth-наушники: отдельная история
Bluetooth-кодеки SBC, AAC, aptX, LDAC часто вырезают эффекты при кодировании. Звук обрабатывается в ОС, но до наушников доходит уже сжатый стрим - и на стороне наушников DSP-чип может глушить низкоуровневые эффекты. Выход - либо проводные наушники для точной настройки, либо переключить Bluetooth-кодек в настройках разработчика Android (Developer options → Bluetooth Audio Codec).
Что дальше
В планах - добавить визуализатор спектра реального времени (черезVisualizer из того же пакета audiofx) и расширить количество полос до 10 на устройствах, которые это поддерживают. Следи за релизами в roadmap-секции FAQ.