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

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

Her mekanizma, Android'de ses oynatımının gerçekleştirilmesine izin verir. Giriş aygıtlarından radyo oynatmak veya oynatmak için bu seçenekler yeterli olmayabilir, ancak her biri önce sesi yakalamak ve ardından Android'den oynatmak için ses yakalama veya MediaRecorder sınıfıyla birleştirilebilir. Özellikle sistem uygulamaları için, bir giriş cihazını AAOS'taki bir çıkış mikserine bağlamak için aşağıdaki bilgiler kullanılabilir.

HwAudioSource oynatıcı

HwAudioSource ses kaynağı cihazını doğrudan bir Android mikserine bağlar.

Motivasyonlar

Android ile cihazdan cihaza veya donanım ses yamasını kullanırken çeşitli sınırlamalar ortaya çıkabilir. Her seçenek OYNAT , DURAKLAT ve DURDUR gibi medya anahtarı olaylarını alamaz ve Android'in ses yığınını atlattıklarından her biri, yamayı Android'deki diğer seslerle karıştırmak için donanım gerektirir.

HwAudioSource'u kullanın

HwAudioSource , yazılım yaması olarak tasarlanmış yeni bir oynatıcı türüdür. Bu, bu oynatıcıyı kullanan uygulamaların medya anahtarı olaylarını almasına ve çıkış akışının Android tarafından karıştırılıp yönlendirilmesine olanak tanır.

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

Ses HAL'indeki değişiklikler

Bu yeni oynatıcıyla ses HAL'ine ilişkin bu beklentileri göz önünde bulundurun. Örneğin, device/generic/car/emulator/audio/driver/audio_hw.c .

  • adev_create_audio_patch isteğin bir cihazdan miksere bir ses yaması oluşturmasını bekler.

  • adev_open_input_stream audio_source AUDIO_SOURCE_FM_TUNER olmasını bekler.

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

audio_policy_configuration.xml dosyasında AUDIO_DEVICE_IN_FM_TUNER türünde bir tuner cihazı yapılandırmanızı öneririz:

<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, AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS öğesini AudioDeviceInfo.TYPE_FM_TUNER ile birlikte kullanarak FM radyo giriş cihazını bulmayı kolaylaştırabilirsiniz.

Ses yamaları oluşturun

Karıştırma bağlantı noktası veya aygıt bağlantı noktası olmak üzere iki ses bağlantı noktası arasında bir ses yaması oluşturabilirsiniz. Tipik olarak, karıştırma bağlantı noktasından cihaz bağlantı noktasına bir ses yaması oynatma içindir, ters yön ise yakalama içindir.

Örneğin, ses örneklerini FM_TUNER kaynağından doğrudan medya havuzuna yönlendiren bir ses yaması, yazılım karıştırıcısını atlar. Daha sonra havuz için Android ve FM_TUNER gelen ses örneklerini karıştırmak için bir donanım karıştırıcısı kullanmalısınız. Doğrudan FM_TUNER kaynağından ortam havuzuna bir ses yaması oluştururken:

  • Ses seviyesi kontrolü medya havuzu için geçerlidir ve hem Android hem de FM_TUNER sesini etkilemelidir.

  • Kullanıcılar, basit bir uygulama geçişi aracılığıyla Android ve FM_TUNER ses arasında geçiş yapabilir (açık bir medya kaynağı seçimine gerek yoktur).

Otomotiv uygulamalarının iki cihaz bağlantı noktası arasında bir ses yaması oluşturması da gerekebilir. Bunu yapmak için öncelikle audio_policy_configuration.xml dosyasında cihaz bağlantı noktalarını ve olası rotaları bildirmeniz ve ardından mixport'ları cihaz bağlantı noktalarıyla ilişkilendirmeniz gerekir.

Örnek konfigürasyon

Bu örnek yapılandırmaya bakın, 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'si

Kullanılabilir kaynakların (adresle tanımlanan) bir listesini almak için getExternalSources() işlevini kullanabilir, ardından ses kullanımlarına göre bu kaynaklar ile havuz bağlantı noktaları arasında ses yamaları oluşturabilirsiniz. Audio HAL'deki ilgili giriş noktaları IDevice.hal görünür:

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 alıcısı

Bir radyo uygulaması oluştururken, HwAudioSource kullanmanızı öneririz çünkü hem yamayı oluşturmayı hem de medya anahtarı olaylarını yönetmek için bir medya oturumunu yönetir. Aynı kaynak ve ses özellikleri için birden fazla ses kaynağı oluşturulabilir. Bir tanesini normal radyo kullanımı için, diğerini ise trafik duyuruları için kullanmak mümkündür.

FM_TUNER kaydediliyorsa, Android 11'de yapma izni android.permission.CAPTURE_AUDIO_OUTPUT olarak değiştirildi. Artık yalnızca mikrofonlar için geçerli olan OP_RECORD_AUDIO izin kontrolünden geçmiyor. FM_TUNER erişim için zaten SYSTEM_API izni gerektirdiğinden bu durum uygulamaları etkilememelidir.

Radyo uygulaması oluşturmayla ilgili ayrıntılar için Radyo uygulama konusuna bakın.