Anda dapat menggunakan mekanisme berikut 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 cukup, meskipun masing-masing opsi dapat digabungkan dengan pengambilan audio atau kelas MediaRecorder
untuk menangkap audio terlebih dahulu dan kemudian memutarnya dari Android. Khususnya 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 mungkin timbul saat menggunakan patch audio perangkat-ke-perangkat atau perangkat keras dengan Android. Setiap opsi tidak dapat menerima peristiwa penting media seperti PLAY , PAUSE , dan STOP dan, karena opsi tersebut menghindari tumpukan audio Android, masing-masing opsi memerlukan perangkat keras untuk menggabungkan patch ke audio lain dari Android.
Gunakan HwAudioSource
HwAudioSource
adalah tipe pemutar baru yang dirancang sebagai patch perangkat lunak. Hal ini memungkinkan aplikasi yang menggunakan pemutar ini menerima peristiwa penting media dan aliran keluaran untuk 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 audio HAL
Dengan pemutar baru ini, pertimbangkan ekspektasi ini untuk audio HAL. 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.
Kami menyarankan Anda mengonfigurasi perangkat tuner dengan tipe 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 pencarian perangkat input radio FM dengan menggunakan AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS
bersama dengan AudioDeviceInfo.TYPE_FM_TUNER
.
Buat tambalan audio
Anda dapat membuat patch audio antara dua port audio, baik port campuran atau port perangkat. Biasanya, patch audio dari port campuran ke port perangkat ditujukan untuk pemutaran sedangkan arah sebaliknya untuk pengambilan.
Misalnya, patch audio yang merutekan sampel audio dari sumber FM_TUNER
langsung ke media sink melewati mixer perangkat lunak. Anda kemudian harus menggunakan mixer perangkat keras untuk mencampur sampel audio dari Android dan FM_TUNER
untuk sink. Saat membuat patch audio langsung dari sumber FM_TUNER
ke media sink:
Kontrol volume berlaku untuk media sink dan akan memengaruhi audio Android dan
FM_TUNER
.Pengguna dapat beralih antara audio Android dan
FM_TUNER
melalui peralihan aplikasi sederhana (tidak diperlukan pilihan sumber media yang eksplisit).
Implementasi otomotif mungkin juga perlu membuat patch audio antara dua port perangkat. Untuk melakukannya, Anda harus terlebih dahulu mendeklarasikan port perangkat dan kemungkinan rute di audio_policy_configuration.xml
lalu mengaitkan mixports dengan port perangkat.
Konfigurasi sampel
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 masuk yang sesuai pada Audio HAL 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);
...
}
Penyetel radio
Saat membuat aplikasi radio, kami menyarankan Anda menggunakan HwAudioSource
karena aplikasi ini menangani pembuatan patch serta sesi media untuk menangani peristiwa penting media. Beberapa sumber audio dapat dibuat untuk sumber dan atribut audio yang sama. Dimungkinkan untuk memiliki satu untuk penggunaan radio reguler dan yang kedua untuk pengumuman lalu lintas.
Jika merekam FM_TUNER
, di Android 11 izin melakukannya diubah menjadi android.permission.CAPTURE_AUDIO_OUTPUT
. Ini tidak lagi melalui pemeriksaan izin OP_RECORD_AUDIO
, yang hanya berlaku untuk mikrofon. Hal ini seharusnya tidak berdampak pada aplikasi karena FM_TUNER
sudah memerlukan izin SYSTEM_API
untuk mengakses.
Lihat Menerapkan radio untuk mengetahui detail tentang membuat aplikasi radio.