Полный технический текст китайского 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.
