Artikel ini menjelaskan alternatif untuk membuat pemutar.
HwAudioSource player
HwAudioSource menghubungkan perangkat sumber audio langsung ke mixer Android.
Beberapa batasan mungkin muncul saat menggunakan patch audio perangkat-ke-perangkat atau perangkat keras dengan Android. Ini tidak dapat menerima peristiwa kunci media seperti PLAY, PAUSE, dan STOP dan, karena mereka menghindari tumpukan audio Android, mereka memerlukan perangkat keras untuk mencampur tambalan ke audio lain dari Android.
Menggunakan HwAudioSource
HwAudioSource
adalah jenis pemutar baru yang dirancang sebagai tambalan perangkat lunak. Ini memungkinkan aplikasi yang menggunakan pemutar ini untuk menerima peristiwa kunci 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, ada beberapa harapan 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. Ini tidak memerlukan sesuatu yang istimewa. - Adev_open_input_stream mengharapkan audio_source menjadi
AUDIO_SOURCE_FM_TUNER
- In_read mengisi buffer audio dengan data audio radio siaran yang sebenarnya
Disarankan untuk mengkonfigurasi 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, menemukan perangkat input radio FM dapat difasilitasi dengan menggunakan AudioManager.getDevices( AudioManager.GET_DEVICES_INPUTS
) bersama dengan AudioDeviceInfo.TYPE_FM_TUNER
.
Membuat tambalan audio
Anda dapat membuat patch audio antara dua port audio, baik port campuran atau port perangkat. Biasanya, tambalan audio dari port campuran ke port perangkat adalah untuk pemutaran sedangkan arah sebaliknya untuk pengambilan.
Misalnya, tambalan audio yang merutekan sampel audio dari sumber FM_TUNER
langsung ke bak cuci media melewati pencampur perangkat lunak. Anda kemudian harus menggunakan mixer perangkat keras untuk mencampur sampel audio dari Android dan FM_TUNER
untuk wastafel. Saat membuat tambalan audio langsung dari sumber FM_TUNER
ke bak cuci media:
- Kontrol volume berlaku untuk bak cuci media dan akan memengaruhi audio Android dan
FM_TUNER
. - Pengguna harus dapat beralih antara audio Android dan
FM_TUNER
melalui sakelar aplikasi sederhana (tidak diperlukan pilihan sumber media yang eksplisit).
Implementasi otomotif mungkin juga perlu membuat patch audio di antara dua port perangkat. Untuk melakukannya, Anda harus terlebih dahulu mendeklarasikan port perangkat dan kemungkinan rute di audio_policy_configuration.xml
dan mengaitkan mixport dengan port perangkat ini.
Konfigurasi sampel
Lihat juga 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 dengan 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); ... }
Catatan: Kait API ini telah tersedia sejak AUDIO_DEVICE_API_VERSION_3_0
. Untuk detailnya, lihat device/generic/car/emulator/audio/driver/audio_hw.c
.