Rockchip · AI & Linux Hub

Android и BSP

Руководство разработчика Android Multi Audio Rockchip

Руководство разработчика Android Multi Audio Rockchip — V1.0.0

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

Полный технический текст китайского RK-KF-YF-320 V1.0.0 от 8 страниц. Применимость по источнику: все чипы и версии ядра, Android 12; это исторический охват, не текущая гарантия совместимости. Есть только китайский источник, английских оригинальных рисунков нет. Растровых иллюстраций и технических таблиц нет; коммиты, дерево патчей, конфигурации, примеры API и журналы редактируемы. Исключены юридические/контактные страницы, аудитория, история изменений и повторное оглавление. Примеры, патчи и аппаратные тесты не выполнялись.

Сохранённые вопросы источника: дата обложки раньше некоторых коммитов May 2022; двоичные комментарии PRIMARY=57 и SPDIF_1=89 не совпадают с десятичными значениями; frameworks/avmedia не содержит обычного разделителя; ссылка «3.1» не имеет соответствующего нумерованного заголовка. Хэши, значения и даты не исправляются по догадке. Порядок вызовов, карта выходов и пояснение пути вынесены из серого блока в переведённый текст. Патчи — исходные фрагменты с переносами, не проверенные готовые к применению файлы. MultiAudioTest и focusChangeHint = 3 меняют маршрутизацию/аудиофокус; требуется проверка политики продукта, это не серийные настройки по умолчанию.

Предпосылки

Android по умолчанию смешивает одновременно работающие AudioTrack. Даже при нескольких звуковых картах нет готового интерфейса для одновременного раздельного вывода: AudioPolicy выбирает карту высшего приоритета по заданной политике. Android определяет разные типы устройств, но исходный код не различает несколько карт одного типа, например HDMI. RK разработала MultiAudio для рационального использования карт и улучшения работы пользователя.

RK MultiAudio

MultiAudio определяет подключение/отключение нескольких HDMI/DP.

Возможности: разделение звука PRIMARY/HDMI/SPDIF; раздельные выходы HDMI_0/HDMI_1/…/HDMI_N и DP_0/DP_1/…/DP_N; выбор карты для стороннего проигрывателя по имени пакета; выбор карты через Java-интерфейс. Используйте по потребностям.

Необходимый код SDK

system/media

