Rockchip · AI & Linux Hub

Android und BSP

Rockchip Android Multi Audio Entwicklerhandbuch

Rockchip Android Multi Audio Entwicklerhandbuch — V1.0.0

· ArmSoM Editorial · Rockchip source documentation · 7 Min. Lesezeit

Vollständiger technischer Text der chinesischen Quelle RK-KF-YF-320 V1.0.0 vom acht Seiten. Die Quelltabelle nennt alle Chips/Kernelversionen und Android 12: historischer Umfang, keine aktuelle Kompatibilitätsgarantie. Nur chinesische Quelle, keine englischen Originalbilder. Keine Bitmaps oder technischen Tabellen; Commits, Patchbaum, Konfigurationen, API-Beispiele und Logs bleiben editierbar. Rechts-/Kontakt-, Zielgruppen-, Revisions- und doppelte Inhaltsangaben entfallen. Keine Beispiele, Patches oder Hardwaretests wurden ausgeführt.

Erhaltene Quellprobleme: Das Deckblattdatum liegt vor einigen Commits aus May 2022; Binärkommentare zu PRIMARY=57 und SPDIF_1=89 widersprechen den Dezimalwerten; frameworks/avmedia fehlt der übliche Pfadtrenner; „3.1“ hat keine zugehörige nummerierte Überschrift. Hashes, Codewerte und Daten werden nicht erraten. Aufrufreihenfolge, Kartenzuordnung und Pfaderklärung wurden aus grauen Codeflächen in übersetzten Text übernommen. Patchauszüge enthalten Quellumbrüche und sind nicht als direkt anwendbar validiert. MultiAudioTest und focusChangeHint = 3 ändern Routing/Fokus; für das Produkt prüfen, nicht als Serienstandard übernehmen.

Hintergrund

Android mischt gleichzeitig laufende AudioTrack-Streams standardmäßig. Auch bei mehreren Soundkarten gibt es keine fertige Schnittstelle zur gleichzeitigen getrennten Ausgabe; AudioPolicy wählt nach seiner vorgegebenen Regel die Karte mit höchster Priorität. Android definiert verschiedene Gerätetypen, unterscheidet im bestehenden Code aber nicht mehrere Karten desselben Typs, etwa HDMI. RK entwickelte MultiAudio zur besseren Nutzung der Soundkarten und Verbesserung der Bedienung.

RK MultiAudio

MultiAudio erkennt das Ein-/Ausstecken mehrerer HDMI-/DP-Verbindungen.

Funktionen: getrenntes PRIMARY/HDMI/SPDIF-Audio; getrennte Ausgänge HDMI_0/HDMI_1/…/HDMI_N und DP_0/DP_1/…/DP_N; Soundkartenauswahl für Fremdplayer über Paketnamen sowie über Java-Schnittstellen. Nach tatsächlichem Bedarf einsetzen.

Erforderlicher SDK-Code

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

Laut Quelle wurde der Code in das RK Android 12 SDK integriert. Code synchronisieren und das Vorhandensein der obigen Commits prüfen.

Patches

Falls eine Synchronisierung unpraktisch ist, die folgenden Patches in ihren jeweiligen Verzeichnissen anwenden.

➜  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

Build-Schalter

MultiAudio ist im SDK standardmäßig aktiv. Zum Deaktivieren BOARD_SUPPORT_MULTIAUDIO unter device/rockchip/common ändern.

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

Aufruf und Test

Die Soundkartenauswahl wird über AudioSessionId gesteuert:

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-Schnittstelle aufrufen

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

setAudioSessionId vor setDataSource aufrufen. Ausgangswahl: 57 = speaker, 65 = hdmi, 73 = dp, 81 = hdmi_1, 89 = dp_1.

Auswahl anhand des App-Paketnamens: Die Patches enthalten Testfälle. Zum Testen MultiAudioTest unter frameworks/av aktivieren.

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 und gallery3d sind vorinstalliert. Zusätzlich mxplayer und die App multi-display installieren; Installationspakete liegen im Patchpaket. Der Test bindet Apps an Karten: RockVideoPlayer gibt Videoton über hdmi, gallery3d über hdmi_1 und mxplayer über speaker aus. Gleichzeitige Wiedergabe ist möglich.

Die Quelle nennt als Implementierungspfad frameworks/avmedia/libaudioclient/AudioTrack.cpp. Den Code nach Bedarf anpassen.

#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

Mit multi-display Apps auf verschiedene Bildschirme verteilen. Folgende Property setzen, damit die Maus zwischen Bildschirmen wechseln und die Wiedergabe steuern kann.

setprop sys.mouse.presentation 1

Der Android-Audiofokus kann bei gleichzeitiger Videowiedergabe mehrerer Apps auf mehreren Bildschirmen Pausen auslösen. Dafür folgt ein Patch für 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.");

Fehlersuche

Soundkarten anzeigen

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

Treiber testen

Zum Prüfen von RK3588 hdmi0, auf den die Quelle als Abschnitt 3.1 verweist, eine WAV-Datei verwenden und Folgendes ausführen:

tinyplay xxx.wav -D 2 -d 0

Normale Tonausgabe zeigt, dass der hdmi0-Soundkartentreiber funktioniert.

Dieses Thema entdecken → · Lernpfade →