Schließen Sie ein Eingabegerät in AAOS an

Sie können diese Mechanismen verwenden, um Audio in Android abzuspielen:

Jeder Mechanismus ermöglicht die Audiowiedergabe in Android. Für die Radiowiedergabe oder die Wiedergabe von Eingabegeräten reichen diese Optionen möglicherweise nicht aus, obwohl jede mit der Audioaufnahme oder der MediaRecorder Klasse gekoppelt werden könnte, um zuerst den Ton aufzunehmen und ihn dann von Android wiederzugeben. Insbesondere für System-Apps können die folgenden Informationen verwendet werden, um ein Eingabegerät mit einem Ausgabemixer in AAOS zu verbinden.

HwAudioSource-Player

HwAudioSource verbindet das Audioquellgerät direkt mit einem Android-Mixer.

Motivationen

Bei der Verwendung eines Gerät-zu-Gerät- oder Hardware-Audiopatches mit Android können verschiedene Einschränkungen auftreten. Jede Option ist nicht in der Lage, Medientastenereignisse wie PLAY , PAUSE und STOP zu empfangen, und da sie den Audio-Stack von Android umgehen, erfordert jede Option Hardware, um den Patch mit anderem Audio von Android zu mischen.

Verwenden Sie HwAudioSource

HwAudioSource ist ein neuer Player-Typ, der als Software-Patch konzipiert ist. Dies ermöglicht Apps, die diesen Player verwenden, Medienschlüsselereignisse zu empfangen und den Ausgabestream von Android zu mischen und weiterzuleiten.

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

Änderungen am Audio-HAL

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

  • adev_create_audio_patch erwartet, dass die Anfrage einen Audio-Patch von einem Gerät zu einem Mixer herstellt.

  • adev_open_input_stream erwartet, dass die audio_source AUDIO_SOURCE_FM_TUNER ist.

  • in_read füllt den Audiopuffer mit Rundfunk-Audiodaten.

Wir empfehlen Ihnen, ein Tuner-Gerät mit dem Typ AUDIO_DEVICE_IN_FM_TUNER in audio_policy_configuration.xml zu konfigurieren:

<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 das Auffinden des FM-Radio-Eingabegeräts erleichtern, indem Sie AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS in Verbindung mit AudioDeviceInfo.TYPE_FM_TUNER verwenden.

Erstellen Sie Audio-Patches

Sie können einen Audio-Patch zwischen zwei Audio-Ports erstellen, entweder einem Mix-Port oder einem Geräte-Port. Normalerweise dient ein Audio-Patch vom Mix-Port zum Geräte-Port der Wiedergabe, während die umgekehrte Richtung der Aufnahme dient.

Beispielsweise umgeht ein Audio-Patch, der Audio-Samples von der FM_TUNER Quelle direkt an die Mediensenke weiterleitet, den Software-Mixer. Anschließend müssen Sie einen Hardware-Mixer verwenden, um die Audio-Samples von Android und FM_TUNER für die Senke zu mischen. Beim Erstellen eines Audio-Patches direkt von der FM_TUNER Quelle zur Mediensenke:

  • Die Lautstärkeregelung gilt für die Mediensenke und sollte sich sowohl auf das Android- als auch auf FM_TUNER Audio auswirken.

  • Benutzer können durch einen einfachen App-Wechsel zwischen Android- und FM_TUNER Audio wechseln (es ist keine explizite Auswahl der Medienquelle erforderlich).

Automobilimplementierungen müssen möglicherweise auch einen Audio-Patch zwischen zwei Geräteanschlüssen erstellen. Dazu müssen Sie zunächst die Geräteports und möglichen Routen in audio_policy_configuration.xml deklarieren und dann Mixports den Geräteports zuordnen.

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>

Audiotreiber-API

Sie können getExternalSources() verwenden, um eine Liste der verfügbaren Quellen (identifiziert durch die Adresse) abzurufen und dann Audio-Patches zwischen diesen Quellen und den Senken-Ports nach Audioverwendungen zu erstellen. Die entsprechenden Einstiegspunkte auf der Audio-HAL erscheinen 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);
...
}

Radiotuner

Beim Erstellen einer Radio-App empfehlen wir die Verwendung von HwAudioSource , da diese sowohl die Erstellung des Patches als auch eine Mediensitzung zur Verarbeitung von Medientastenereignissen übernimmt. Für dieselbe Quelle und dieselben Audioattribute können mehrere Audioquellen erstellt werden. Es besteht die Möglichkeit, einen für den regulären Radiogebrauch sowie einen zweiten für Verkehrsmeldungen zu haben.

Beim Aufzeichnen von FM_TUNER wurde in Android 11 die Berechtigung zum Aufzeichnen in android.permission.CAPTURE_AUDIO_OUTPUT geändert. Es durchläuft nicht mehr die Berechtigungsprüfung OP_RECORD_AUDIO , die nur für Mikrofone gilt. Dies sollte keine Auswirkungen auf Apps haben, da FM_TUNER bereits die SYSTEM_API Berechtigung für den Zugriff benötigt.

Weitere Informationen zum Erstellen einer Radio-App finden Sie unter Implementieren von Radio .