Rockchip · AI & Linux Hub

Android и BSP

Руководство разработчика Android EQ/DRC Rockchip

Руководство разработчика Android EQ/DRC Rockchip — V1.1.0

· ArmSoM Editorial · Rockchip source documentation · 8 мин чтения

Полный технический текст китайского RK-KF-YF-774 V1.1.0 от : сборка, включение и параметры. Источник указывает все чипы и версии ядра; это не утверждение о текущей проверке совместимости. Есть только китайский источник, английских оригинальных рисунков и растровых иллюстраций здесь нет. Код, конфигурации и журналы редактируемы, исходные комментарии сохранены. Удалены юридические/контактные страницы, аудитория, история изменений и повторное оглавление. Команды, аудио- и аппаратные тесты не выполнялись.

Редакция и безопасность: восстановлены переносы UUID, многостраничного Java-примера и комментариев. Источник говорит о двух командах, но перечисляет три; сохранены все три. Имена equalizer/mEqualizer, написание channnel и списки предустановок сохранены. adb root, remount и setenforce 0 — только для разрешённой отладки userdebug; сохраните параметры, после тестов восстановите SELinux и не переносите отладочные настройки в серийный продукт.

1. Сборка

1.1 Найдите BoardConfig.mk проекта

Расположение BoardConfig.mk зависит от чипа и product, выбранного через lunch.

Пример: чип rk3588, product rk3588_u.

# echo $TARGET_PRODUCT
# rk3588_u

Тогда BoardConfig.mk расположен в device/rockchip/rk3588/rk3588_u/BoardConfig.mk.

1.2 Добавьте флаг сборки

Добавьте следующий флаг в BoardConfig.mk проекта для сборки hardware/rockchip/audio/eqdrc.

BOARD_USE_AUDIO_EQDRC := true

2. Включение

2.1 Объявление эффекта

Объявите EQ/DRC в frameworks/av/media/libeffects/data/audio_effects.xml.

<libraries>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <library name="rkeqdrc" path="librkeqdrc.so"/>
</libraries>
<effects>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <effect name="eqdrc" library="rkeqdrc" uuid="79fe72b2-4182-44c1-b2ea-0002a5d5c51b"/>
</effects>

2.2 Включение эффекта

Выберите способ привязки согласно требуемой области действия эффекта.

2.2.1 Динамическая привязка

Динамически привяжите EQ/DRC при создании MediaPlayer или AudioTrack. Это действует на отдельный аудиопоток.

import android.media.MediaPlayer;
import android.media.audiofx.RockchipEqualizer;

MediaPlayer mediaPlayer = new MediaPlayer();
RockchipEqualizer equalizer = new RockchipEqualizer(0,
mediaPlayer.getAudioSessionId());
equalizer.setEnabled(true);

2.2.2 Привязка Stream HAL

Задайте тип потока в audio_effects.xml. Это глобально действует на потоки выбранного типа, например выходные потоки music.

<!-- 如果没有声明 postprocess, 则直接添加下面的配置, 忽略下面的注释 -->
<postprocess>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <stream type="music">
        <apply effect="eqdrc"/>
    </stream>
</postprocess>

Можно привязать несколько типов выходных потоков.

<!-- 如果没有声明 postprocess, 则直接添加下面的配置, 忽略下面的注释 -->
<postprocess>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <stream type="music">
        <apply effect="eqdrc"/>
    </stream>
    <stream type="voice_call">
        <apply effect="eqdrc"/>
    </stream>
</postprocess>

Доступны следующие типы выходных потоков:

/** All output stream types which support effects.
 * This need to be kept in sync with the xsd streamOutputType.
 */
