Anda dapat menggunakan mekanisme ini untuk memutar audio di Android:
Setiap mekanisme memungkinkan pemutaran audio dilakukan di Android. Untuk pemutaran
radio atau pemutaran dari perangkat input, opsi ini mungkin tidak memadai,
meskipun masing-masing dapat digabungkan dengan perekaman audio atau
class
MediaRecorder
untuk merekam audio terlebih dahulu, lalu memutarnya dari Android. Khusus untuk
aplikasi sistem, informasi berikut dapat digunakan untuk menghubungkan perangkat
input ke mixer output di AAOS.
Pemutar HwAudioSource
HwAudioSource
menghubungkan perangkat sumber audio langsung ke mixer Android.
Motivasi
Beberapa batasan dapat muncul saat menggunakan patch audio perangkat ke perangkat atau hardware dengan Android. Setiap opsi tidak dapat menerima peristiwa tombol media seperti PLAY, PAUSE, dan STOP dan, karena mengakali stack audio Android, setiap opsi memerlukan hardware untuk mencampur patch ke dalam audio lain dari Android.
Menggunakan HwAudioSource
HwAudioSource
adalah jenis pemain baru yang dirancang sebagai patch software. Hal ini
memungkinkan aplikasi yang menggunakan pemutar ini untuk menerima peristiwa tombol media dan streaming
output yang akan dicampur dan dirutekan oleh Android.
mHwAudioSource = new HwAudioSource.Builder()
.setAudioDeviceInfo(AudioDeviceInfo: info)
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.build();
mHwAudioSource.play();
mHwAudioSource.stop();
Perubahan pada HAL audio
Dengan pemutar baru ini, pertimbangkan ekspektasi berikut untuk HAL audio. Misalnya, device/generic/car/emulator/audio/driver/audio_hw.c
.
adev_create_audio_patch
mengharapkan permintaan untuk membuat patch audio dari perangkat ke mixer.adev_open_input_stream
mengharapkanaudio_source
menjadiAUDIO_SOURCE_FM_TUNER
.in_read
mengisi buffer audio dengan data audio radio siaran.
Sebaiknya konfigurasikan perangkat tuner dengan jenis AUDIO_DEVICE_IN_FM_TUNER
di 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>
Dengan konfigurasi perangkat ini, Anda dapat memfasilitasi penemuan perangkat input
radio FM menggunakan AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
bersama dengan AudioDeviceInfo.TYPE_FM_TUNER
.
Membuat patch audio
Anda dapat membuat patch audio antara dua port audio, baik port campuran maupun port perangkat. Biasanya, patch audio dari port mix ke port perangkat ditujukan untuk pemutaran, sedangkan arah sebaliknya ditujukan untuk perekaman.
Misalnya, patch audio yang merutekan sampel audio dari sumber FM_TUNER
langsung ke sink media akan mengabaikan mixer software. Kemudian, Anda harus menggunakan
mixer hardware untuk mencampur sampel audio dari Android dan FM_TUNER
untuk
sink. Saat membuat patch audio langsung dari sumber FM_TUNER
ke sink
media:
Kontrol volume berlaku untuk sink media dan akan memengaruhi audio Android dan
FM_TUNER
.Pengguna dapat beralih antara audio Android dan
FM_TUNER
melalui tombol aplikasi sederhana (tidak diperlukan pilihan sumber media eksplisit).
Implementasi otomotif mungkin juga perlu membuat patch audio antara dua
port perangkat. Untuk melakukannya, Anda harus mendeklarasikan port perangkat dan kemungkinan rute di audio_policy_configuration.xml
terlebih dahulu, lalu mengaitkan mixport dengan port perangkat.
Contoh konfigurasi
Lihat contoh konfigurasi ini,
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>
API driver audio
Anda dapat menggunakan getExternalSources()
untuk mengambil daftar sumber yang tersedia
(diidentifikasi berdasarkan alamat), lalu membuat patch audio antara sumber ini dan
port sink berdasarkan penggunaan audio. Titik entri yang sesuai di HAL Audio
muncul di 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);
...
}
Tuner radio
Saat mem-build aplikasi radio, sebaiknya gunakan HwAudioSource
karena
menangani pembuatan patch serta sesi media untuk menangani peristiwa
kunci media. Beberapa sumber audio dapat dibuat untuk sumber dan atribut
audio yang sama. Anda dapat memiliki satu untuk penggunaan radio reguler dan
satu lagi untuk pengumuman lalu lintas.
Jika merekam FM_TUNER
, di Android 11,
izin untuk melakukannya diubah menjadi android.permission.CAPTURE_AUDIO_OUTPUT
.
Aplikasi tidak lagi melalui pemeriksaan izin OP_RECORD_AUDIO
, yang hanya berlaku
untuk mikrofon. Hal ini tidak akan memengaruhi aplikasi karena FM_TUNER
sudah
memerlukan izin SYSTEM_API
untuk akses.
Lihat Menerapkan radio untuk mengetahui detail tentang mem-build aplikasi radio.