AAOS'te giriş cihazı bağlama

Android'de ses çalmak için aşağıdaki mekanizmaları kullanabilirsiniz:

Her mekanizma, Android'de ses oynatılmasına olanak tanır. Radyo oynatma veya giriş cihazlarından oynatma için bu seçenekler yeterli olmayabilir. Ancak her biri, önce sesi yakalamak ve ardından Android'de oynatmak için ses yakalama veya MediaRecorder sınıfıyla birlikte kullanılabilir. Özellikle sistem uygulamaları için aşağıdaki bilgiler, bir giriş cihazını AAOS'teki bir çıkış mikserine bağlamak üzere kullanılabilir.

HwAudioSource player

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

Motivasyonlar

Android'de cihazdan cihaza veya donanım ses yaması kullanırken çeşitli sınırlamalarla karşılaşabilirsiniz. Her seçenek PLAY, PAUSE ve STOP gibi medya tuşu etkinliklerini alamaz. Ayrıca Android'in ses yığınını atladıkları için her birinin, yamayı Android'deki diğer seslerle karıştırmak üzere donanım gerektirmesi gerekir.

HwAudioSource'u kullanma

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ı etkinliklerini almasını ve çıkış akışının Android tarafından karıştırılıp yönlendirilmesini sağlar.

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

Ses HAL'sindeki değişiklikler

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

  • adev_create_audio_patch, bir cihazdan miksere ses yaması oluşturma isteğinde bulunulmasını bekler.

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

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

audio_policy_configuration.xml içinde 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 ve AudioDeviceInfo.TYPE_FM_TUNER simgelerini birlikte kullanarak FM radyo giriş cihazının bulunmasını kolaylaştırabilirsiniz.

Ses yamaları oluşturma

İki ses bağlantı noktası arasında ses yaması oluşturabilirsiniz. Bu bağlantı noktaları, miks bağlantı noktası veya cihaz bağlantı noktası olabilir. Genellikle, miks bağlantı noktasından cihaz bağlantı noktasına ses yaması oynatma için, ters yönde ise kayıt için kullanılır.

Örneğin, FM_TUNER kaynağından gelen ses örneklerini doğrudan medya alıcısına yönlendiren bir ses yaması, yazılım mikserini atlar. Ardından, Android'den gelen ses örneklerini karıştırmak ve sink için FM_TUNER kullanmak üzere bir donanım mikseri kullanmanız gerekir. Doğrudan FM_TUNER kaynağından medya havuzuna ses yaması oluştururken:

  • Ses kontrolü, medya alıcısı için geçerlidir ve hem Android hem de FM_TUNER sesini etkilemelidir.

  • Kullanıcılar, basit bir uygulama geçişiyle Android ve FM_TUNER ses arasında geçiş yapabilir (açık bir medya kaynağı seçimi yapılması gerekmez).

Otomotiv uygulamalarında iki cihaz bağlantı noktası arasında ses yaması oluşturulması da gerekebilir. Bunun için önce audio_policy_configuration.xml içinde cihaz bağlantı noktalarını ve olası rotaları tanımlamanız, ardından mixport'ları cihaz bağlantı noktalarıyla ilişkilendirmeniz gerekir.

Örnek yapılandırma

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

getExternalSources() kullanarak kullanılabilir kaynakların (adresle tanımlanır) listesini alabilir, ardından bu kaynaklar ile havuz bağlantı noktaları arasında ses kullanımlarına göre ses yamaları oluşturabilirsiniz. Ses HAL'sindeki ilgili giriş noktaları IDevice.hal içinde 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ı

Radyo uygulaması oluştururken, hem yama oluşturmayı hem de medya anahtarı etkinliklerini işlemek için medya oturumu oluşturmayı yönettiğinden HwAudioSource kullanmanızı öneririz. Aynı kaynak ve ses özellikleri için birden fazla ses kaynağı oluşturulabilir. Normal radyo kullanımı için bir tane, trafik duyuruları için de ikinci bir radyo olabilir.

FM_TUNER kaydı yapılıyorsa Android 11'de bu işlem için izin 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çmez. FM_TUNER, erişim için SYSTEM_API iznini gerektirdiğinden bu durum uygulamaları etkilemez.

Radyo uygulaması oluşturma hakkında ayrıntılı bilgi için Radyo uygulama başlıklı makaleyi inceleyin.