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