template <>
constexpr std::pair<audio_stream_type_t, const char*>
STREAM_NAME_MAP<audio_stream_type_t>[] = {
        {AUDIO_STREAM_VOICE_CALL, "voice_call"},
        {AUDIO_STREAM_SYSTEM, "system"},
        {AUDIO_STREAM_RING, "ring"},
        {AUDIO_STREAM_MUSIC, "music"},
        {AUDIO_STREAM_ALARM, "alarm"},
        {AUDIO_STREAM_NOTIFICATION, "notification"},
        {AUDIO_STREAM_BLUETOOTH_SCO, "bluetooth_sco"},
        {AUDIO_STREAM_ENFORCED_AUDIBLE, "enforced_audible"},
        {AUDIO_STREAM_DTMF, "dtmf"},
        {AUDIO_STREAM_TTS, "tts"},
        {AUDIO_STREAM_ASSISTANT, "assistant"},
};

2.3 Проверка

2.3.1 Проверка регистрации эффекта

Проверьте регистрацию объявленного эффекта в AudioFlinger командой dumpsys media.audio_flinger.

# dumpsys media.audio_flinger
[...]
Libraries loaded:
  path: /vendor/lib/soundfx/librkeqdrc.so
  EQ DRC / Rockchip Electronics Co. Ltd.
    UUID: 79fe72b2-4182-44c1-b2ea-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820204
[...]

2.3.2 Проверка привязки эффекта

Проверьте привязку эффекта к нужному выходному потоку. Запустите звук в Android-приложении и проверьте dumpsys media.audio_flinger.

# dumpsys media.audio_flinger
[...]
Output thread 0xb40000784395ba60, name AudioOut_D, tid 642, type 0 (MIXER):
  I/O handle: 13
  Standby: no
  [...]
  1 Effect Chains
    1 effects for session 49
        [...]
        Effect ID 11:
                Session State Registered Enabled Suspended:
                00049   003   y          y       n
                Descriptor:
                - UUID: 79fe72b2-4182-44c1-b2ea-0002a5d5c51b
                - TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
                - apiVersion: 00000000
                [...]
                - name: EQ DRC
                - implementor: Rockchip Electronics Co. Ltd.
                [...]
        Effect ID 11 HAL dump:
  [...]
[...]

3. Параметры

3.1 Файлы и каталоги параметров

3.1.1 Файлы параметров

Параметры по умолчанию хранятся в следующих двух двоичных файлах.

rkaudio_effect_eqdrc_44100hz_2ch.bin
rkaudio_effect_eqdrc_48000hz_2ch.bin

Поддерживаются и другие файлы предустановленных параметров.

rkaudio_effect_eqdrc_48000hz_2ch_classroom.bin
rkaudio_effect_eqdrc_48000hz_2ch_meeting.bin
rkaudio_effect_eqdrc_48000hz_2ch_standard.bin

3.1.2 Каталоги параметров

В SDK значения по умолчанию находятся в hardware/rockchip/audio/eqdrc/configs/ и устанавливаются в /vendor/etc/. В userdebug инструмент ПК отправляет файлы в /vendor/etc/. При стандартной конфигурации приложения (preset 0) параметры сохраняются в /data/vendor/audio/. При создании EQ/DRC сначала загружает параметры оттуда, а при отсутствии — из каталога по умолчанию.

3.2 Описание параметров

См. Rockchip_Developer_Audio_Effect_Tool.pdf.

3.3 Настройка параметров

Поддерживаются два способа: приложение и инструмент ПК. Выбирайте по необходимости.

3.3.1 Настройка своим приложением

Если EQ/DRC привязан в audio_effects.xml, этот экземпляр обрабатывает звук. Дополнительная привязка EQ/DRC из приложения служит каналом настройки параметров.

import android.media.MediaPlayer;
import android.media.audiofx.RockchipEqualizer;

MediaPlayer mediaPlayer = new MediaPlayer();
// 绑定
RockchipEqualizer equalizer = new RockchipEqualizer(0,
mediaPlayer.getAudioSessionId());
// 使能
equalizer.setEnabled(true);

Вызовите соответствующие API android.media.audiofx.RockchipEqualizer.Settings. Пример ниже задаёт параметры EQ.

// 获取所有配置
RockchipEqualizer.Settings settings = equalizer.getProperties();
// 使能 EQ10
settings.setEq10Enabled(1);

