Eingabegerät in AAOS verbinden

So können Sie Audioinhalte in Android wiedergeben:

Jeder Mechanismus ermöglicht die Audiowiedergabe in Android. Für Radio über Eingabegeräte wiedergeben, genügen diese Optionen möglicherweise nicht, wobei beide mit Audioaufnahme oder dem MediaRecorder um die Audiospur aufzunehmen und sie dann auf Android-Geräten wiederzugeben. Für System Apps können folgende Informationen verwendet werden, um einen Eingang anzuschließen. an einen Ausgabemixer in AAOS.

HwAudioSource-Player

HwAudioSource verbindet das Audioquellengerät direkt mit einem Android-Mischpult.

Motivation

Bei der Verwendung von Gerät-zu-Gerät- oder Hardware-Audio können verschiedene Einschränkungen auftreten. Patch mit Android. Keine der Optionen kann Medienschlüsselereignisse empfangen, z. B. WIEDERGEBEN, PAUSE und STOP und weil diese Audioinhalte von Android umgehen -Stacks, benötigen beide Hardware, um den Patch mit anderen Android-Audioinhalten zu mischen.

HwAudioSource verwenden

HwAudioSource ist ein neuer Player-Typ, der als Software-Patch entwickelt wurde. Dieses Ermöglicht Apps, die diesen Player verwenden, Medienschlüsselereignisse und die Ausgabe zu empfangen über Android geroutet und weitergeleitet.

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

Änderungen an der Audio-HAL

Berücksichtigen Sie bei diesem neuen Player diese Erwartungen an den Audio-HAL. Für Beispiel: device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch erwartet, dass die Anfrage einen Audiopatch erstellen wird von einem Gerät an einen Mixer.

  • adev_open_input_stream erwartet, dass die audio_source AUDIO_SOURCE_FM_TUNER

  • in_read füllt den Audiozwischenspeicher mit Audiodaten aus dem Radio.

Wir empfehlen, ein Tunergerät mit dem Typ AUDIO_DEVICE_IN_FM_TUNER zu konfigurieren in audio_policy_configuration.xml:

<devicePort
    tagName="Tuner_source"
    type="AUDIO_DEVICE_IN_FM_TUNER"
    role="source"
    address="tuner0">
    <profile
        name=""
        format="AUDIO_FORMAT_PCM_16_BIT"
        samplingRates="48000"
        channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</devicePort>

Mit dieser Gerätekonfiguration können Sie die Suche nach UKW-Radioeingang erleichtern mit dem AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS in zusammen mit AudioDeviceInfo.TYPE_FM_TUNER.

Audio-Patches erstellen

Sie können ein Audio-Patch zwischen zwei Audio-Ports erstellen, entweder einen Mix-Port oder einen Geräteport. Normalerweise dient ein Audio-Patch vom Mix-Port zum Geräte-Port für und umgekehrt.

Beispiel: ein Audiopatch, das Audiobeispiele aus der Quelle FM_TUNER weiterleitet direkt mit der Mediensenke verbunden, um den Softwaremixer zu umgehen. Sie müssen dann eine Hardwaremischpult zum Mischen der Audiobeispiele von Android und FM_TUNER für den Sinken. Wenn ein Audiopatch direkt von der FM_TUNER-Quelle zum Medium erstellt wird Senke:

  • Die Lautstärkeregelung gilt für die Mediensenke und sollte sowohl die und FM_TUNER Audio.

  • Nutzer können mit einer einfachen App zwischen Android- und FM_TUNER-Audio wechseln (keine explizite Auswahl der Medienquelle erforderlich).

Bei Automotive-Implementierungen muss eventuell auch ein Audiopatch zwischen zwei Geräteanschlüssen. Dazu müssen Sie zuerst die Geräteports und mögliche Routen in audio_policy_configuration.xml und verknüpfen dann Mixports mit den Geräteanschlüssen.

Beispielkonfiguration

Sehen Sie sich diese Beispielkonfiguration an, device/generic/car/emulator/audio/audio_policy_configuration.xml

<audioPolicyConfiguration>
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_media_out</item>
                <item>bus1_audio_patch_test_in</item>
            </attachedDevices>
            <mixPorts>
                <mixPort name="mixport_bus0_media_out" role="source"
                        flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
                <mixPort name="mixport_audio_patch_in" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                           samplingRates="48000"
                           channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS"
                        address="bus0_media_out">
                    <profile balance="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
                <devicePort tagName="bus1_audio_patch_test_in" type="AUDIO_DEVICE_IN_BUS" role="source"
                        address="bus1_audio_patch_test_in">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                    <gains>
                        <gain name="" mode="AUDIO_GAIN_MODE_JOINT"
                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/>
                    </gains>
                </devicePort>
            </devicePorts>
            <routes>
                <route type="mix" sink="bus0_media_out" sources="mixport_bus0_media_out,bus1_audio_patch_test_in"/>
                <route type="mix" sink="mixport_audio_patch_in" sources="bus1_audio_patch_test_in"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>

Audio-Treiber-API

Mit getExternalSources() kannst du eine Liste der verfügbaren Quellen abrufen (gekennzeichnet durch Adresse) und anschließend Audio-Patches zwischen diesen Quellen und dem Senkenports nach Audionutzung. Die entsprechenden Einstiegspunkte auf dem Audio-HAL Anzeige in IDevice.hal:

Interface IDevice {
...
/
*   Creates an audio patch between several source and sink ports.  The handle
*   is allocated by the HAL and must be unique for this audio HAL module.
*
*   @param sources patch sources.
*   @param sinks patch sinks.
*   @return retval operation completion status.
*   @return patch created patch handle.
*/
createAudioPatch(vec<AudioPortConfig> sources, vec<AudioPortConfig> sinks)
       generates (Result retval, AudioPatchHandle patch);

*   Release an audio patch.
*
*   @param patch patch handle.
*   @return retval operation completion status.
*/
releaseAudioPatch(AudioPatchHandle patch) generates (Result retval);
...
}

Radio-Tuner

Bei der Entwicklung einer Radio-App empfehlen wir dir, HwAudioSource zu verwenden, verarbeitet sowohl die Erstellung des Patches als auch eine Mediensitzung zur Verarbeitung von Medienschlüsseln. Ereignisse. Für dieselbe Quelle und dasselbe Audio können mehrere Audioquellen erstellt werden Attribute. Es ist möglich, einen für die normale Radionutzung sowie einen die zweite für Verkehrsmeldungen.

Wenn du FM_TUNER aufzeichnest, wird in Android 11 das Die Berechtigung für die Aktion wurde in android.permission.CAPTURE_AUDIO_OUTPUT geändert. Sie durchläuft nicht mehr die OP_RECORD_AUDIO-Berechtigungsprüfung, die angewendet wird nur auf Mikrofone. Das sollte keine Auswirkungen auf Apps haben, da FM_TUNER bereits benötigt die Berechtigung SYSTEM_API für den Zugriff.

Weitere Informationen finden Sie unter Radio implementieren der Entwicklung einer Radio-App.