AAOS'de bir giriş cihazı bağlayın

Android'de ses çalmak için şu mekanizmaları kullanabilirsiniz:

Her mekanizma, Android'de ses çalmaya olanak tanır. Radyo için oynatma veya oynatma gibi işlemler için bu seçenekler yeterli olmayabilir. Her biri ses yakalama özelliğiyle birleştirilebilir veya MediaRecorder sınıfını kullanacak şekilde güncelleyin. Sistem için bir girişi bağlamak için aşağıdaki bilgiler kullanılabilir cihazı AAOS'deki bir çıkış mikserine bağlayabilirsiniz.

HwAudioSource çalar

HwAudioSource, ses kaynağı cihazını doğrudan bir Android karıştırıcıya bağlar.

Motivasyonlar

Cihazlar arası ses veya donanım sesi kullanırken çeşitli sınırlamalar ortaya çıkabilir. yama özelliğini kullanabilirsiniz. Her seçenek aşağıdakiler gibi medya önemli etkinliklerini alamaz: PLAY, PAUSE ve STOP. Bunlar Android'in sesini atlattıkları için her biri, yamanın Android'den gelen diğer seslerle karıştırılması için donanım gerektirir.

HwAudioSource'u kullan

HwAudioSource, yazılım yaması olarak tasarlanmış yeni bir oynatıcı türüdür. Bu Bu oynatıcıyı kullanan uygulamaların, medya önemli etkinliklerini ve çıktılarını almasını sağlar Android tarafından karıştırılacak ve yönlendirilecek.

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

Ses HAL'si ile ilgili değişiklikler

Bu yeni oynatıcıda, ses HAL'si için bu beklentileri göz önünde bulundurun. Örneğin, örnek, device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch, isteğin ses yaması oluşturmasını bekliyor bir cihazdan miksere dönüştürülebilir.

  • adev_open_input_stream, audio_source değerinin olmasını bekliyor AUDIO_SOURCE_FM_TUNER.

  • in_read, ses arabelleğini yayın radyo ses verileriyle doldurur.

AUDIO_DEVICE_IN_FM_TUNER türünde bir tarayıcı cihazı yapılandırmanızı öneririz audio_policy_configuration.xml içinde:

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

Bu cihaz yapılandırmasıyla FM radyo girişini kolayca bulabilirsiniz AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS kullanarak AudioDeviceInfo.TYPE_FM_TUNER ile bağlantılı.

Ses yamaları oluştur

Bir miks bağlantı noktası veya bir diğeri ise iki ses bağlantı noktası arasında bir ses yaması oluşturabilirsiniz cihaz bağlantı noktası. Genellikle, mix bağlantı noktasından cihaz bağlantı noktasına uygulanan bir ses yaması emin olun.

Örneğin, FM_TUNER kaynaktan ses örneklerini yönlendiren bir ses yaması atlar, yazılım karıştırıcıyı atlar. Daha sonra Android'den ses örneklerini karıştırmak üzere FM_TUNER ve lazım. Doğrudan FM_TUNER kaynağından medyaya ses yaması oluştururken havuz:

  • Ses düzeyi kontrolü medya havuzu için geçerlidir ve hem Android ve FM_TUNER ses.

  • Kullanıcılar basit bir uygulama aracılığıyla Android ile FM_TUNER ses arasında geçiş yapabilirler anahtarı (belirtilen medya kaynağı seçimi gerekmez).

Otomotiv uygulamalarının ayrıca, iki ses yaması arasında bir ses yaması oluşturması gerekebilir. cihaz bağlantı noktalarını görürsünüz. Bunu yapmak için önce cihaz bağlantı noktalarını tanımlamanız ve olası audio_policy_configuration.xml içindeki rotaları ilişkilendirin ve ardından mixport'ları cihaz bağlantı noktalarını görürsünüz.

Örnek yapılandırma

Bu örnek yapılandırmayı inceleyin. 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>

Ses sürücüsü API'sı

Kullanılabilir kaynakların listesini almak için getExternalSources() işlevini kullanabilirsiniz. (adresle tanımlanır) ardından, bu kaynaklar ve havuz bağlantı noktalarının bulunduğundan emin olun. Ses HAL'sinde ilgili giriş noktaları IDevice.hal içinde görünüyor:

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);
...
}

Radyo tarayıcısı

Radyo uygulaması oluştururken HwAudioSource kullanmanızı öneririz. medya anahtarını işlemek için hem yama oluşturmayı hem de bir medya oturumunu işler etkinlikler. Aynı kaynak ve ses için birden çok ses kaynağı oluşturulabilir özellikleri hakkında daha fazla bilgi edinin. Bunun yanı sıra düzenli radyo kullanımı için bir hesabınız ikincisi trafik duyurularıdır.

FM_TUNER kaydediliyorsa Android 11'de işlemi için izin android.permission.CAPTURE_AUDIO_OUTPUT olarak değiştirildi. İçerik artık geçerli olan OP_RECORD_AUDIO izin kontrolünden geçmez mikrofona takılır. FM_TUNER zaten bu işlemden etkilenmeyecektir erişim için SYSTEM_API izni gerektirir.

Ayrıntılı bilgi için Radyoyu uygulama bölümüne bakın bir radyo uygulaması oluşturmayı düşünmeliyim.