// 获取当前 EQ, 总共 2 channnel 的 EQ
Collection<RockchipEqualizer.Settings.Eq> eqs = settings.getEqs();
// 创建 EQ 迭代器
Iterator<RockchipEqualizer.Settings.Eq> eqsIterator = eqs.iterator();
// 遍历所有 channel 的 EQ
while (eqsIterator.hasNext()) {
    RockchipEqualizer.Settings.Eq eq = eqsIterator.next();
    Log.d(TAG, "eq: " + eq.toString());

    // 获取当前 channel 的 EQ 的所有 band 配置
    Collection<RockchipEqualizer.Settings.Eq.EqBand> eqBands = eq.getBands();
    // 创建 band 迭代器
    Iterator<RockchipEqualizer.Settings.Eq.EqBand> eqBandsIterator =
eqBands.iterator();
    // 遍历当前 channel 的 EQ 的所有 band 配置
    while (eqBandsIterator.hasNext()) {
        RockchipEqualizer.Settings.Eq.EqBand eqBand = eqBandsIterator.next();
        Log.d(TAG, "band: " + eqBand.toString());
        // 设置 band 参数, 具体可以看对应的 set API
        // eqBand.setBoost(0); 滤波器中心频率增益,单位 dB
        // eqBand.setFilter(0); 0 表示 Parametric,1 表示 LowShelf,2 表示 HighShelf,3 表示 GeneralLP,4 表示 GeneralHP
        // eqBand.setFc(0); 滤波器的中心频率,单位 Hz
        // eqBand.setQ(0); filter 为 Parametric 时,Q 为品质因数,范围为[0.01, 16]; filter 为 LowShelf/HighShelf时,Q 为Slope,范围为[0.01, 2]
        // eqBand.setEnabled(0); 是否启用该滤波器,1 表示启用,0 表示bypass
    }
}

// 更新配置
equalizer.setProperties(settings);

Можно загрузить готовую настройку. Без явного выбора используется “custom”; только она позволяет менять параметры выше.

mEqualizer.usePreset(0); // 使用 "custom" 预设
mEqualizer.usePreset(1); // 使用 "standard" 预设
mEqualizer.usePreset(2); // 使用 "meeting" 预设
mEqualizer.usePreset(3); // 使用 "classical" 预设
mEqualizer.usePreset(4); // 使用 "classroom" 预设

3.3.2 Настройка инструментом ПК

Для настройки с ПК нужны сборка userdebug и подключение устройства через adb.

1) Расположение инструмента. Обычно в SDK: RKTools/windows/AudioEffect_Tool.rar.

2) Дополнительные функции. load загружает параметры из любого каталога; save сохраняет текущие параметры; push через adb push отправляет их в /vendor/etc/ устройства; pull через adb pull сохраняет текущие параметры устройства в выбранный каталог. Подробности — Rockchip_Developer_Audio_Effect_Tool.pdf.

Примечание: push/pull используют имя rkaudio_effect_eqdrc_xhz_ych.bin, где x/y — частота дискретизации/число каналов инструмента.

3) Порядок настройки. Сначала выполните на ПК две следующие команды.

adb root
adb remount
adb shell setenforce 0

Откройте AudioEffect_tool.exe. SampleRate должен совпадать с rate текущего pcm_config в hardware/rockchip/audio/tinyalsa_hal/.

static struct pcm_config pcm_config = {
    // ...
    .rate = 48000,
    // ...
};

NumChan должен совпадать с channels текущего pcm_config в hardware/rockchip/audio/tinyalsa_hal/.

static struct pcm_config pcm_config = {
    .channels = 2,
    // ...
};

При необходимости нажмите pull для сохранения параметров устройства. Нажмите load и выберите каталог параметров. Воспроизведите звук в Android-приложении, настройте параметры и нажмите push. На устройстве logcat покажет журнал повторной загрузки параметров.

# logcat | grep eqdrc
06-19 07:33:12.286   714  2068 D eqdrc   : eqdrc_fx_process : reload profile
from tuner

Проверьте результат на слух или аудиотестером, например AP. Если результат устраивает, нажмите save и сохраните параметры в hardware/rockchip/audio/eqdrc/configs SDK; иначе повторите настройку.

Другие статьи по теме → · Учебные маршруты →