Menghubungkan perangkat input di AAOS

Anda dapat menggunakan mekanisme ini untuk memutar audio di Android:

Setiap mekanisme memungkinkan pemutaran audio dilakukan di Android. Untuk radio pemutaran atau pemutaran dari perangkat input, opsi ini mungkin tidak cukup, meskipun masing-masing dapat digabungkan dengan perekaman audio atau MediaRecorder untuk merekam audio terlebih dahulu, lalu memutarnya kembali dari Android. Untuk sistem aplikasi secara khusus, informasi berikut ini bisa digunakan untuk menghubungkan input ke sebuah {i>output mixer<i} di AAOS.

Pemutar HwAudioSource

HwAudioSource menghubungkan perangkat sumber audio langsung ke mixer Android.

Motivasi

Beberapa batasan mungkin timbul saat menggunakan audio hardware atau perangkat-ke-perangkat patch dengan Android. Setiap opsi tidak dapat menerima peristiwa tombol media seperti PLAY, PAUSE, dan STOP, serta karena keduanya mengakali audio Android , masing-masing memerlukan hardware untuk mencampur patch ke audio lain dari Android.

Menggunakan HwAudioSource

HwAudioSource adalah jenis pemutar baru yang didesain sebagai patch software. Ini memungkinkan aplikasi yang menggunakan pemutar ini untuk menerima peristiwa tombol media dan output streaming untuk digabungkan 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. Sebagai contoh, device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch mengharapkan permintaan untuk membuat patch audio dari perangkat ke {i>mixer<i}.

  • adev_open_input_stream mengharapkan audio_source menjadi AUDIO_SOURCE_FM_TUNER.

  • in_read mengisi buffer audio dengan data audio radio siaran.

Sebaiknya konfigurasi perangkat tuner dengan jenis AUDIO_DEVICE_IN_FM_TUNER dalam 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 input radio FM perangkat menggunakan AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS di bersama dengan AudioDeviceInfo.TYPE_FM_TUNER.

Membuat patch audio

Anda dapat membuat patch audio di antara dua port audio, baik port campuran port perangkat. Biasanya, {i>patch<i} audio dari porta campuran ke porta perangkat adalah untuk pemutaran sementara arah sebaliknya adalah untuk menangkap.

Misalnya, patch audio yang merutekan sampel audio dari sumber FM_TUNER secara langsung ke sink media akan melewati pencampur perangkat lunak. Anda kemudian harus menggunakan mixer hardware untuk mencampur sampel audio dari Android dan FM_TUNER untuk secara default. Saat membuat patch audio langsung dari sumber FM_TUNER ke media {i>sink<i}:

  • Kontrol volume berlaku untuk sink media dan akan memengaruhi kedua perangkat Android dan audio FM_TUNER.

  • Pengguna dapat beralih antara audio Android dan FM_TUNER melalui aplikasi sederhana tombol (tidak diperlukan pilihan sumber media eksplisit).

Implementasi otomotif mungkin juga perlu membuat patch audio antara dua port perangkat. Untuk melakukannya, Anda harus terlebih dahulu mendeklarasikan porta perangkat dan cara rute di audio_policy_configuration.xml, 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 di 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);
...
}

Penyetel radio

Saat membuat aplikasi radio, sebaiknya gunakan HwAudioSource karena menangani pembuatan patch serta sesi media untuk menangani kunci media peristiwa. Beberapa sumber audio dapat dibuat untuk sumber dan audio yang sama . Anda dapat memiliki sebuah SLO untuk penggunaan radio biasa serta sebuah yang kedua untuk pengumuman lalu lintas.

Jika merekam FM_TUNER, di Android 11, izin untuk melakukan diubah menjadi android.permission.CAPTURE_AUDIO_OUTPUT. Aplikasi tidak lagi melalui pemeriksaan izin OP_RECORD_AUDIO, yang berlaku ke mikrofon saja. Hal ini tidak akan memengaruhi aplikasi karena FM_TUNER sudah memerlukan izin SYSTEM_API untuk akses.

Lihat Menerapkan radio untuk mengetahui detail tentang membuat aplikasi radio.