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 dieaudio_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 .