commit 6c0705147c3f3e80d469096eead9bfd23dee7c69 (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Mon Nov 29 10:21:17 2021 +0800

    Audio: Add define for hdmi/hdmi_1/spdif/spdif_1

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I2862278abf20de0e51417564a5e6c15b2b32faed

frameworks/av

commit d239c978d8b4edfbce0dbaad9a89f7460644b0a9 (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Wed Apr 27 11:20:27 2022 +0800

    MultiAudio: Add route for output of spdif/hdmi/spdif_1/hdmi_1

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I8c24e894682bdb44243d03d5df4f7acd148d307b

frameworks/base

commit ab4cdd3f83534908b6523d006cf1edc1e33d5396 (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Wed Apr 27 10:48:57 2022 +0800

    Audio: add multiaudio support for tablet

    1. add support for hdmi_1/spdif_1
    2. add plug in/out uevent support for hdmi/hdmi_1/spdif/spdif_1
    3. fix volume ajust and save

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I7c09273791fe95c8853c70b9cd22cace424cc28b

device/rockchip/common

commit eb55d8057b2505ba3adc640e65a23d026f1843e3 (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Mon Nov 29 10:13:49 2021 +0800

    add multiaudio support for tablet

    1. audio_policy: separate hdmi and spdif from primary
    2. audio_policy: add support for hdmi_1 and spdif_1
    3. automake for hdmi/spdif/hdmi_1/spdif_1 hal

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I8a5c7287d6abf14d90eea2ed6d4e8d762e0a667c

vendor/rockchip/common

commit efacda0a974fad003eb5d9e08de44642c49a7d8f (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Thu Apr 28 11:28:49 2022 +0800

    vpu: librkmultiaudio: add init version

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I2d3a4973f964c7c8379fa281dedde7bf7b05f3a9

hardware/interfaces

commit 6d6bdc031705c0560d20bac28ae3cfd758763bc8 (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Wed Apr 27 11:15:20 2022 +0800

    Audio: Add spdif/hdmi/hdmi_1/spdif_1 in devicefactory

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I65802c82f85133cd4a10a78149210bba6f7ca986

hardware/rockchip/audio

commit 0ea8e9bb709a7cd576bfe585b60f97b9b250001f (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Thu May 12 16:09:57 2022 +0800

    [MultiAudio]: Add multiaudio support for tablet sdk

    Separating HDMI0/HDMI1/DP0/DP1 to their own hal modules so that they
    can work independently at the same time

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I519802684fb09602954bfdea115a3de891667859

build/make

commit 0a3eb78a77087fffbc3a3e0e45f005661efcf4b1 (HEAD)
Author: shine.liu <shine.liu@rock-chips.com>
Date:   Wed May 11 09:58:00 2022 +0800

    envsetup: Add BOARD_SUPPORT_MULTIAUDIO env definitions

    Signed-off-by: shine.liu <shine.liu@rock-chips.com>
    Change-Id: I2adc1b3fc79ff88eb9a4284a4956f1e341c2e7cf

По исходному документу код включён в RK Android 12 SDK. Синхронизируйте код и проверьте наличие перечисленных коммитов.

Патчи

Если синхронизация неудобна, примените следующие патчи в соответствующих каталогах.

➜  patch tree
.
├── build
│   └── make
│       └── 0001-envsetup-Add-BOARD_SUPPORT_MULTIAUDIO-env-definition.patch
├── device
│   └── rockchip
│       └── common
│           └── 0001-add-multiaudio-support-for-tablet.patch
├── frameworks
│   ├── av
│   │   └── 0001-MultiAudio-Add-route-for-output-of-spdif-hdmi-spdif_.patch
│   └── base
│       └── 0001-Audio-add-multiaudio-support-for-tablet.patch
├── hardware
│   ├── interfaces
│   │   └── 0001-Audio-Add-spdif-hdmi-hdmi_1-spdif_1-in-devicefactory.patch
│   └── rockchip
│       └── audio
│           └── 0001-MultiAudio-Add-multiaudio-support-for-tablet-sdk.patch
├── system
│   └── media
│       └── 0001-Audio-Add-define-for-hdmi-hdmi_1-spdif-spdif_1.patch
└── vendor
    └── rockchip
        └── common
            └── 0001-vpu-librkmultiaudio-add-init-version.patch

Переключатель сборки

MultiAudio включён в SDK по умолчанию. Для отключения измените BOARD_SUPPORT_MULTIAUDIO в device/rockchip/common.

diff --git a/BoardConfig.mk b/BoardConfig.mk
index 0ddef35..858698f 100755
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -412,7 +412,7 @@ BOARD_USER_FAKETOUCH ?= true
 endif

 ifeq ($(TARGET_BOARD_PLATFORM_PRODUCT), tablet)
-BOARD_SUPPORT_MULTIAUDIO ?= true
+BOARD_SUPPORT_MULTIAUDIO ?= false
 endif

 #for Camera autofocus support

Использование и тестирование

Выбор звуковой карты управляется AudioSessionId:

typedef enum {
    PRIMARY        = 57,//1110001
    HDMI           = 65,//1000001 //hdmi0
    SPDIF          = 73,//1001001 //dp0
    HDMI_1         = 81,//1010001 //hdmi1
    SPDIF_1        = 89,//1111001 //dp1
}multi_audio_device_t;

Вызов Java-интерфейса

MediaPlayer mp = new MediaPlayer();
mp.setAudioSessionId(audioSessionId);
mp.setDataSource(...);

Вызовите setAudioSessionId до setDataSource. Выходы: 57 = speaker, 65 = hdmi, 73 = dp, 81 = hdmi_1, 89 = dp_1.

Выбор по имени пакета приложения: патчи содержат тестовые примеры. Для проверки включите MultiAudioTest в frameworks/av.

diff --git a/media/libaudioclient/include/media/AudioTrack.h
b/media/libaudioclient/include/media/AudioTrack.h
index 53b0be725e..b46a941fe3 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -35,7 +35,7 @@
 #include "android/media/IAudioTrack.h"
 #include "android/media/IAudioTrackCallback.h"

-#define MultiAudioTest 0
+#define MultiAudioTest 1
 namespace android {

 using content::AttributionSourceState;

RockVideoPlayer и gallery3d встроены. Дополнительно установите сторонний mxplayer и приложение multi-display; установщики входят в пакет патчей. Тест связывает приложения с картами: звук видео RockVideoPlayer идёт через hdmi, gallery3d — hdmi_1, mxplayer — speaker. Возможно одновременное воспроизведение.

Источник указывает путь реализации frameworks/avmedia/libaudioclient/AudioTrack.cpp. Адаптируйте код под свои задачи.

#if MultiAudioTest
            String8 tmp = String8(mPackageName);
            if (strstr(tmp.string(), "RockVideoPlayer")) {
                sessionid = (audio_session_t)65;
            } else if (strstr(tmp.string(), "gallery3d")) {
                sessionid = (audio_session_t)81;
            } else if (strstr(tmp.string(), "mxtech")) {
                sessionid = (audio_session_t)57;
            }
#endif

Через multi-display разместите приложения на разных экранах. Задайте следующее свойство для перемещения мыши между экранами и управления воспроизведением.

setprop sys.mouse.presentation 1

Аудиофокус Android может приостанавливать видео при одновременной работе приложений на нескольких экранах. Для этого приведён патч frameworks/base:

diff --git
a/services/core/java/com/android/server/audio/MediaFocusControl.java
b/services/core/java/com/android/server/audio/MediaFocusControl.java
index 9548ada14b8e..d82eb3311aeb 100644
--- a/services/core/java/com/android/server/audio/MediaFocusControl.java
+++ b/services/core/java/com/android/server/audio/MediaFocusControl.java
@@ -899,6 +899,7 @@ public class MediaFocusControl implements
PlayerFocusEnforcer {
                     + " flags=0x" + Integer.toHexString(flags)
                     + " sdk=" + sdk))
                 .printLog(TAG));
+        focusChangeHint = 3;
         // we need a valid binder callback for clients
         if (!cb.pingBinder()) {
             Log.e(TAG, " AudioFocus DOA client for requestAudioFocus(),
aborting.");

Отладка

Просмотр звуковых карт

cat proc/asound/cards
rk3588_s:/ # cat proc/asound/cards

 0 [rockchipes8388 ]: rockchip-es8388 - rockchip-es8388
                      rockchip-es8388
 1 [rockchiphdmiin ]: rockchip_hdmiin - rockchip,hdmiin
                      rockchip,hdmiin
 2 [rockchiphdmi0  ]: rockchip-hdmi0 - rockchip-hdmi0
                      rockchip-hdmi0
 3 [rockchiphdmi1  ]: rockchip-hdmi1 - rockchip-hdmi1
                      rockchip-hdmi1

Проверка драйвера

Для проверки hdmi0 RK3588, на который источник ссылается как на раздел 3.1, возьмите WAV-файл и выполните:

tinyplay xxx.wav -D 2 -d 0

Нормальный звук указывает на работу драйвера звуковой карты hdmi0.

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