AAOS'te giriş cihazı bağlama

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

Her mekanizma, Android'de ses oynatılmasına olanak tanır. Radyo çalma veya giriş cihazlarından çalma 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 oynatıcısı

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 anahtarı 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 gerektirdiği de unutulmamalıdır.

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_DEVICE_IN_FM_TUNER türünde bir tuner cihazı audio_policy_configuration.xml ile 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ı (karıştırma bağlantı noktası veya cihaz bağlantı noktası) arasında ses yaması oluşturabilirsiniz. Genellikle, miks bağlantı noktasından cihaz bağlantı noktasına ses yaması oynatma, ters yönde ise yakalama içindir.

Örneğin, FM_TUNER kaynağından 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 ve FM_TUNER için sink'i karıştırmak üzere bir donanım mikseri kullanmanız gerekir. Doğrudan FM_TUNER kaynağından medya alıcısına 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ının iki cihaz bağlantı noktası arasında ses yaması oluşturması da gerekebilir. Bunu yapmak için önce audio_policy_configuration.xml içinde cihaz bağlantı noktalarını ve olası rotaları beyan etmeniz, 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 sink bağlantı noktaları arasında ses kullanımlarına göre ses yamaları oluşturabilirsiniz. Ses HAL'deki 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, yama oluşturmanın yanı sıra medya anahtarı etkinliklerini işlemek için medya oturumu oluşturmayı da sağladığından 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.